除了前文介绍的树之外,我们再来看看另外一些比较特别的树。

一、R树

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置计算操作了,如果应用到谷歌地图这种超大数据库中,这种方法便必定不可行了。

R树就很好的解决了这种高维空间搜索问题。它把B树的思想很好的扩展到了多维空间,采用了B树分割空间的思想,并在添加、删除操作时采用合并、分解结点的方法,保证树的平衡性。因此,R树就是一棵用来存储高维数据的平衡树。

R树已经被广泛应用在各种数据库及其相关的应用中。但R树的处理也具有局限性,它的最佳应用范围是处理2至6维的数据,更高维的存储会变得非常复杂,这样就不适用了。近年来,R树也出现了很多变体,R*树就是其中的一种。这些变体提升了R树的性能,感兴趣的读者可以参考相关文献。

二、字典树(trie树)

Tire树称为字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。以便于字符串的统计和查找,经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。具有以下特点(图f):

  1. 根节点为空;
  2. 除根节点外,每个节点包含一个字符;
  3. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  4. 每个节点的所有子节点包含的字符都不相同。
  5. 每个字符串在建立字典树的过程中都要加上一个区分的结束符,避免某个短字符串正好是某个长字符串的前缀而淹没。

Tire树的应用:

1.串的快速检索

给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。

2.“串”排序

给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出。用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。

3.最长公共前缀

对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为求公共祖先的问题。

三、后缀树

所谓后缀树,就是包含一则字符串所有后缀的压缩了的字典树。先说说后缀的定义。给定一长度为n的字符串S=S1S2..Si..Sn,和整数i,1 <= i <= n,子串SiSi+1...Sn都是字符串S的后缀。以字符串S=XMADAMYX为例,它的长度为8,所以S[1..8], S[2..8], ... , S[8..8]都算S的后缀,我们一般还把空字串也算成后缀。这样,我们一共有如下后缀。对于后缀S[i..n],我们说这项后缀起始于i。

  1. S[1..8], XMADAMYX, 也就是字符串本身,起始位置为1
  2. S[2..8], MADAMYX,起始位置为2
  3. S[3..8], ADAMYX,起始位置为3
  4. S[4..8], DAMYX,起始位置为4
  5. S[5..8], AMYX,起始位置为5
  6. S[6..8], MYX,起始位置为6
  7. S[7..8], YX,起始位置为7
  8. S[8..8], X,起始位置为8
  9. 空字串。记为$。

所有这些后缀字符串组成一棵字典树。

四、广义后缀树

广义后缀树是好几个字符串的的所有后缀组成的字典树,同样每个字符串的所有后缀都具有一个相同的结束符,不同字符串的结束符不同。

传统的后缀树只能处理一个单词的所有后缀。广义后缀树存储任意多个单词的所有后缀。例如字符串“abab”和“baba”,首先将它们使用特殊结束符链接起来,如表示成“ababbaba#”,然后求连接后的新字符的后缀树,遍历所得后缀树,如遇到特殊字符,如“baba#”,然后求连接后的新字符的后缀树,遍历所得后缀树,如遇到特殊字符,如“”,"#"等则去掉以该节点为跟的子树,最后所得后缀树即为原字符串组的广义后缀树。其实质是将两个字符串的所有后缀,即:abab,???,bab,ab,?,b,baba#,aba#,ba#,a#,组成字典树,再进行压缩处理。广义后缀树的一个常应用就是判断两个字符串的相识度。


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://www.cnblogs.com/shixiangwan/p/7530015.html
  2. https://blog.csdn.net/yishizuofei/article/details/81660841
  3. https://blog.csdn.net/v_JULY_v/article/details/6530142

程序员的进阶课-架构师之路(15)-那些年你遇到的其他树相关推荐

  1. 程序员的进阶课-架构师之路(17)-堆

    我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...

  2. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  3. 程序员的进阶课-架构师之路(18)-图

    一.图的定义 在计算机科学中,图(Graphics)是由顶点集合(Vertex)及顶点间的关系(边)集合(Edge)组成的一种数据结构,这些顶点通过一系列边结对(连接).顶点用圆圈表示,边就是这些圆圈 ...

  4. 程序员的进阶课-架构师之路(7)-树的概念

    接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  5. 程序员的进阶课-架构师之路(5)-队列

    一.队列的定义 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操 ...

  6. 程序员的进阶课-架构师之路(4)-栈

    一.栈的定义 [百度百科]栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据 ...

  7. 程序员的进阶课-架构师之路(3)-线性表

    一.线性表的定义 [百度百科]线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...

  8. 程序员的进阶课-架构师之路(2)-数组

    从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组. 在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样 ...

  9. 程序员的进阶课-架构师之路(1)-数据结构与算法简介

    现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是c语言实现,而java作为第一主流语言,理应有它自己的独到之处.这也是我写这些博客的初衷,我会讲解java实现的数 ...

  10. 二叉树为空意味着二叉树_程序员的进阶课-架构师之路(8)-二叉树

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

最新文章

  1. 中小企业对于云计算的3大误解
  2. 一不小心肝出了4W字的Redis面试教程
  3. Ubuntu下安装配置Open×××
  4. wordpress漏洞_聊聊 WordPress 5.1.1 CSRF to RCE 漏洞
  5. ie9浏览器两个ajax请求同步不兼容_浏览器拦截问题
  6. 使用maven工程实现Mybatis自动生成Mapper文件
  7. ACM 题目分类POJ(自用,精)
  8. 12.04 ubuntu 安装微软雅黑的字体
  9. Spring包的方法WebUtils.getParametersStartingWith(request,String)
  10. 圆为什么有360度?
  11. Linux内核中的信号量解析
  12. java冰箱评测开题报告范文_智能电冰箱控制的设计开题报告.doc
  13. Linux系统自动校准时间
  14. 英语流利说19秋招笔试总结
  15. Elasticsearch短语或近似匹配及召回率案例深入剖析-搜索系统线上实战
  16. 1024这天,马蜂窝程序员选出的最好语言是…
  17. 易岸公考:国考公务员高频常识
  18. 量子计算机有生之年,对话哈佛大学教授Lukin:量子计算将在我们有生之年普及!...
  19. 太离谱了!一行Python代码写的游戏,我能这样玩一天!
  20. 【叔小生】JavaScript进阶篇

热门文章

  1. 一个比较完善的购物车类
  2. .NET_.NET Copy Web 部署概念_01-3
  3. 不小心删除了系统的GRUB怎么办
  4. VS2005(C#)里读取及改变App.config里appSettings节的值
  5. influxDB集群模式实践
  6. Dubbo(八)使用配置类方式实现服务提供者消费者dubbo配置
  7. dapper mysql帮助类_DapperHelper 帮助类
  8. mysql 关于binlog的一些命令
  9. 小程序开发时能否使用我们自定义的字体图标
  10. php类代码中常看到::的操作符