0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

动画+解析,轻松理解「Trie树」

电子工程师 来源:lq 2019-02-04 09:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词。

虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 以示区别,程序员小吴一般读「Trie」尾部会重读一声,可以理解为读「TreeE」。

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。

此外 Trie 树也称前缀树(因为某节点的后代存在共同的前缀,比如pan是panda的前缀)。

它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存。

它的核心思想就是通过最大限度地减少无谓的字符串比较,使得查询高效率,即「用空间换时间」,再利用共同前缀来提高查询效率。

Trie树的特点

假设有 5 个字符串,它们分别是:code,cook,five,file,fat。现在需要在里面多次查找某个字符串是否存在。如果每次查找,都是拿要查找的字符串跟这 5 个字符串依次进行字符串匹配,那效率就比较低,有没有更高效的方法呢?

如果将这 5 个字符串组织成下图的结构,从肉眼上扫描过去感官上是不是比查找起来会更加迅速。

Trie树样子

通过上图,可以发现 Trie树 的三个特点:

根节点不包含字符,除根节点外每一个节点都只包含一个字符

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串

每个节点的所有子节点包含的字符都不相同

通过动画理解 Trie 树构造的过程。在构造过程中的每一步,都相当于往 Trie 树中插入一个字符串。当所有字符串都插入完成之后,Trie 树就构造好了。

Trie 树构造

Trie树的插入操作

Trie树的插入操作

Trie树的插入操作很简单,其实就是将单词的每个字母逐一插入 Trie树。插入前先看字母对应的节点是否存在,存在则共享该节点,不存在则创建对应的节点。比如要插入新单词cook,就有下面几步:

插入第一个字母c,发现root节点下方存在子节点c,则共享节点c

插入第二个字母o,发现c节点下方存在子节点o,则共享节点o

插入第三个字母o,发现o节点下方不存在子节点o,则创建子节点o

插入第三个字母k,发现o节点下方不存在子节点k,则创建子节点k

至此,单词cook中所有字母已被插入 Trie树 中,然后设置节点k中的标志位,标记路径 root->c->o->o->k 这条路径上所有节点的字符可以组成一个单词cook

Trie树的查询操作

在 Trie 树中查找一个字符串的时候,比如查找字符串 code,可以将要查找的字符串分割成单个的字符 c,o,d,e,然后从 Trie 树的根节点开始匹配。如图所示,绿色的路径就是在 Trie 树中匹配的路径。

code的匹配路径

如果要查找的是字符串 cod(鳕鱼)呢?还是可以用上面同样的方法,从根节点开始,沿着某条路径来匹配,如图所示,绿色的路径,是字符串 cod 匹配的路径。但是,路径的最后一个节点「d」并不是橙色的,并不是单词标志位,所以 cod 字符串不存在。也就是说,cod是某个字符串的前缀子串,但并不能完全匹配任何字符串。

cod的匹配路径

程序员不要当一条咸鱼,要向 cook 靠拢:)

Trie树的删除操作

Trie树的删除操作与二叉树的删除操作有类似的地方,需要考虑删除的节点所处的位置,这里分三种情况进行分析:

删除整个单词(比如hi)

删除整个单词

从根节点开始查找第一个字符h

找到h子节点后,继续查找h的下一个子节点i

i是单词hi的标志位,将该标志位去掉

i节点是hi的叶子节点,将其删除

删除后发现h节点为叶子节点,并且不是单词标志位,也将其删除

这样就完成了hi单词的删除操作

删除前缀单词(比如cod)

删除前缀单词

这种方式删除比较简单。

只需要将cod单词整个字符串查找完后,d节点因为不是叶子节点,只需将其单词标志去掉即可。

删除分支单词(比如cook)

删除分支单词

与删除整个单词情况类似,区别点在于删除到cook的第一个o时,该节点为非叶子节点,停止删除,这样就完成 cook 字符串的删除操作。

Trie树的应用

事实上 Trie树 在日常生活中的使用随处可见,比如这个:

具体来说就是经常用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

1. 前缀匹配

例如:找出一个字符串集合中所有以 五分钟 开头的字符串。我们只需要用所有字符串构造一个 trie树,然后输出以 五−>分−>钟 开头的路径上的关键字即可。

trie树前缀匹配常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。

google搜索

2. 字符串检索

给出 N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,按最早出现的顺序写出所有不在熟词表中的生词。

检索/查询功能是Trie树最原始的功能。给定一组字符串,查找某个字符串是否出现过,思路就是从根节点开始一个一个字符进行比较:

