|
发表于 2005-5-8 00:00:13
|
显示全部楼层
中文资料不是很多,关于空间数据结构的,这里有一份较好的资料http://course.cug.edu.cn/space_data_struct/zhishixuexi/
下文是从Guttman的论文(1986)中摘出的,由于当时Guttman主要研究二维数据的存储,在下文中扩展为N维了,我用了一个N维矩形的概念,一个N维矩形各边是平行于坐标系的,可以使用它的两个对角顶点坐标来表示,三维矩形就是长方体。。
R-tree是动态平衡树,是B-数向高维空间的扩展,只在叶结点中存储空间对象信息,其内部结点在空间对象查询时起路径导向作用。R-tree的结点由若干个结构为(MBR,pChild)的单元组成。pChild是指向子结点的指针,如果结点是叶结点,那么pChild是指向最小空间包围体中所包含的空间对象列表。MBR是pChild所指向的所有子结点的最小N维包围矩形。
设M为结点中单元的最大数目。 为非根结点中单元公开数的下限,R-tree则有如下限定:
(1)每个叶结点所包含的单元个数介于m和M之间,除非它同时是根结点。
(2)每个叶子结点中的单元(MBR,pObject)中,MBR是包含n维空间对象的最小空间n维空间包围矩形。pObject指向空间对象。
(3)每个非叶结点的子结点数介于m和M之间,除非它同时是根结点。
(4)每个非叶结点的单元(MBR,pChild)中,MBR是包含子结点的MBR,pChild是指向子结点的指针。
(5)根结点至少有两个子结点,除非它同时是叶结点。
(6)所有的叶节点都处于树的同一层上。
3 R-tree的构造方法
R-tree是通过MBR层次嵌套而形成的树状结构。每次向树中插入空间对象时,首先在树中为之寻找合适的叶结点,将空间对象插入叶结点中,当叶结点因新对象的插入而导致溢出时,就要进行分裂,叶结点的分裂有可能会引起其父结点的分裂,这种分裂自底向上进行。最终可以得到一棵平衡树。
R-tree的构造算法主要由寻找合适的插入位置,结点分裂及树结构调整,这三个子算法构成。
(1) 为空间对象寻找合适的插入位置,设空间对象为p。
① 初始化结点A为R-树的根结点;
② 如果A是叶结点,则返回结点A的地址,A就是要找的叶结点L;
③ 如果A非叶结点,将p依次加入到结点A的各子结点中,分别计算MBR的覆盖域增量,其中覆盖域增量最小的子结点N所在的子树即为存放p的叶结点L所在的子树,如果有多个最小覆盖域增量相同的MBR,那么就选择MBR最小的。令A为N,然后重复进行上面的步骤②和③。
(2) 结点分裂
当叶结点中所能容纳的空间对象数多于最大存储量M,就要对叶结点进行分裂,叶结点的分裂可能会引发上层结点的分裂。当根结点也发生了分裂时,树的高度就有可能要增一层。
R-树结点的分裂主要研究如何将一个n维矩形域分裂为适当的两个新的n维矩形域,这两个新的矩形域所包含的对象数之和要等于原矩形域中的对象数,且都不小于R-树结点的子结点数的底限m个。Guttman在二维R-树的研究中提出以分裂后的两个矩形域MBR1和MBR2的面积之和最小作为最优分裂的判定标准,企图尽量缩小分裂后MBR1与MBR2的重迭区域达到最小,但由于寻找最优分裂的算法的时间复杂度为 ,因而Guttman给出了两种近似最优的分裂算法,时间复杂度分别为 与 ,称为平方耗费算法与线性耗费算法。
事实上,Guttman所定义的最优分裂标准只能保证局部上是最优的。对于全局最优的标准及算法,Guttman没有给出,所以后来许多研究者提出了各种全局和局部的优化标准及算法,产生了R-tree的诸多变种。由于R-tree的变种在结点分裂和最优判定标准大都比R-tree更为合理,所以本文不再详述R-tree的结点分裂算法。
(3) R-tree的调整
当一个叶结点添加了一个空间对象后,其MBR可能要发生变化,也可能会发生分裂,当对其进行调整后,又会引起其父结点的变化。所以每当空间对象插入到R-tree后,要自叶结点向上直至根结点进行调整。实际上调整路径就是寻找插入位置时所经路径,调整算法描述如下:
① 令A为为叶结点L,AA为因新的点插入而分裂的新结点(假如有的话)。
② 如果A为根结点,停止调整,返回。
③ 调整结点A的父结点P中与其相应单元的MBR,使其正好包含A结点中的所有单元
④ 如果存在因结点分裂而生成的新结点AA,则在A的父结点P中加入指向该结点的单元,如果P结点中单元个数超过M,则需分裂结点P,从而生成一个新的结点PP,并令A=P旁AA=PP。从②开始重复上面步骤。
调整算法返回后,如果根结点中的单元数超过M,则需将根结点分裂成两个结点,并再生成一个新结点作为R-树的根结点,而原根结点分裂成的两个结点作为其子结点。此时R-树增加一层。
关于R树的相关算法有许多,譬如近邻查询,范围查询,点查询等。另外对R-tree进行优化,产生了各种R-树的变种,再后来,有人干脆不用N维矩形作为包围体了,改用了球。还有人在结点分裂时采用了聚类分析方法。 |
|