R树

article/2025/9/29 19:02:31

先搞明白R树搜索、插入、删除过程。

R树是平衡树,可以理解为B树在N维空间上的扩展。

R树一定要满足一下要求:

1.根节点若非叶子节点,则至少有两个子节点;

2.每个非根叶节点和非叶节点包含的实体个数均介于m和M之间;

3.所有叶子节点在同一层次;

其中m表示拥有子节点的下限,目的是为了提高磁盘利用率,提高搜索效率。如果m=1,所有节点都只有一个子节点,那树就退化为了普通链表。当节点的子节点数量少于m时,则会删除该节点,把该节点的子节点分配到其他节点中;M表示拥有子节点的上限,因为一般情况下,出于减少磁盘IO和批量刷盘的目的,我们一个节点对应了磁盘中一个或若干页。当节点的子节点数量大于M时,则会分裂该节点,把子节点分配到两个新的节点中。一般情况下m=1/2M。

我们就用二维空间来举例说明。

比如有如下二维平面坐标内若干点:

我们会把相邻的点分组聚集到一起,并用外接矩形框住,如下图:

这样我们就认为A、B、C的父节点是R1;H、G、P的父节点是R2。以此反复,R1、R2、R3、R4、R5、R6再把相邻的聚集到一起,用外接矩形框柱,外接矩形为其父节点。直到剩下两个节点为止。那最终R树的形态如下图:

RR2子节点就不详细画了。可以看到这就组成了一棵R树。

那搜索过程是什么样的?

比如我们认为这些点都是饭店坐标,我们要查一下我附近一公里范围内的所有饭店,那就把我附近一公里的范围作为一个查询矩形,然后从根节点开始,搜索所有相交的矩形。步骤如下:

S1:[查找子树]如果T是非叶子结点,如果T所对应的矩形与S有重合,那么检查所有T中存储的条目,对于所有这些条目,使用Search操作作用在每一个条目所指向的子树的根结点上(即T结点的孩子结点)。

S2:[查找叶子结点]如果T是叶子结点,如果T所对应的矩形与S有重合,那么直接检查S所指向的所有记录条目。返回符合条件的记录。

比如图中,黑色矩形为我们的搜索矩形,从根节点开始,搜索矩形与RR1、RR2都相交,则分别再搜索他们的子节点。RR1的子节点R1、R6与搜索矩形相交,RR2的子节点R2与搜索矩形相交。

然后再搜索R1、R6、R2的子节点是否符合条件。可以看到C、L、K、J、G在搜索矩形内,所以返回结果为C、L、K、J、G这五个节点。

再看插入过程,插入过程比较复杂一点,但是记住几个关键点即可:

1.如何找到合适的节点插入

2.如果节点的子节点数量超过M,怎么办

3.如果分裂向上传递怎么办

合适节点的选择要保证一个规则即可:加入的新节点使得矩形扩张最小,如果扩张相同,则选择面积小的。

如果插入新子节点导致子节点的数量超过M,则对节点进行分裂,分裂后的两个新结点,要包含原来所有的子节点。

如果分裂上传,则重复分裂过程,直到上传到根节点。

我们举例说明一下,我们假设M=4,m=2:

我们新增了红色节点,从根节点开始搜索合适的插入节点。红色节点与RR1近(即RR1扩张小),则选择RR1节点。

再搜索RR1子节点中,R6加入新节点后扩张小,则选择R6作为插入节点。

R6中已经有个4个子节点,再插入红色节点后,子节点数量大于M,则R6进行分裂。分裂产生R6和R7,并且R6、R7要包含原来所有的子节点。分裂后RR1的子节点数量为4,不需要再次分裂,则插入结束。插入后R树变为:

我们看一下分裂上传的场景,假如我们插入了很多节点后,R树已经变为如下图:

如果此时再向R1添加一个新节点,会导致R1分裂为两个节点,RR1的子节点也超过了上限M,则RR1也需要分裂,分裂为RR1和RR5,此时根节点的节点数量也超过了上限M,则重新创建根节点RRR1和RRR2,子节点分别为RR1、RR2、RR3、RR4、RR5,即树增高一层。

再看删除操作,删除操作也是需要注意几个关键点即可:

1.搜索到待删除的节点

2.如果删除后,节点的子节点数量小于m,则删除该节点

3.删除该节点后,需要把节点重新插入R树

如果节点的节点数量小于m,则把节点的子节点加入到临时链表中,一直到根节点为止。如果节点没有被删除,则调整矩形,使其可以覆盖所有子节点。如果临时链表中的节点需要插入回原来的层。

举例说明:

比如我们把A、C、D、I都删了,此时R1的子节点只剩下一个了,则B、E加入到临时链表中。

又因为R1、R3的子节点都剩下1个,小于m,则R1、R3被删除。

又因为此时RR1只剩下一个子节点R6,则把RR1的子节点添加到临时链表中。

此时遍历到根节点,则把临时链表中的数据重新插入会原层。

R6直接插入回RR1子节点,当插入B时,R6子节点数量已满,则R6分裂为R6和R7。

当插入E时,R6、R7子节点还有空余,则把B插入到R6或者R7中。

则删除后,R树变为:

 

以上是R树的操作过程。其中还有几个问题点:

1.相邻的节点或矩形,是如何划分的。

2.矩形分裂后,是以什么规则划分新矩形的。

3.如果有一个节点与其他任何节点都不相邻,形成孤点,如何处理。

还需要再深入学习一下。

首发公众号:


