在(一)中,介绍了R树的一些结构及其性质,这里我们来学习一下它的算法。
R-tree search 算法描述:
基本思想:从根节点开始比较其中的每一个entry,找出所有有重叠部分的entry,然后再到这些entry所指向的叶子节点去做同样的事 情,直到找到叶子节点那一层中所有符合条件的entry。
判定标准是:搜索区域S与节点有重叠。
注意:一个节点中与之相重叠的entry可能不止一个,所以搜索算法可能会遍历树的所有路径。
插入算法描述:
1.调用ChooseSubtree来选择一个合适的叶子节点L能够容纳插入项E
2.若L还能容纳E,则加入。否则,调用Splitnode来获取分裂后的来年各个节点L和LL,它们包含E和L中原有的entry。
3.从下至上调整树:设P为L的双亲节点,ep为指向L的项,调整ep的MBR。创建一个新的项epp指向LL,计算其MBR并将其加入到P中若P也满了则再次分裂,直至根节点,若根节点也满了,则分裂根节点 ,产生一个新的根节点指向分裂后的两个节点。
基本思想:找到合适的叶子节点将其插入,若需分裂,则之下而上调整MBR。
ChooseSubtree算法描述:
1.设N为树的根节点
2.若N为叶子节点就返回。否则,选择N中的一项,使得该项容纳新项后面积扩展最小
3.让N指向其叶子节点,返回2。
标准是:面积扩张最小,在R树种中强调的最多的。
splitnode算法描述:
1.调用pickseeds选出2项,分别作为2组的第一项
2.调用distributeEntry 直到 所有项已经分配 或者 其中有一组已经有了M-m+1个索引项
3.若还有多余的,将他们分配到项数叫少的一组使得它的项数达到m
pickseeds算法描述:
1.对每一组entry E1和E2,计算d= area(E1 E2合并之后的MBR)-area(E1)-area(E2)
2.选择d最大的一对
distributeEntry 算法描述:
1.调用PickNext选择下一项
2.将其分配到某组中,该组在容纳该项后,MBR只需作最小面积扩展
PickNext算法描述:
1.对于剩下的每一个entry E 计算d1=<加入组1后MBR增加的面积>,同理计算d2
2.选出d1 和d2差距最大的一项