• 前缀树


    一.前缀树描述

       前缀树(Trie树),类似于一种多叉树的数据结构,每一个节点存储字符串的一个字符,多个节点组合起来形成一个完整的字符串。前缀树有三个特点:

    • 根节点不包含字符串,除了根节点,其他节点都只包含一个字符;
    • 每个节点的所有子节点包含的字符都不相同;
    • 从根节点到某个子节点,节点的字符连接起来形成一个字符串;
    • 每个节点的子节点拥有相同的前缀。  

    二.前缀树结构

    2.1 前缀树的结构如下

                      图 2.1

    • 如上图,是一个简单的前缀树结构,其包含了六个字符串:

                

    • 如需查找“中国人”,只需要依次判断当前节点是否包含每个字符即可,不需要遍历每个字符串是否与查找的字符串相等。

    2.2 前缀树的实现

    • 前缀树可以实现最基本增加,删除和搜索功能,但一般只会用到增加和搜索;
    • 如图 2.1,每个节点可能有0个或1个或多个子节点和一个字符(除跟节点),则可以使用Map存储节点信息,key为当前节点的字符,value是当前节点的子节点,如下:
          public int endCount;
          public Map<Character, TrieNode> children;
          public TrieNode() {
              endCount = 0;
              children = new ConcurrentHashMap<>();
          }
      

        代码中的 endCount 表示以当前节点为结尾的字符串的个数,示例代码参考:前缀树

    • 除了Map,也可以使用数组来实现,数组表示当前节点的子节点,如果是字符串查找,数组大小为26,刚好满足所有的需求。

    三.前缀树的效率

    3.1 复杂度

    • 时间复杂度

        由于trie树结构中使用的HashMap,而Map的时间复杂度可能是 O(1)、O(logn)、O(n),则trie的时间复杂度同map。

    • 空间复杂度

        由于查找过程中没有使用额外的空间,故,空间复杂度为O(1)。

    四.前缀树应用场景

    • 字符串的快速检索
    • 最长公共前缀
    • 字符串排序

    作者: 程序员简笔

    CSDN: 程序员简笔

    github: mslzyj

    公众号: 程序员简笔

    关于作者: Java开发,文中有不正确的地方,望指正!

    版权说明: 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 ,如有问题,请在下方评论说明.

  • 相关阅读:
    UVA 11021繁衍模型+概率计算
    LA 5059博弈+SG函数
    LA 3942 字典树
    Beat---hdu2614
    Wooden Sticks---hdu1051(最长上升子序列)
    欧拉函数基础
    1370
    钱币兑换问题---hdu1284(完全背包)
    Drainage Ditches--hdu1532(网络流 模板)
    Fibonacci--poj3070(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/xyzyj/p/14855585.html
Copyright © 2020-2023  润新知