字典树学习笔记
作者:互联网
字典树
算法简介
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。
典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
by 百度百科
算法结构
以
aaaa
aaab
abab
abba
abbb
为例构建出的字典树
性质
- 根节点为空。
- 从根开始的链都是其中某些字符串的前缀。
- 标记所有字符串的最后一位节点的 \(\texttt{cnt}\) 为该字符串的个数。进行回溯统计后,对于任意一个节点,它的 \(\texttt{cnt}\) 为有该前缀的字符串的个数。
作用
- 统计字符串的前(后)缀个数。
- 判断字符串是否存在(类似于字符串哈希作用)。
- 计算字符串最长公共前缀。
- 将字符串排序。
基本代码
struct Trie{
int num;
struct trie{int cnt=0,v[63];}E;
vector<trie>t;
void init(){num=0;t.push_back(E);}
int change(char ch){
if('a'<=ch&&ch<='z')return ch-'a'+00;
if('A'<=ch&&ch<='Z')return ch-'A'+26;
if('0'<=ch&&ch<='9')return ch-'0'+52;
}
void insert(string s,int node){
if(!s.size()){t[node].cnt++;return;}int ret=t[node].v[change(s[0])];
if(!ret)t[node].v[change(s[0])]=++num,t.push_back(E),t[num].cnt=0;
s.erase(s.begin());insert(s,ret?ret:num);
}
void dfs(int u){
for(int i=0;i<63;i++){if(t[u].v[i]){dfs(t[u].v[i]);t[u].cnt+=t[t[u].v[i]].cnt;}}
}
int quary(string s,int node){
if(!s.size()){return t[node].cnt;}int ret=t[node].v[change(s[0])];
if(!ret)return 0;s.erase(s.begin());return quary(s,ret);
}
};
标签:cnt,前缀,int,笔记,学习,哈希,字符串,字典 来源: https://www.cnblogs.com/qzccy/p/Trie.html