Centered Interval tree 介绍(中心区间树)
参考: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 介绍(中心区间树)相关推荐
- 【数据结构】线段树(interval tree)
线段树(interval tree),也叫区间树.也是一种二叉搜索树,同一般的BST不同之处在于:线段树的每一个结点包含的是一个区间而不是一个数.具体的描述如下: 从图上可以看出,线段树的每一个结点都 ...
- 区间树(segment tree)
区间树能够对保存的数据进行适当的预处理,以快速回复查询. 区间树常用于在一维数组的特定区间对查询进行快速回复.区间树的最典型也是最简单的应用就是求区间最小值的问题. 区间树的基本思路是,生成表示给定数 ...
- 内核区间树的使用Demo
Linux内核区间树(interval tree)是一种用于高效存储和查询区间的数据结构,被广泛用于许多内核子系统中,例如文件系统,内存管理,虚拟化等等,在区间树中,每个节点都表示一个区间,并存储一个 ...
- java 区间树_线段树(区间树)之区间染色和4n推导过程
前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...
- linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...
tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装, 安装 sudo apt install tree ...
- CF311D Interval Cubing 数学、线段树
CF311D Interval Cubing 数学.线段树 数学太重要了..有些人知道点结论就喜欢搞个数学包装水题,欺负吾等数学学渣啊... CF有官方题解,不过我还是记录一下吧. 这是个线段树的经典 ...
- 算法导论习题—二叉搜索树、红黑树、区间树
算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...
- LSM Tree介绍及其应用
1. LSM Tree介绍 1.1 概念 B+树读效率高而写效率差:log型文件操作写效率高而读效率差:因此要在排序和log型文件操作之间做个折中,于是就引入了log-structed merge ...
- 电子科大电气工程导师介绍绍_电子科技大学计算机科学与工程学院研究生导师介绍:葛树志...
院校研究生导师对于日后的研究生生涯起到重要的指导作用,因此对目标院校研究生导师一定要了解.以下是中公考研小编为大家整理的"电子科技大学计算机科学与工程学院研究生导师介绍:葛树志"的 ...
最新文章
- 五、curator recipes之选举主节点Leader Latch
- Andriod --- JetPack (三):ViewModel 的诞生
- 【HDU】2795 Billboard
- 使用canvas绘制时钟
- 高可用的 MFS 文件分布式系统(Drdb+heartbeat+MFS )
- 甘肃计算机教室中标,大单纷至沓来 甘肃百亿工程浪潮电脑中标8000台
- 使用正态分布变换(Normal Distributions Transform)进行点云配准
- UIImageView 加入子UIImageView 导致内存泄露的问题
- Android学习笔记(十二)——使用意图传递数据的几种方式
- 这样能收录,原理是用的凤凰新闻采集工具
- 每个人都应该了解的金融小知识 -- 利率计算
- B. Shashlik Cooking(思维)
- 中国广电即将放号,感受到压力的中国移动率先推出19元5G套餐
- c语言实验报告总结周信东,周信东主编c语言程序设计基础实验一实验报告精选版.docx...
- 简体字转换繁体字的winfrom小程序
- 搭建wnmp开发环境
- ....他乡遇故知....
- 谈网站域名,备案到上线
- 劳伦斯·彼德 _彼德原理
- leetcode/求幂集,所有子集