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树)的更多相关文章

  1. 19-看图理解数据结构与算法系列(Radix树)

    Radix树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Rad ...

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

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...

  3. 06-看图理解数据结构与算法系列(AVL树)

    AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写.AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高. AVL ...

  4. 11-看图理解数据结构与算法系列(B树的删除)

    删除操作 删除操作比较复杂,主要是因为删除的项可能在叶子节点上也可能在非叶子节点上,而且删除后可能导致不符合B树的规定,这里暂且称之为导致B树不平衡,于是要进行一些合并.左旋.右旋等操作,使之符合B树 ...

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

    B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引, ...

  6. 17-看图理解数据结构与算法系列(NoSQL存储-LSM树)

    关于LSM树 LSM树,即日志结构合并树(Log-Structured Merge-Tree).其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想.大多NoSQL数据库核心思想都是基于L ...

  7. 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文

    <看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...

  8. 数据结构与算法简记--Trie树

    Trie树 概念 多叉树,节点为字符串中的单个字符. Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起. 将多个字符串按字符拆分插入Trie树,用于字符串查找,关键词提示等 举 ...

  9. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

随机推荐

  1. Spring @requestBody

    页面提交请求参数有两种,一种是form格式,一种是json格式 jQuery的$.post方法虽然也可以传递json格式数据,但实际上是用的form格式提交,jquery会帮你把json转成form格 ...

  2. _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 保存高斯消元模版. ps,这一题的英文名字是ヨスガノソラ的开发商~^_^ #inclu ...

  3. android将对象序列化到文件:直接写文件与用Serializable接口的对比

    1.用文件读写1024个对象的日志 10-09 16:12:44.493 6385-6385/com.example.tt.downtest D/Serializable_TAG: write 102 ...

  4. redis的安装使用以及一些常用的命令

    Redis是一个key-value存储系统.并提供多种语言的API,我们可使用它构建高性能,可扩展的Web应用程序.目前越来越多的网站用它来当做缓存,减轻服务器的压力. 本文安装用的到redis是绿色 ...

  5. 简单工厂模式-Java篇

    简单工厂模式就是考虑如何实例化对象的问题,就是说到底要实例化谁,将来会不会增加实例化对象,比如计算器类中增加开根元素,应该考虑用一个单独的类来创造实例的过程,这就是工厂.下面将利用计算器类举例,解释简 ...

  6. Safari兼容之new Date()格式问题

    safari浏览器: 故: Safari浏览器应该用‘2017/10/23’来代替‘2017-10-23’ 谷歌浏览器: 谷歌浏览器两种格式都支持

  7. vue报错-Error: Cannot find module '@babel/core'

    vue之webpack实战的时候遇到报错,Error: Cannot find module '@babel/core' 这报错,我百度了很久,后来发现报错里面有提示,发现是我的 babel-load ...

  8. java调用jacob生成pdf,word,excel横向

    /* * 传进一个office文件的byte[]以及后缀,生成一个pdf文件的byte[] */ public byte[] jacob_Office2Pdf(byte[] srcFileBytes, ...

  9. bzip2 一种块排序文件压缩软件

    总览 bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ] bunzip2 [ -fkvsVL ] [ filenames ... ] bzcat [ - ...

  10. 第一节、ES6的开发环境搭建

    https://blog.csdn.net/zls986992484/article/details/70819462 下面这个不好使 https://blog.csdn.net/gao5311624 ...