R+树,多维动态对象的索引机制

最近做research,接触到了一些数据库的基础树形结构,R+树是其中之一,文章的主要观点来自“THE  R+-TREE:  A  DYNAMIC  INDEX  FOR MULTI-DIMENSIONAL  OBJECTS”这篇文章,由于刚刚接触,理解还只停留在翻译层面,望有感读者批评指正。

R+树是R树的一个变种,对于R树,它是B树在k维空间的直接拓展,数据结构是由中间节点和叶子节点组成的高度平衡树。R树的搜索性能与覆盖面和重叠面积相关,显然,高效的R树搜索要求这两者能达到最小,最小的覆盖面能减少MBR内死空间的大小,而最小的重叠面尤为重要,由于很难控制R树动态分裂时的重叠面,搜索性能会逐渐退化,甚至有可能从对数级退化到线性级。

无重叠,无覆盖的情况只能针对数据点时才能实现,而无重叠对于区域数据对象也是难以实现的,然而,如果允许对矩形进行分割,中间节点条目的0重叠就容易实现了,这也就是R+树的主要观点。

R+树的结构及属性

结构
叶节点形式 (oid, RECT)
在二维空间,RECT条目形式为(x
_low,x_high,y_low,y_high)
中间节点形式 (p,RECT)
属性
对于中间节点的每个条目(p,RECT),该节点的p指针所指向的子树当且仅当矩形R包含在RECT中才包括矩形R。唯一的特殊条件是当R是叶节点中的矩形,该情况下R 必须与RECT重叠
中间节点的任意两个条目(p1,RECT1),(p2,RECT2),RECT1和RECT2的重叠面积为0
根节点至少有两个孩子除非它是叶节点
所有叶子都在同一层

算法

Search算法:主要思想是首先将搜索空间分成不相连的子区域,然后沿着树向下直到实际的数据对象在叶子中找到。
输入:R+树的根节点R,搜索窗口W
输出:所有与W重叠的数据对象
方法:分解搜索空间并遍历搜索树
S1,如果R不是叶子,检查R的每个条目 (p,RECT)看RECT与W是否重叠。如果重叠则调用Search(CHILD,S∩RECT),CHILD是p指向的节点。
S2,如果R是叶子,检查R中的所有RECT对象,然后返回与W重叠的。

Insert算法:与R树的不同在于输入的矩形可能被添加到多个叶子中。
输入:R+树的根节点R,输入矩形IR
输出:添加IR后产生的新R+树
方法:找到IR的放置位置,并添加到对应节点
I1,如果R不是叶子,检查R的每个条目 (p,RECT)看RECT与IR是否重叠。如果重叠则调用Insert(CHILD,S∩RECT),CHILD是p指向的节点。
I2,如果R是叶子,添加IR到R中,如果插入之后R包含的条目数超过M,则调用SplitNode(R)重组树的结构

Delete算法
输入:R+树的根节点R,输入矩形IR
输出:删除IR后产生的新R+树
方法:找到IR的放置位置,并从对应叶子中删除
D1,如果R不是叶子,检查R的每个条目 (p,RECT)看RECT与IR是否重叠。如果重叠则调用Delete(CHILD,S∩RECT),CHILD是p指向的节点
D2,如果R是叶子,从R中删除IR并调整包含剩余子矩形的父矩形

在进行多次Delete算法后存储利用率明显降低,因此需要对树进行周期性的重组操作,
对此文章并没有做进一步的讨论

接下来,有关分裂的算法就有点繁琐了。

SplitNode算法
输入:节点R
输出:新R+树
方法:找一个分割方法对节点进行分裂,创建两个新节点,如果有必要分裂操作向上或向下继续传递。
SN1,使用Pack算法的Partition程序来分割R节点,RECT和p分别指代与R节点相关的矩形和指针,同时让S1和S2指代分割后的两个子区域。R节点分裂后创建
   n1= ( p1,RECT1)和n2=(p2,RECT2)两个节点,并满足RECTi=RECTi∩Si(i=1,2)
