一、Trie(字典树)概念
Trie(字典树)是一种用于实现字符串快速检索的多叉树结构。Trie 的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符 c,就沿着当前节点的c字符指针,走向该指针指向的节点。
二、Trie的实现原理
在一棵空Trie上插入相应的字符串,字符数据都体现在数的边(指针)上, 树的节点进保存了一些额外信息,比如字符串的结尾。该算法的时间复杂度为O(NC),其中N是节点个数,C是字符集的大小。 然后我们将Trie树存入Trie[SIZE][N]数组中,SIZE表示当前字符串的位置(节点),也可以看作深度,N是当前节点的度,也就是当前节点的孩子个数。在Trie数组声明时,要按照存储的字符串类型进行存储。例如:
存十进制数组:N = 10,表示每个节点最多有10个孩子,分别是0 - 10;
存字符串:N = 26, 表示每个节点最多有26个孩子,分别是 a - z;
同时, 当我们存字符串时,我们可以按照将字母转换为ASCII码进行存储。
三、Trie的C++实现方式
int Trie[SIZE][26], tot = 1; //初始化,假设字符串由小写字母构成
void insert(string s) {
int p = 1;
for(int k = 0; k < s.size(); k ++ ){
int ch = s[k] - 'a';
if (Trie[p][ch] == 0) Trie[p][ch] = ++tot;
p = Trie[p][ch];
}
end[p] = true;
}
bool search(string s) {
int p = 1;
for(int k = 0; k < s.size(); k ++ ) {
p = Trie[p][s[i] - 'a'];
if(p == 0) return false;
}
return end[p];
}
四、关于Trie的练习例题
-
1、AcWing 142. 前缀统计(Trie)(简单)
题目链接:https://www.acwing.com/problem/content/144/
题解链接:AcWing 142. 前缀统计 -
2、AcWing 143. 最大异或对(Trie、贪心)(简单)
题目链接:https://www.acwing.com/problem/content/145/
题解链接:AcWing 143. 最大异或对 -
3、AcWing 144. 最长异或值路径(Trie、树上差分、贪心)(中等)
题目链接:https://www.acwing.com/problem/content/146/
题解链接:AcWing 144. 最长异或值路径