R*树(三)

来源:互联网 发布:软件测试职位薪资 编辑:程序博客网 时间:2024/05/02 05:00

     在一、二中,我写了R树的一些性质和算法。在此之后呢,在1990年的时候,beckmann对R树进行了改进,提出了R*树。他们在sigmod发表了一篇名叫“The R*-tree:An Efficient and Robust method for points and Rectangles”.R*树和R树在结构上完全相同。由前面的介绍可知,R树的算法描述中,仅仅考虑了面积扩展最小这一点,而beckmann提出的R*树在面积的基础上还引入了overlap-value以及margin-value等因素。

    一是在chooseSubtree算法中,在非叶子结点层子树的选择是沿用Guttman的面积增量作为标准,而在叶子结点层子树采用相互重叠部分增量作为标准。ChooseSubtree算法描述:

       1.设N为树的根节点

       2.若N为叶子节点就返回。否则,如果N指向叶子节点,选择N中的一项,使得该项容纳新项后重叠面积扩展最小

                                                   如果N不指向叶子节点,选择N中的一项,使得该项容纳新项后面积扩展最小

       3.让N指向其叶子节点,返回2。

   二是在分裂算法中,要将M+1个entries分到2个group中。

       基本思想:沿着分裂axis ,先按lower值排序,在按upper值排序,对于每种排序有M-2m+1中分布,例如:第k中分布的情况是这样的:group1包含前面(m-1)+ k个entry,剩下来的分给group2。

三个 标准:         

      Area-value
area[bb(1st group)] + area[bb(2nd group)] 
     Margin-value
margin[bb(1st group)] + margin[bb(2nd group)]
    Overlap-value
area[bb(1st group)]   Ç  area[bb(2nd group)] 

            bb  denotes  bounding box of a set of rectangles

   分裂算法描述:

         1.调用ChooseSplitAxis 决定分裂axis

         2.调用ChooseSplitIndex 选择沿着分裂axis上的最佳分布

         3.根据上面的分布,分裂成2个节点

       ChooseSplitAxis 算法描述:

               1.对于每一个axis,分别按lower值和upper值排序,计算各种可能分布的所有的margin-value值的和S

               2.选择S最小的那个axis作为分裂Axis

       ChooseSplitIndex 算法描述:

               1.根据已选定的axis,计算出各种分布的overlap-value,选出overlap-value值最小的那一个分布作为最终分布

   插入算法描述:

        1.调用ChooseSubtree选择一个叶子节点N来存放新的索引项E

        2.如果N不满,就插入E,否则,调用OverflowTreatment