LHV
本文是对On packing R-tree的一种补充,主要是在原先的Hilbert R-tree基础上提出了Largest Hilbert Value (LHV),即最大希尔伯特值
对此原先的Hilbert R-tree结构有稍许变化:
对于叶节点,基本保持不变,对于一个最多包含C条记录的叶节点,每个记录结构为 (R, obj_id)
其中R为对应的MBR,对于二维数据可表示为一个四元组 (xlow, xhigh, ylow, yhigh)
obj_id即为指向具体数据对象的指针
对于非叶节点,每个记录结构为(R, ptr, LHV)
其中R为对应MBR,ptr为指向子结点的指针,LHV为被该结点对应MBR包围的子节点中的最大希尔伯特值 (LHV is the largest Hilbert value among the data rectangles enclosed by R)
按这种方式构造的Hilbert R-tree如下:
对于LHV为107的非叶节点,其中包含三个子节点,Hilbert值分别为92,98和107
使用LHV的好处在于可以使用针对一维数据的排序方法,如图中第一个非叶节点下的子节点,其Hilbert值一定小于等于33,中间的非叶节点下的子节点,其Hilbert值一定小于等于107,又一定大于33. 若得知某区域的LHV,可以快速定位该结点的位置
Overflow handling
文章中还研究了当结点溢出时的分裂方式。当一个结点溢出分裂为两个结点时,我们称其为1-to-2 splitting policy
对于s-to-(s+1) splitting policy, 当某个结点要溢出时,我们可以先不马上分裂,而是查看其剩下的s-1个兄弟结点是否空闲
若空闲则将这个结点的部分记录分配给s-1个结点,且尽量使得s个结点的记录数均匀
若s-1个兄弟结点都满了,则新建一个结点,再执行类似的操作,对应的伪代码如下:
文章对某些分裂方法做了实验,结果如下:
其中空间利用率显然会越来越高,但是对于插入查询等操作的磁盘访问次数也会增加,因此综合这两点,作者认为2-to-3 split policy是最佳的