このR*ツリーの実装を読んでいたところ、紙で定義されている方法とは異なる方法でオーバーラップを計算していることに気付きました。
この論文では、オーバーラップは次のように定義されています。
与えられたノード/rectkについて、 kとkの各兄弟( kを含まない)の間の交点の面積の合計を計算します。
オーバーラップ拡大は、この値のデルタであり、アイテムrがkに追加された場合のノードkのオーバーラップは何ですか。
このようなもの:
childOverlapEnlargement(Node child, item r)
{
childEnlarged = child.union(r);
sum = 0;
for(each sibling s of child which isn't node)
{
sum += area(childEnlarged.intersect(s)) - area(child.intersect(s));
}
return sum;
}
他の実装では、挿入されているアイテムと特定のノードの交差領域で並べ替えます。このようなもの:
childOverlapEnlargement(Node node, item r)
{
return area(node.intersect(r));
}
明らかに、それらの実装は、論文の定義よりも計算量が少なくて済みます。ただし、2つの計算が等しくなければならない理由は明らかではありません。
だから私の質問は:
- 2つの計算は常に同じサブツリーが選択されることになりますか?なんで?
- 異なるサブツリーが選択される結果になる場合、結果は論文の定義と同じくらい良いですか、それとも近いですか?それとも誤った選択でしたか?
編集:それらの実装を読み直して、2人の兄弟の交差点を比較しているのではなく、それぞれの潜在的な葉と挿入されているアイテムの交差点を比較していることに気付きました。不思議なことに、彼らは挿入されているアイテムと最も重ならない兄弟を選んでいます。挿入するアイテムと最も重なるノードに挿入しませんか?