参考:https://en.wikipedia.org/wiki/Interval_tree

百度很多关于interval tree和segment tree的感觉都有问题,于是去Wikipedia查了一下interval tree,在这里总结一下。

线段树用来索引线段,比如时间段[1,10], [3,7], [20,30],主要支持点查询,比如查找时间点4,会查出[1,10]和[3,7],范围查询会附加用一颗独立的树形结构如B+树辅助查询。

有两种interval tree的实现,这里介绍其中一种 Centered interval tree

Centered interval tree

1 整体介绍

Centered interval tree 是一颗三叉树,专门用来应对点查询。

给定 n 个线段,用 Ts 和 Te 表示起点和终点。首先确定一个中心点,中心点会把所有线段分成三部分:

  • a:Te 比 中心点 小的线段集合。
  • b:中心点 落在[Ts,Te]中间的线段。
  • c:Ts 比 中心点 大的线段。

a 为当前节点,b 为 a 的左子树,c 为 a 的右子树。树的整体构造过程就是这样,中心点的选择尽量使树平衡。

2 当前节点构造过程

当前节点维护五个信息:

  • 1:中心点的值
  • 2:指向左子树的指针
  • 3:指向右子树的指针
  • 4:按 Ts 将 a 中的线段排序
  • 5:按 Te 将 a 中的线段排序

下面以 7 条线段为例,给出一个 interval tree 的示意图(仅表示大概意思)

  • [1,5]
  • [2,4]
  • [6,13]
  • [7,11]
  • [8,12]
  • [17,21]
  • [18,22]

其中 10 ,3 ,20 是三个节点的中心点。3和20两颗子树没有子节点了。

3 点查询

查询包含点 p 的线段,从根节点开始,先和第一个节点开始查找,如果 p 等于当前中心点,则直接返回所有当前节点的线段,不再查找子树。如果 p 比中心点小,则递归查找左子树,p 比中心点大类似。

3.1 查询当前节点

当前节点维护的都是覆盖中心点的线段。如果 p 比中心点小,则所有线段的 Te 都比 p 大,只需要查找第 4 部分(按 Ts 将线段排序),所有小于 p 的 Ts 的线段都会覆盖 p ,满足查询条件。

其中x_center为中心点,x为查找的点。下图是节点内部的查找过程

3.2 点查询示例

查询7.5的示例图:首先查找根节点,因为7.5比10小,继续查找左子树。最后找到两个线段[6,13], [7,11]。

4 范围查询

给定查询范围[m, n],返回与[m, n] 相交的所有线段。需要一个一维树形结构辅助。一般用B+树。

两条线段相交有四种:其中黑色线段为查询条件,下边线段为相交的线段。

这四种可以进一步分为两种情况:

  • a,b,c :左右端点至少有一个在查询范围内。
  • d:完全覆盖查询范围。

4.1 范围查询过程

满足第一种情况的线段可以通过对所有线段建立一颗 B+ 树,将每个线段的左右端点插入到树中。范围查询可以直接查找开始节点和结束节点,中间端点链接的线段都满足要求。

第二种情况可以通过 interval tree来查,从查询范围中随便取一个点进行点查询。

最后进行合并去重。

4.2 范围查询示例:

查询[7.5, 9]。首先在 B+ 树中找到满足第一种情况的线段。

找到线段:[8,12]

再随便取个中间值 7.8 到 interval tree 中找到满足第二种情况的线段。

找到线段:[6,13], [7,11]

最后合并去重,得到结果集[8,12],[6,13], [7,11]

Centered Interval tree 介绍(中心区间树)相关推荐

  1. 【数据结构】线段树(interval tree)

    线段树(interval tree),也叫区间树.也是一种二叉搜索树,同一般的BST不同之处在于:线段树的每一个结点包含的是一个区间而不是一个数.具体的描述如下: 从图上可以看出,线段树的每一个结点都 ...

  2. 区间树(segment tree)

    区间树能够对保存的数据进行适当的预处理,以快速回复查询. 区间树常用于在一维数组的特定区间对查询进行快速回复.区间树的最典型也是最简单的应用就是求区间最小值的问题. 区间树的基本思路是,生成表示给定数 ...

  3. 内核区间树的使用Demo

    Linux内核区间树(interval tree)是一种用于高效存储和查询区间的数据结构,被广泛用于许多内核子系统中,例如文件系统,内存管理,虚拟化等等,在区间树中,每个节点都表示一个区间,并存储一个 ...

  4. java 区间树_线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  5. linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...

    tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装, 安装 sudo apt install tree ...

  6. CF311D Interval Cubing 数学、线段树

    CF311D Interval Cubing 数学.线段树 数学太重要了..有些人知道点结论就喜欢搞个数学包装水题,欺负吾等数学学渣啊... CF有官方题解,不过我还是记录一下吧. 这是个线段树的经典 ...

  7. 算法导论习题—二叉搜索树、红黑树、区间树

    算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...

  8. LSM Tree介绍及其应用

    1. LSM Tree介绍 1.1 概念 ​B+树读效率高而写效率差:log型文件操作写效率高而读效率差:因此要在排序和log型文件操作之间做个折中,于是就引入了log-structed merge ...

  9. 电子科大电气工程导师介绍绍_电子科技大学计算机科学与工程学院研究生导师介绍:葛树志...

    院校研究生导师对于日后的研究生生涯起到重要的指导作用,因此对目标院校研究生导师一定要了解.以下是中公考研小编为大家整理的"电子科技大学计算机科学与工程学院研究生导师介绍:葛树志"的 ...

最新文章

  1. 五、curator recipes之选举主节点Leader Latch
  2. Andriod --- JetPack (三):ViewModel 的诞生
  3. 【HDU】2795 Billboard
  4. 使用canvas绘制时钟
  5. 高可用的 MFS 文件分布式系统(Drdb+heartbeat+MFS )
  6. 甘肃计算机教室中标,大单纷至沓来 甘肃百亿工程浪潮电脑中标8000台
  7. 使用正态分布变换(Normal Distributions Transform)进行点云配准
  8. UIImageView 加入子UIImageView 导致内存泄露的问题
  9. Android学习笔记(十二)——使用意图传递数据的几种方式
  10. 这样能收录,原理是用的凤凰新闻采集工具
  11. 每个人都应该了解的金融小知识 -- 利率计算
  12. B. Shashlik Cooking(思维)
  13. 中国广电即将放号,感受到压力的中国移动率先推出19元5G套餐
  14. c语言实验报告总结周信东,周信东主编c语言程序设计基础实验一实验报告精选版.docx...
  15. 简体字转换繁体字的winfrom小程序
  16. 搭建wnmp开发环境
  17. ....他乡遇故知....
  18. 谈网站域名,备案到上线
  19. 劳伦斯·彼德 _彼德原理
  20. leetcode/求幂集,所有子集

热门文章

  1. 800D-基础摄影知识
  2. 1002 写出这个数-读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
  3. 程序设计典型算法之递推法
  4. 利用Register protocol实现网页调用桌面程序(类似迅雷、QQ等)
  5. J. 程序设计:蒜厂年会 最大连续和
  6. 营销型网站和展示型网站有何差别?
  7. 区块链入门必读(FISCO)
  8. Windows 安装AirSim
  9. 油烟净化器该如何挑选?
  10. 5. 构造函数和普通函数的区别