字典树(Trie),又叫前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。Trie键由结点在树中的位置决定。每个结点的所有子孙都有相同的前缀,即该节点对应的字符串,根结点对应空字符串。一般情况下,并不是所有的结点都有对应的值,只有叶子节点和部分内部结点所对应的键才有相关的值。
如果我们有and,as,at,cn,com这些单词,对应的trie如下:
Trie使用范围
(1)词频统计。
trie树可以用来压缩空间,因为公共前缀都用一个节点保存。
(2)前缀匹配。
拿上图为例,如果想获取所有以‘a’开头的字符串,从图中可以很明显地看出是and,as,at。如果用最朴素的方法,时间复杂度将会是O(n^2)。Trie树的时间复杂度为O(h),其中为h为检索单词的长度。
定义
字母共计26个,因此构建的trie树是一个26叉树结构,每个结点包含26个子节点。
// Trie树节点定义
struct TrieNode {
TrieNode *child[26];
string str;
TrieNode() : str("") {
for (auto &a : child) a = NULL;
}
};
//Trie定义
struct Trie {
TrieNode *root;
Trie() : root(new TrieNode()) {}
void insert(string s) {
TrieNode *p = root;
for (auto &a : s) {
int i = a - 'a';
if (!p->child[i]) p->child[i] = new TrieNode();
p = p->child[i];
}
p->str = s;
}
};
参考:
[1] http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html
[2] https://zh.wikipedia.org/wiki/Trie