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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
13-看图理解数据结构与算法系列(Trie树)的更多相关文章
- 19-看图理解数据结构与算法系列(Radix树)
Radix树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Rad ...
- 09-看图理解数据结构与算法系列(B树)
B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...
- 06-看图理解数据结构与算法系列(AVL树)
AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写.AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高. AVL ...
- 11-看图理解数据结构与算法系列(B树的删除)
删除操作 删除操作比较复杂,主要是因为删除的项可能在叶子节点上也可能在非叶子节点上,而且删除后可能导致不符合B树的规定,这里暂且称之为导致B树不平衡,于是要进行一些合并.左旋.右旋等操作,使之符合B树 ...
- 10-看图理解数据结构与算法系列(B+树)
B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引, ...
- 17-看图理解数据结构与算法系列(NoSQL存储-LSM树)
关于LSM树 LSM树,即日志结构合并树(Log-Structured Merge-Tree).其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想.大多NoSQL数据库核心思想都是基于L ...
- 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文
<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...
- 数据结构与算法简记--Trie树
Trie树 概念 多叉树,节点为字符串中的单个字符. Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起. 将多个字符串按字符拆分插入Trie树,用于字符串查找,关键词提示等 举 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
随机推荐
- 前缀和小结 By cellur925
这篇主要是来介绍前缀和的QAQ. 前缀和有一维的和二维的,一维的很容易理解,高中数学必修5第二章数列给出了前n项和的概念,就是前缀和.一维的我们在这里简单说一句. 一维前缀和 预处理:在输入一个数列的 ...
- [USACO4.1]麦香牛块Beef McNuggets By cellur925
题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...
- SwipeLayou与ScrollerView滑动冲突
在SwipeLayout内嵌套ScorllerView滑动会出现上滑滑动冲突,ScollerView不能往上滑,,,,,, mSlv.getViewTreeObserver().addOnScroll ...
- Linux的防火墙概念
#linux的防火墙概念#因为如果你不关防火墙,很可能运行 django.nginx.mysql出错#防火墙可能会阻挡端口流量的 出口#也会阻挡外来请求的 入口 #selinux iptables f ...
- synchronized(1)用法简介:修饰方法,修饰语句块
注意: 同一个对象或方法在不同线程中才出现同步问题,不同对象在不同线程互相不干扰. synchronized方法有2种用法:修饰方法,修饰语句块 1.synchronized方法 是某个对象实例内,s ...
- 关于如何读取XML文件的一个简单方法
在平时开发系统功能的时候,我们经常会碰到一些需求需要经常性的发生变化,比如 系统版本.更新日志 等等.这个时候用一个XML文件来替代数据库,就会变的简便很多. 前段时候我也正好需要改个需求,是关于客户 ...
- P1118 [USACO06FEB]数字三角形Backward Digit Su…
题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N ...
- git ---合并和删除分支
git merge 分支名 //合并子分支到当前分支 git branch -d 分支名//删除分支
- Java集合框架源码(四)——Vector
第1部分 Vector介绍 Vector简介 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这 ...
- 5 Transforms 转移 笔记
5 Transforms 转移 笔记 Transforms Unfortunately, no one can be told what the Matrix is. You have to ...