zoukankan      html  css  js  c++  java
  • 字典树学习笔记

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

  • 相关阅读:
    android_自定义布局
    二叉树_学习笔记
    栈的应用-四则表达式(C#代码实现)
    Android Fragment 生命周期
    Android Fragment之间传值
    Android ArrayAdpater 填充集合
    任务和返回栈
    XML Drawable与9-Patches
    《python语言程序设计》_第一章编程题
    CSS-文本超出部分省略号
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13213790.html
Copyright © 2011-2022 走看看