http://chatgpt.dhexx.cn/article/Zs9Ut4Ak.shtml

相关文章

R tree

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,…

R树空间索引

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,…

搜索树之R树

产生背景 地理空间数据涉及各种海量且复杂的数据,找到合适的索引对空间数据的处理至关重要。 传统的B树索引针对字符、数字等一维属性数据的主关键字而设计,不适用于具有多维性的地理空间数据。 在GIS和CAD系统对空间索引需求的推动下,为满足…

R-Tree

R-Tree ​ R-Tree是一颗用来存储高维数据的平衡树,它把B树的思想扩展到了多维空间,采用了B树分割空间思想,并在添加、删除操作时采用合并、分解节点的方法,保证树的平衡性。 数据结构 ​ 每个R树的叶子节点包含了多个指向不同数…

R-tree总结

R-tree R-tree是用来做空间数据存储的树状数据结构。R-tree是B-tree向多维空间发展的另一种形式,并且R树也是平衡树。 R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形,这个最小外接矩形就成为上一层的一个节点…

从B树、B+树、B*树谈到R 树

从B 树、B 树、B* 树谈到R 树 作者:July、weedge、Frankie。编程艺术室出品。 说明:本文从B树开始谈起,然后论述B树、B*树,最后谈到R 树。其中B树、B树及B*树部分由weedge完成,R 树部分由Frankie完成,全文…

R树简介

B树与R树 计算机磁盘的文件管理常使用B树和B树。B树和B树能良好地处理一维空间存储的问题。实际上,B树是一棵平衡树,它是把一维直线分为若干段线段,当我们查找满足某个要求的点的时候,只要去查找它所属的线段即可。这种思想其实是…

高级数据结构之R树(R-tree)

R树(R-tree)是一种将B树扩展到多维情况下得到的数据结构,它最初由Antonin Guttman于1984年提出。B树的结点中会存储一个键的集合,这些键把线分成片段,沿着那条线的点仅属于一个片段。因此,B树使得我们可以很容易地找到点。如果把沿线各处的点表示成B树结点,我们就能…

什么是R树?

什么是R树? R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。R树是由Antonin Guttman于1984年提出的。 人们随后发现它在理论和应用方面都非常实用。 在现实生活中,R树可以用来存储地图上的空间信…

图解R树的原理及相关操作

B 树的搜索本质上是一维区间的划分过程,每次搜索节点所找到的子节点其实就是一个子区间。R 树是把 B 树的思想扩展到了多维空间, 采用了 B 树分割空间的思想,是一棵用来存储高维数据的平衡树。 ​ 对于一棵 R 树,叶子节点所在层…

算法设计与分析-习题-动态规划法求解多段图的最短路径问题(动态规划法)

问题描述 用动态规划法求解如图所示多段图中从顶点0到9的最短路径。 问题求解 图中顶点编号已经按照多段图的分段顺序编号,用动态规划法求解该多段图的过程如下: 最后,得到最短的路径为0、2、6、7、9,费用是97。

【动态规划法】求解0/1背包问题

问题描述 有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10,计算背包所能装入物品的最大价值。 求解思路 在0/1背包问题中,物品i或者被装入背包,或者不被装入背包&#xf…

算法设计之动态规划法

算法设计之动态规划法 一、目的二、内容1.斐波那契数列①自底向上分析解决 ②自顶向下分析解决 2.走棋盘问题分析解决 3.爬台阶问题分析解决 三、反思与总结 一、目的 1.理解动态规划法的特征(多阶段决策\最优子结构\无后效性\子问题重复) 2.理解动态规划法的求解(划分过程\逆…

【动态规划法】求解TSP问题

问题详情 求解下图所示的TSP问题,计算出所经过的城市编号以及最短路径值,城市代价矩阵如图所示: 求解思路 假设从顶点i出发,令d(i, V’ )表示从顶点i出发经过V’ 中各个顶点一次且仅一次,最后回到出发点(…

动态规划法求解0/1背包问题

一、求解0/1背包问题 1、问题描述 有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为C的背包。 设计从这些物品中选取一部分物品放入该背包的方案&…

动态规划法——多段图的最短路径

目录 动态规划法的基本思想 多段图的基本想法 代码块(Java) 运行结果 动态规划法的基本思想: 将大问题划分成若干个小问题进行解决,从而一步步获取最优解动归从上到下分析问题,从下到上解决问题动归与分治法相似,其…

强化学习——动态规划法

文章目录 前言一、动态规划法简单认识1.基本概念2.适用情况3.求解步骤4.典型案例二、值函数1.累计折扣奖励2.状态值函数3.动作值函数4.状态值函数与动作值函数的关系5.贝尔曼方程(动态规划法核心) 三、策略评估1.基于状态值函数评估策略2.基于动作值函数…

南邮|算法分析与设计实验二 动态规划法

目录 实验目的 实验内容 实验步骤 一、最长公共子序列 二、矩阵连乘 实验目的 加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题和矩阵连乘问题,体会动态规划法和备忘录方法的异同。 实验内容 …

动态规划--算法

1、动态规划:将求解问题分解成若干个子问题,求解子问题,这些子问题不是独立的 求解后的子问题都会记录到表中,每个子问题仅求解一次, 下次遇到这些子问题直接取解 自底向上的方式计算最优解 2、最优子结构&#xff…

TSP问题,动态规划法

TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。各个城市间的距离可以用代价矩阵来表示。 假设从顶点i出发,令d(i, V)表示从顶点i出发经过V中各个顶点一次且仅一次,最后…