• 字典树学习笔记


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

  • 相关阅读:
    C++中的指针和数组
    windows系统下JDK1.6环境变量配置
    Java Reflection (JAVA反射)
    转载:cin深入分析(下) – cin的错误处理
    OpenGL总结
    OpenGL纹理
    c/C++内存分配
    转载:cin深入分析(上) – cin输入操作处理
    c++中string的用法
    OpenGL颜色
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13213790.html
Copyright © 2020-2023  润新知