字典树学习笔记

参考博客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)。

原文地址:https://www.cnblogs.com/zhanglichen/p/13213790.html