参考网址:https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy

  1. 概述
    前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。
    典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高
    Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
    Trie树也有它的缺点,Trie树的内存消耗非常大。
    性质:不同字符串的相同前缀只保存一份。
    操作:查找,插入,删除。
    举个栗子:给出一组单词,inn, int, ate, age, adv,ant, 我们可以得到下面的Trie:

    从上面可以发现一些Trie树的特性:
    1)根节点不包含字符,除根节点外的每一个子节点都包含一个字符。
    2)从根节点到某一节点的路径上的字符连接起来,就是该节点对应的字符串。
    3)每个节点的所有子节点包含的字符都不相同。
    4)每条边对应一个字母。每个节点对应一项前缀。叶节点对应最长前缀,即单词本身。
    单词inn与单词int有共同的前缀“in”, 因此他们共享左边的一条分支,root->i->in。同理,ate, age, adv, 和ant共享前缀"a",所以他们共享从根节点到节点"a"的边。
    查询操纵非常简单。比如要查找int,顺着路径i -> in -> int就找到了。
    搭建Trie的基本算法也很简单,无非是逐一把每则单词的每个字母插入Trie。插入前先看前缀是否存在。如果存在,就共享,否则创建对应的节点和边。比如要插入单词add,就有下面几步:
    考察前缀"a",发现边a已经存在。于是顺着边a走到节点a。
    考察剩下的字符串"dd"的前缀"d",发现从节点a出发,已经有边d存在。于是顺着边d走到节点ad。
    考察最后一个字符"d",这下从节点ad出发没有边d了,于是创建节点ad的子节点add,并把边ad->add标记为d。
  2. 应用
    前缀树还是很好理解,它的应用也是非常广的。
    (1)字符串的快速检索
    字典树的查询时间复杂度是O(logL)O(logL)O(logL),L是字符串的长度。所以效率还是比较高的。字典树的效率比hash表高。
    hash表:
    通过hash函数把所有的单词分别hash成key值,查询的时候直接通过hash函数即可,都知道hash表的效率是非常高的为O(1),当然这是对于如果我们hash函数选取的好,计算量少,且冲突少,那单词查询速度肯定是非常快的。那如果hash函数的计算量相对大呢,且冲突律高呢?这些都是要考虑的因素。
    还有就是hash表不支持动态查询,什么叫动态查询,当我们要查询单词apple时,hash表必须等待用户把单词apple输入完毕才能hash查询。当你输入到appl时肯定不可能hash吧。
    字典树(trie树):
    对于单词查询这种,还是用字典树比较好,但也是有前提的,空间大小允许,字典树的空间相比较hash还是比较浪费的,毕竟hash可以用bit数组。
    (2)字符串排序
    从上图我们很容易看出单词是排序的,先遍历字母序在前面。减少了没必要的公共子串。
    (3)最长公共前缀
    inn和int的最长公共前缀是in,遍历字典树到字母n时,此时这些单词的公共前缀是in。
    (4)自动匹配前缀显示后缀
    我们使用辞典或者是搜索引擎的时候,输入appl,后面会自动显示一堆前缀是appl的东东吧。
    那么有可能是通过字典树实现的,前面也说了字典树可以找到公共前缀,我们只需要把剩余的后缀遍历显示出来即可。

前缀树(字典树,单词查找树,Trie树)相关推荐

  1. LeetCode 425. 单词方块(Trie树+DFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词集合 (没有重复),找出其中所有的 单词方块 . 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < ...

  2. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

  3. 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找

    千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...

  4. 海量路由表可以使用HASH表存储吗-HASH查找和TRIE树查找

    千万别!很多人这样说,也包括我. Linux内核早就把HASH路由表去掉了,现在就只剩下TRIE了,不过我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix hash和 ...

  5. LeetCode 527. 单词缩写(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写. 初始缩写由起始字母+省略字母的数量+结尾字母组成. 若存在冲突,亦 ...

  6. LeetCode 648. 单词替换(Trie树)

    1. 题目 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other(其他), ...

  7. 数据结构八-Trie树

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 Trie树的使用场景 搜索引擎中的搜索词建议.当你在搜索引擎中输入词,搜索引擎提示给你一个词的列表, ...

  8. java单词匹配算法_前端学数据结构与算法(八): 单词前缀匹配神器-Trie树的实现及其应用...

    前言 继二叉树.堆之后,接下来介绍另外一种树型的数据结构-Trie树,也可以叫它前缀树.字典树.例如我们再搜索引擎里输入几个关键字之后,后续的内容会自动续上.此时我们输入的关键词也就是前缀,而后面的就 ...

  9. python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词...

    #coding=utf-8 #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(1). ''' Python 字典 setdefault ...

  10. c语言 trie树,C语言实现Trie树(字典树)的插入查找删除与遍历操作

    Trie树,也称作是字典树,是一种哈希树的变种,查询效率较高.Trie树可以用于统计或者排序大量的字符串,比如对一系列字符串按照字典序排序. 字典树是一个多叉树,每一个节点上存储的不是一个字符串,而是 ...

最新文章

  1. 一脸懵逼学习hadoop之HDFS的java客户端编写
  2. 2019.3.18 异常处理和日志相关
  3. LeetCode 102二叉树的层序遍历103二叉树锯齿形遍历104二叉树的最大深度
  4. 使C#代码现代化——第三部分:值
  5. Sql 列转行 三种方法对比
  6. Ulipad快捷键大总结
  7. steam新授权软件_「西米软件推荐」桌面乱七八糟的人,请认真看完
  8. php调用redis的scan,hscan,zscan 命令
  9. Excel下拉框多选(支持再次选择已选项会取消选择)
  10. 未来的计算机 展望未来作文,展望未来作文素材_2020展望未来作文精选5篇
  11. 计算机关机键 自动重启,电脑关机会重启如何处理_电脑关机立马自动启动的修复方法...
  12. ubuntu系统打不开网易云音乐解决办法。
  13. UltraCompare v21.00分析
  14. 计算机图书管理系统测试用例,图书管理系统测试用例设计.doc
  15. 7-6 536 判定子串
  16. Arduino ESP32 通过定时器(Timer)功能唤醒深度睡眠
  17. 聊聊cortex的Backoff
  18. 二次元究竟招惹了谁?谣言煽动背后的文化迷思,警惕有可能发生的思想劫持【文明启示录#01】【补档】
  19. 快速有效的从零开始学习3d建模?
  20. 怎么理解预训练模型?

热门文章

  1. Requested registry access is not allowed 解决办法
  2. LabVIEW2020下载与安装教程
  3. 【C++笔记】封装的意义,结构体和类的区别
  4. sha1原型 c语言,SHA1算法实现(C语言)
  5. 人工智能综述性论文_人工智能论文研读:深度学习算法与架构综述(包含详细统计表)...
  6. php脚本日志文件,php脚本-定期删除日志文件,删除历史日志 保留最近7天
  7. linux vim命令,linux之vim命令
  8. google_glog 安装和测试
  9. mysql的多媒体类型_多媒体数据库技术及其发展方向
  10. java 矩阵题目_java练习本(20190611)