如果沿路比较,发现不同的字符,则表示该字符串在集合中不存在。

如果所有的字符全部比较完并且全部相同,还需判断最后一个节点的标志位(标记该节点是否代表一个关键字)。

Trie树的局限性

如前文所讲,Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

假设字符的种数有 m 个,有若干个长度为n的字符串构成了一个 Trie 树 ,则每个节点的出度为 m(即每个节点的可能子节点数量为 m),Trie 树的高度为 n。很明显我们浪费了大量的空间来存储字符,此时 Trie 树的最坏空间复杂度为 O(m^n)。也正由于每个节点的出度为 m,所以我们能够沿着树的一个个分支高效的向下逐个字符的查询,而不是遍历所有的字符串来查询,此时 Trie 树的最坏时间复杂度为 O(n)。

这正是空间换时间的体现,也是利用公共前缀降低查询时间开销的体现。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符
    +关注

    关注

    0

    文章

    237

    浏览量

    26272
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    41675

原文标题:算法 | 动画+解析,轻松理解「Trie树」

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解析STM32的时钟

    处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。解析STM32的时钟[hide][/hide]
    发表于 10-21 14:36

    手机通信原理解析

    `手机通信原理解析:第 1 章    无线通信原理第2 章    移动通信系统第3 章    移动通信系统的多址接入技术第4 章    移动通信系统的语音编码第5 章 GSM移动通信系统的数字
    发表于 12-14 14:31

    定位技术原理解析

    【追踪嫌犯的利器】定位技术原理解析(4)
    发表于 05-04 12:20

    关于模型的一些理解

    模型的一些理解
    发表于 05-22 09:40

    对STM32时钟理解

    对STM32时钟理解
    发表于 08-02 10:28

    解析STM32H743的时钟

    摘要通过输入时钟和输出时钟解析STM32H743的时钟,并为最小系统程序、PLL动态调整、CPU的外设分配、外设在低功耗模式下的运行、CPU频率的动态调整提供了参考依据。目录1 术语1.1 外设
    发表于 08-12 06:23

    HarmonyOS Lottie组件,让动画绘制更简单

    什么是Lottie? Lottie是一款能够为应用添加动画的开源组件,它可以解析AE(After Effects)导出的json文件,让复杂的动画资源轻松运行在应用程序中。如图1所示
    发表于 02-22 14:55

    汽车构造_动画演示

    动画介绍汽车构造,对已初学者,对理解汽车基础知识很有帮。
    发表于 12-03 17:31 28次下载

    动画轻松理解“递归”与“动态规划”

    ) = 1,表示走 0 个台阶有一种走法,从思维上以及动图上来看,这显得的有点不符合逻辑。所以为了便于理解,把 f(2) = 2 作为一种终止条件,表示走 2 个台阶,有两种走法,一步走完或者分两步来走。
    的头像 发表于 12-31 09:42 7710次阅读

    Linux 内核里的数据结构关键:基数

    基数是一种 压缩的字典compressed trie ,而字典是实现了关联数组接口并允许以 键值对 方式存储值的一种数据结构。这里的键通常是字符串,但可以使用任意数据类型。
    发表于 04-28 16:04 1227次阅读

    以太坊中运用最多的三种树结构介绍

    Trie,又称字典,单词查找或者前缀,是一种用于快速检索的多叉树结构,如英文字母的字典
    发表于 04-29 11:14 6431次阅读
    以太坊中运用最多的三种树结构介绍

    基于关键词的GCC抽象语法消除冗余算法

    GCC( GNU Compiler Collection)编译器编译¢语言源程序所生成的抽象语法文本中包含大量与源代码无关的冗余信息,若直接进行解析,会严重影响分析效率,降低分析精确度,同时
    发表于 05-07 10:30 210次下载

    数据结构字典的实现

    什么是字典字典,是一种空间换时间的数据结构,又称Trie、前缀,是一种树形结构(字典
    的头像 发表于 09-07 15:03 2801次阅读
    数据结构字典<b class='flag-5'>树</b>的实现

    Trie数据结构的实现原理和题目实践

    Trie 又叫字典、前缀、单词查找,是一种二叉衍生出来的高级数据结构,主要应用场景是处
    的头像 发表于 05-11 17:47 2715次阅读

    红黑的特点及应用

    比起理解红黑的原理,更重要的是理解红黑的应用场景,因为某些应用场景的需要,红黑才会应运而生。 红黑
    的头像 发表于 11-10 11:16 1731次阅读
    红黑<b class='flag-5'>树</b>的特点及应用