Tire树(字典树-字符串快速查找)
前言
一、Tire树是什么?
二、怎么建立tire树
1.字符串插入Tire树入
2.查找字符串
总结
前言:
最近是在复习基础算法,正好复习到了数据结构,所以写了自己对Tire树的理解,数据结构对我们即将找工作的人还是很重要的,所以记录一下。(该题是我在AC-wing的基础课学习的)。
一、Tire树是什么?
Tire树又称字典树或前缀树,是一种能够快速查找一组字符串含有一个字符串的类似哈希表的树结构,是以空间换时间,利用字符串的前缀来降低查询时间。
与二叉树不同,Tire树有26子节点对应26个字母,根节点不包含字符串,从根节点到某个节点,经过的字符连起来的字符串就是对应的字符串。当储存结束一个字符串后,尾节点会用cnt[ ]数组来说明该字符串的次数。
二、怎么建立Tire树
1.字符串插入tire树
开始先定义 : int son[N][26], cnt[N], idx;
son[N][26]:储存子节点的位置,分支最多26条
cnt[N]:存储以节点结尾的字符串个数
idx:表示当前要插入的节点(新建节点)
代码如下(示例):
void insert(string str){int p = 0;//类似指针指向当前节点for(int i = 0; i < str.size(); i ++){int u = str[i] - 'a'; //当前节点是什么字符if(!son[p][u]) son[p][u] = ++ idx;//如果节点不存在就新建节点p = son[p][u]; //p 指向新建的节点}cnt[p] ++;//尾节点的字符数量加1
}
这样是不是有点难理解,我也这样觉得,所以我画个图
来帮助大家理解Trie树的建立
图解:
2.查找字符串:
代码如下(示例):
int query(char *str)
{int p = 0;for(int i = 0; str[i]; i++){int u = str[i] - 'a';if(!son[p][u]) return 0; //该节点不存在,即该字符串不存在p = son[p][u]; }return cnt[p]; //返回字符串出现的次数
}
完整代码:
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int son[N][26], cnt[N], idx, n;
void insert(string str){int p = 0;for(int i = 0; i < str.size(); i ++){int u = str[i] - 'a';if(!son[p][u]) son[p][u] = ++ idx;p = son[p][u];}cnt[p] ++;
}
int query(string str){int p = 0;for(int i = 0; i < str.size(); i ++){int u = str[i] - 'a';if(!son[p][u]) return 0;p = son[p][u];}return cnt[p];
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;while(n --){string op, str;cin >> op >> str;if(op == "I") insert(str);else cout << query(str) << endl;}return 0;
}
总结:
以上就是今天要讲的内容,本文仅仅简单介绍了自己对Tire的理解,而Tire还有很多实际利用。例如:最大异或值可以建立Tire树(二进制)来求解。
最大异或值的题目来源:https://www.acwing.com/problem/content/145/
大家可以去写一下来帮助自己更好的理解。
Tire树(字典树-字符串快速查找)相关推荐
- Algorithm:树结构(二叉树/多路查找树/字典树)的简介、具体结构(FBT/CBT/BST/BBT/Heap/Huffman、B树/B+树/R树、字典树)及其运算(增删查/遍历/旋转)、代码实现
Algorithm:树结构(二叉树/多路查找树/字典树)的简介.具体结构(FBT/CBT/BST/BBT/Heap/Huffman.B树/B+树/R树.字典树)及其运算(增删查/遍历/旋转).代码实现 ...
- HDU - 5790 Prefix(主席树+字典树)
题目链接:点击查看 题目大意:给出 n 个字符串,再给出 m 次询问,每次询问需要输出区间 [ l , r ] 内的所有字符串有多少个不同的前缀,要求算法强制在线 题目分析:统计字符串的前缀,不难想到 ...
- C++Rabin Karp算法字符串快速查找(附完整源码)
C++Rabin Karp算法字符串快速查找 C++Rabin Karp算法字符串快速查找完整源码(定义,实现,main函数测试) C++Rabin Karp算法字符串快速查找完整源码(定义,实现,m ...
- Rabin-Karp 算法(字符串快速查找)
Rabin-Karp 算法(字符串快速查找) 算法 代码 算法 Go 语言的 strings 包(strings.go)中用到了 Rabin-Karp 算法.Rabin-Karp 算法是基于这样的思路 ...
- Trie(前缀树/字典树)及其应用
from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...
- 【数据结构】前缀树/字典树
目录 1.概述 2.代码实现 3.应用 本文参考: LeetCode 208.实现 Trie (前缀树) 1.概述 前缀树又称字典树.Trie 树.单词查找树,是一棵有根树,同时也是一种哈希树的变种, ...
- Luogu P2580 于是他错误的点名开始了 Trie树 字典树
字典树裸题.每次插入询问串,查询的时候拿出来直接查,信息保留在节点上. #include <bits/stdc++.h> using namespace std;char s[51]; i ...
- 基于Tire树(字典树)与倒排索引实现文本词频统计工具
文章目录 文件读写操作 C风格文件读取 C++风格按行读取 C++风格按单词读取 实现文件词频统计工具 英文文章单词的正确分割 基于Trie树实现文件词频统计 基于Trie树实现带倒排索引的文件词频统 ...
- java字符串表表容量_java – 我可以使用什么符号表来存储~50 mil的字符串,快速查找而不会耗尽堆空间?...
我有一个约5000万字符串的文件,我需要在启动时添加到某种符号表中,然后以合理的速度搜索几次. 我尝试使用DLB trie,因为查找会相对较快,因为所有字符串都是< 10个字符,但在填充DLB时 ...
最新文章
- Eclipse基金会发布Eclipse Photon IDE
- 谈计算机知识对学生的作用,浅谈计算机在教学中的作用
- 吴恩达深度学习 —— 3.2 神经网络表示
- Spring Security OAuth2.0_实现分布式认证授权_扩展用户信息_Spring Security OAuth2.0认证授权---springcloud工作笔记156
- 【java笔记】模拟B/S服务器
- Mybatis-01-简介及入门
- 记录一次常见的错误:java.sql.SQLException: Got error 28 from storage engine
- 操作系统实验 文件复制/复制文件
- 字母冒泡法排序c语言,C语言冒泡排序法的实现(升序排序法)
- 查看tomcat端口号
- datax(24):远程调试datax
- 带农历的html日历插件,魔镜日历插件-可生成带农历的日历月历年历-CDR插件
- RSA加密 - Java
- kcl计算机科学与技术研究生,KCL的Data Science「伦敦大学国王学院数据科学理学硕士」...
- xml使用外部DTD加载验证
- html设置点击变换图标,【css】css实现点击Toggle功能/icon切换
- 下一代 Web 应用模型 —— Progressive Web App
- 最有可能成为第五个一线城市,苏州 or 杭州?
- NVIDIA jetson tensorrt加速yolov5摄像头检测
- linux命令对两个文件求差集、交集、并集
热门文章
- 2019-01-23 寒假作业(一)
- 视觉媒体通信作业记录(一) 简易yuv420视频播放器
- 拥抱物联网 开启智慧医疗新时代 一文带你了解“2019第四届中国(上海)国际人工智能展览会”
- 风投们进入区块链领域的正确姿势(知识)
- 1小时就可以让你的视频播放量翻十倍,靠的就是赛马机制
- 林晓炜 网站交易系统 c语言,2011级C语言程序设计期末考试安排-发布.doc
- 百年老照片修复算法,那些高颜值的父母!
- Vue el-card去除边框——记录一种询问度娘之外的方法
- 用 Qt 控制 Nikon 显微镜的电动物镜转盘
- 如何理解SOP(Start Of Production)的深层意义