R树
对于一棵M阶的R树,R树中每个非叶子结点都由若干个(MBR,child-pointer)数据对组成。MBR(Minimal Boundary Rect)为覆盖其对应孩子的最小边界矩形。这个最小外接矩形是个广义上的概念,可以类推到高维空间。child-pointer是指向其对应该子结点的指针。
叶子结点则是由若干个(MBR,Tuple-identifier)组成,其中MBR为包含对应的空间对象的最小外接矩形。Tuple-identifier是一个指向对应空间对象的指针。
一棵R树满足如下的性质:
- 除非它是根结点之外,所有叶子结点包含有m至M个记录索引(条目)。作为根结点的叶子结点所具有的记录个数可以少于m。通常,m=M/2。
- 对于所有在叶子中存储的记录(条目),I是最小的可以在空间中完全覆盖这些记录所代表的点的矩形(注意:此处所说的“矩形”是可以扩展到高维空间的)。
- 每一个非叶子结点拥有m至M个孩子结点,除非它是根结点。
- 对于在非叶子结点上的每一个条目,i是最小的可以在空间上完全覆盖这些条目所代表的店的矩形(同性质2)。
- 所有叶子结点都位于同一层,因此R树为平衡树。
R树的搜索、插入、删除算法具体可参考:
https://blog.csdn.net/houzuoxin/article/details/16113895
Packing Algorithm
使用插入算法构建一个R- tree指有几个缺点:
- 高加载时间,
- 较低的空间利用率(空间利用率:R树一个节点可以储存m至M个记录,所以空间利用率最低为m/M)
- R - tree结构需要检索大量的节点,以满足一个查询。
预处理算法特别适合程序中数据是静态的情况(即如果处理得当,R -tree的空间利用率几乎为100%,查询时间也得到了改善(因为在执行查询时需要访问的节点更少)。
General Algorithm
R树的静态pack Algorithm有多种:基于Hilbert曲线排序的打包算法、最近邻- x算法、Sort-Tile-Recursive(STR)算法。三种算法都有一个统一的大致过程。
算法的过程类似于从一组key构建B-tree,首先创建叶节点,然后依次创建更高的层次节点,直到根节点被创建。
我们假设数据文件由r个矩形组成,每个R树节点可以容纳n个矩形。
- 预处理数据文件,使r个矩形在[ r / n ]个连续的矩形组(每个矩形组中包含n个矩形,最后一组可能包含少于n个矩形。)中有序排列。将每个矩形组转换为一个叶节点,则每个叶节点包含小于等于n个矩形。
- 将[r/n]组矩形加载到page中,并将每个叶节点的(MBR, page-number)输出到临时文件中。page-numbers用作下一个更高级别节点中的子指针。
- 处理临时文件,递归地调用算法,将这些MBR打包到下一层的节点中,继续向上,直到创建根节点。
这三种算法的不同之处在于矩形在每一层的排列顺序。
STR
考虑一个由r个超矩形组成的k维数据集。超矩形是由形式[Ai, Bi]的k个区间定义的,它是所有1 < i < k的第i个坐标落在第i个区间内的点的轨迹。通过k = 2提供基本情况,可以很好地递归描述STR。
因此,我们首先考虑平面上的一组矩形。其基本思想是使用 sqrt(r/n) 个垂直切片对数据空间进行“平铺”,以便每个切片包含足够的矩形来填充大约 sqrt(r/n) 个节点。
-
我们假设坐标是矩形的中心点。计算出叶节点的个数P = [ r/n ]([ ]表示向上取整),设S = [ sqrt(P)]。根据x坐标对矩形进行排序,并将其划分为S个垂直切片。一个切片由S * n个从排序列表中连续取出的矩形组成。注意,最后一个切片可能包含少于S * n个矩形。
-
现在,根据y坐标对每个切片的矩形进行排序,并将它们分组到长度为n的节点中(the first n rectangles into the first node, the next n into the second node, and
so on)。
k > 2是上述方法的简单推广。首先,根据超矩形中心的第一个坐标对它们进行排序。然后将其划分到S = [ pow(P,1/k)]个slab中。每个slab包含n *[ pow(P,(k-1)/ k)]个连续的超立方体。然后每个slab递归的对剩下的k-1个坐标进行处理。
参考文献:
[1] Leutenegger S T, Lopez M A, Edgington J. STR: A simple and efficient algorithm for R-tree packing[C]. Proceedings 13th International Conference on Data Engineering, 1997: 497-506.