字典树学习笔记
参考博客https://blog.csdn.net/JKdd123456/article/details/84071856
字典树
是一种用于统计字符串、文本词频统计的入门级的数据结构。
基本性质
(1)根节点不包括字符,除根节点外每一个节点都只包含一个字符。
(2)用边表示字母
(3)从根节点到某一节点,路径上经过的字符连起来,为该节点对应的字符串。
(4)每个节点的所有子节点包含的字符都不相同,每个节点最多有26个子节点(在单词只包含小写字母的情况下)
(5)有相同前缀的单词公用前缀节点。
(6)整棵树的根节点是空的,便于插入和查找。
(7)每个单词结束时用一个特殊字符表示,那么从根节点到任意一个特殊字符,所经过的边的所有字母表示一个单词。
基本操作
插入:
从左到右扫描这个单词,如果字母在相应的根节点下没有出现过,就插入这个字母。
我们设Trie(i)(j)=k,表示编号为i的节点的第j个孩子为编号为k的节点。
可以写出插入的代码:
void insert (string s) { int root=0; for (int i=0;i<s.length();i++) { int id=s[i]-'a'; if (!Trie[root][id]) Trie[root][id]=++tot; root=Trie[root][id]; } }
可以查找某个前缀,也可以查找整个单词。
bool find (string s) { int root=0; for (int i=0;i<s.length();i++) { int x=s[i]-'0'; if (Trie[root][x]==0) return false; root=Trie[root][x]; } return true; }
还可以用Trie树给字符串排序,将每个字符串依次插入到Trie树中,做先序遍历,可以得到字符串从小到大的顺序,消耗空间较大,但时间复杂度可以降至O(N)。