13-看图理解数据结构与算法系列(Trie树)

Trie树

Trie树,是一种搜索树,也称字典树或单词查找树,此外也称前缀树,因为某节点的后代存在共同的前缀。它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存。它的核心思想就是减少没必要的字符比较,使查询高效率,即用空间换时间,再利用共同前缀来提高查询效率。

Trie树特点

  • 根节点不包含字符,其他节点每个节点只包含一个字符。
  • 从根节点到某一节点经过路径的字符连起来即为该节点对应的字符串。
  • 每个节点的所有子节点字符都不相同。

插入操作

对he、him、his、she、her、hers六个字符串进行插入,开始插入he字符串,插入第一个字符是h,此时树为空,所以先创建空的根节点,

接着从根节点开始,不存在h子节点,于是创建子节点h,

在h节点的基础上继续插入第二个字符e,

h节点不存在e子节点,创建子节点e,并将该节点标记为单词标志,完成he字符串插入。

接着插入him字符串,从根节点开始,发现h子节点已有,

移到h子节点,

继续处理第二个字符i,h节点不存在i子节点,于是创建i子节点,

处理第三个字符m,i节点不存在子节点m,于是创建m子节点,并将该节点标记为单词标志,完成him插入。

接着插入his字符串,从根节点开始,发现h子节点已有,

移到h子节点,

继续处理第二个字符i,h节点已存在i子节点,于是移到i节点,

处理第三个字符s,i节点不存在子节点s,于是创建s子节点,并将该节点标记为单词标志,完成his插入。

继续插入she字符串,从根节点开始,首先处理第一个字符s,发现s子节点不存在,于是创建s节点,

接着处理第二个字符h,s节点不存在h子节点,创建h节点,

继续处理第三个字符e,h节点不存在e子节点,创建e节点,并将该节点标记为单词标志,至此完成she字符串插入。

类似地,将her、hers字符串插入到树中,最终为:

查询操作

查找hi字符串,从根节点开始,

根节点存在h子节点,移动到h节点,

继续找i子节点,存在,但i并没有单词标志,所以hi字符串不存在。

查找his字符串,从根节点开始,

根节点存在h子节点,移动到h节点,

h节点存在i子节点,移动到i节点,

继续找s子节点,存在,而且s节点为单词标志,找到his字符串。

而如果查找hist字符串,则最后的t找不到,所以不存在该字符串。

删除操作

情况一

删除she字符串,从根节点开始查找第一个字符s,

找到s子节点,下移到s节点,继续查找字符h,

找到h子节点,下移到h节点,继续查找字符e,

找到e节点,已经找到she字符串,将e节点的单词标志去掉,

此时发现e节点为叶子节点,将其删除,

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

删除后发现s节点为叶子节点,且其不是单词标志,将其删除,完成she字符串删除操作。

情况二

删除her字符串,从根节点开始查找第一个字符h,

找到h子节点,下移到h节点,继续查找字符e,

找到e子节点,下移到e节点,继续查找字符r,

找到r子节点,此时完成整个字符串查找,因为不是叶子节点,只需将其单词标志去掉即可。

情况三

删除his,从根节点开始查找第一个字符h,

找到h子节点,下移到h节点,继续查找字符i,

找到i子节点,下移到i节点,继续查找字符s,

找到s子节点,此时完成整个字符串查找,

删除后发现s节点为叶子节点,将其删除,

删除后发现i节点为非叶子节点,停止删除,完成his字符串删除操作。

作者:超人汪小建
链接:https://juejin.im/post/5ba198ba5188255c7c6555c9
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/Knight-of-Dulcinea/p/9946095.html

时间: 2024-08-30 03:55:49

13-看图理解数据结构与算法系列(Trie树)的相关文章

09-看图理解数据结构与算法系列(B树)

B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数据库或文件系统. B树特点 B树可以定义一个m值作为预定范围,即m路(阶)B树. 每个节点最多有m个孩子. 每个节点至少有ceil(m/2)个孩子,除了根节点和叶子节点外. 对于根节点,子树个数范围为[2,m],节点内值的个数范围为[1,m-1]. 对于非根节点,节点内的值个数范围为[ceil(m/

08-看图理解数据结构与算法系列(2-3树)

2-3树 2-3树,是最简单的B-树,其中2.3主要体现在每个非叶子节点都有2个或3个子节点,B-树即是平衡树,平衡树是为了解决不平衡树查询效率问题,常见的二叉平衡书有AVL树,它虽然提高了查询效率,但是插入操作效率不高,因为它需要再每次插入节点后维护树的平衡,而为了解决查询效率同时有兼顾插入效率,于是提出了2-3树. 2-3树特点 2-3树是一棵平衡树,但不是二叉平衡树. 对于高度相同的2-3树和二叉树,2-3树的节点数要大于满二叉树,因为有些节点可能有三个子节点. 2-3树可以是一棵空树.

10-看图理解数据结构与算法系列(B+树)

B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率.另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找. B+树特点 B+树可以定义一个m值作为预定范围,即m路(阶)B+树. 根节点可能是叶子节点,也可能是包含两个或两个以上子节点的节点. 内部节点如果拥有k个关键字则有k+1个子节点. 非叶子节点不保存数据,只保存

12-看图理解数据结构与算法系列(冒泡排序)

冒泡排序 冒泡排序是一种很简单的排序算法,主要思想就是不断走访待排序序列,每次只比较两个相邻元素,如果这俩元素顺序不符合要求则对换它们,不断重复知道没有相邻元素需要对换.在不断走访比较过程中,越大的元素经过交换会慢慢走到数列顶端,所以看起来它就像气泡一样不断往上冒,于是就叫冒泡. 排序要点 比较相邻两个元素,如果前一元素比后一元素大则对换它们的位置. 从头开始对每一对相邻元素都执行1的对比工作,直至结尾最后一对,执行完一轮后,该轮最大的元素被换置到最后. 针对所有元素执行若干轮1和2操作,每次经

14-看图理解数据结构与算法系列(希尔排序)

希尔排序 希尔排序是希尔(Donald Shell)提出的一种排序方法,也属于插入排序,但是简单插入排序的高效版本,也称为缩小增量排序.基本思想是将待排序元素进行增量分组,然后在分组组内进行插入排序,随着增量的减少,每个分组组内的元素越来越多,直至增量减至1时,所有元素都分到同一个组内,执行插入排序后完成整个排序操作. 排序要点 选取一个小于所有待排序元素数量n的整数作为第一个增量,对全部元素进行分组,分组的依据是所有距离为的倍数的记录分到同一组. 对分好的组,在组内进行直接插入排序. 接着取第

一句话+一张图理解——数据结构与算法

https://blog.csdn.net/qq_33414271/article/details/80366014 原文地址:https://www.cnblogs.com/springcloud/p/9065160.html

数据结构与算法系列四(单链表)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

数据结构与算法系列七(队列)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

数据结构与算法系列十三(选择排序)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?