SN2(填充新节点),将R的所有节点条目(pk,RECTk)放到ni中,这样RECTk就完全落在RECTi内(i=1,2)。对于那些节点有RECTk∩  RECTi≠RECTk
a)如果R是叶节点,就将RECTk放在两个节点中
b)否则,调用SplitNode算法以分割策略遍历分割这些子节点,分裂(pk,RECTk)为(pk1,RECTk1)和(pk2,RECTk2),这里RECTki完全落在RECTi中(i=1,2), 将这两个节点都添加到对应的节点ni中

SN3(向上传递节点分裂),如果R是根节点,创建一个只有两个孩子n1和n2的新根。
否则,让PR成为R的父亲节点,在R节点位置以带有孩子n1和n2的PR节点替代,如果PR条目数超过了M,触发SplitNode(PR)

Partition算法:该算法通过与x轴或y轴平行的直线来分割由N个二维矩形占据的空间,分割线的选择基于以下几个准则:最近距离,最小x位移和最小y位移,两个子区 域形成的最小覆盖空间,矩形分割的最少数量。前三个准则通过减少死空间的覆盖面来简化搜索,第四个准则通过限制分裂次数来限制R+树的高度扩展

Partition算法
输入:矩形集合S,第一个子区域的填充因子ff
输出:节点R,它包含了第一个子区域的矩形和剩余矩形集合S‘。
方法:以局部优化的方式分解实际空间为第一个子区域和剩下的子区域。
PA1,如果要被分割的空间包含的矩形数量不超过ff就不需要做分解工作;创建一个存有这些条目的节点R,算法结束返回(R,Φ)
PA2(计算最小x和y值),令Ox,Oy为给定矩形的最小x值和最小y值
PA3(沿着x轴执行Sweep算法),(Cx,x-cut)  =Sweep(“x”,Ox,ff),Cx是在x方向的分裂成本
PA4(沿着y轴执行Sweep算法),(Cy,y-cut)  =Sweep(“y”,Oy,ff),Cy是在y方向的分裂成本
PA5(选择一个分割点),选择有最小Cx值和最小Cy值的方式分割空间、矩形。创建一个节点R,它存有第一个子区域的所有条目。以S’代表落在第二个子区域的矩 形集合。算法结束返回(R,S‘)

Sweep算法
输入:执行扫描所沿的轴,沿着该轴扫描的起始点,填充因子ff
输出:计算得到的第一个子区域的属性,x_cut和y_cut值
方法:从Oxy开始扫描,计算属性直到达到ff值结束
SW1(找到第一个ff矩形),从Oxy开始,在沿着输入轴排序的矩形表单中选出下一个ff矩形
SW2(评估分割),衡量属性(最近邻居,最小覆盖,最少分裂数等)可以用来组织矩形,算法得出这些属性的计算成本,返回结束(成本,ff矩形的最大x坐标和最大y 坐标)

Pack算法:填充因子ff决定了R+树能填充的数量,填充数目越多,搜索越快。因此如数据库保持相对静态,将树填满将取得最佳性能。
输入:要进行组织的矩形集合S,树的填充因子ff
输出:一个“好”R+树
方法:递归地填充树每一层的条目
P1(不需要填充),如果N=│S│不大于ff,则建立R+树的根节点R并返回
P2(初始化),令AN=Φ,AN中为等待填充的下层矩形集合
P3(分割空间),(R,S’)  =  Partition(S,ff),如果算法在分割非叶节点,由于选择的分割一些矩形也需要进行分割,向下递归地进行分裂,如果有必要也要向上递归分
AN=append(AN,R),继续步骤P3直到S’=Φ
P4(递归填充非叶节点),返回Pack(AN,ff)
  

之后的实验分析部分就没翻译了,有兴趣的可以参照原文“THE  R+-TREE:  A  DYNAMIC  INDEX  FOR MULTI-DIMENSIONAL  OBJECTS”。

在csdn第一篇技术博文,mark一记,还望各位技术大牛多多指点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值