300 likes | 480 Views
R*-tree の説明用資料. The R*-tree: An Efficient and Robust Access Method for Points and Rectangles. 牧之内研究室 学部4年 石川卓司. 元の資料:. N. Beckmann, H.P. Kriegel, R. Schneider, B. Seeger Proc. 1990 ACM SIGMOD, pp.322-331.
E N D
R*-treeの説明用資料 The R*-tree:An Efficient and Robust Access Method for Points and Rectangles 牧之内研究室 学部4年 石川卓司 元の資料: N. Beckmann, H.P. Kriegel, R. Schneider, B. Seeger Proc. 1990 ACM SIGMOD, pp.322-331
R-tree、R*-treeは空間データベースに存在する空間オブジェクトを、 MBR(Minimum Bounding Rectangle)で表現する • MBRはオブジェクト(群)を包含する最小の矩形でかつその各辺が空間の座標軸に平行な領域
MBR (Minimum Bounding Rectangle) N次元上のオブジェクトの空間インデックスをN次元の2点として表現 Y p2(x2,y2,z2) p1(x1,y1,z1) X
R-treeとR*-treeの比較 • R*-treeはR-treeに加えて、MBRのMarginやOverlapの値を挿入アルゴリズムに用いることにより更に検索効率を向上させる • ノードのエントリがMを超えたときの処理の比較 R-tree • 分割を行う R*-tree • そのノードの高さでOverflowが起こるのは初めてかを調べる • Overflowが初めてならば、このノードのエントリのいくつかを選んで 再挿入(Reinsert)する(エントリの選択方法は後述) • Overflowが初めてでないならば、このノードを分割する • R,R*-treeはともに平衡木(部分木の深さの差が0)
R-treeの構造 エントリの 最大数 M=[ページサイズ/エントリサイズ] 最小数 m 2<=m<=M/2 葉でないノード 葉でないノードの エントリ(子ノードへの参照、MBR) 葉ノード 1ノードのエントリ数がMを越えるとノードを 分割 1ノードのエントリ数がmを下回ると そのノードを削除して、エントリをツリーに 挿入 葉ノードの エントリ(オブジェクトへの参照、MBR)
※ データベースの格納には一般には2次記憶装置、特に磁気ディスクが用いられる。※ データベースの格納には一般には2次記憶装置、特に磁気ディスクが用いられる。 磁気ディスクは入出力をページという単位で行う。 R-tree,R*-treeではこの入出力を効率よく行うため、1ノードを1ページとしてデータを ディスクに格納している。 1ページ エントリ エントリ 1ノード 1エントリのサイズ エントリの最大数 M= 1ページのサイズ ディスク装置 エントリの最少数 mは 2<=m<=M/2 となる。
R-treeの構造 Y R1 R2 R1 obj2 R2 R11 R12 obj5 R13 obj1 R21 R13 R12 R11 R22 obj3 R22 R21 obj4 obj3 obj1 obj5 obj2 obj4 X M=4 m=2
エントリの挿入、分割に用いる評価値 エントリを挿入したとき、1ノードの エントリ数がMを超えた場合、 ノードを2つに分割します。 Margin(MBRの各辺の合計) Y エントリを挿入したり分割したりする際、 ランダムで行ってしまうと、オブジェクトを 検索する時に時間がかかってしまう。 なぜなら、同一ノードのエントリ間で多くの 重なりができ、親ノードから子ノードへ範囲 を絞れなくなってしまうので、検索すべき子 ノードが増えてしまうからだ。つまり、同じノ ードのエントリはできるだけかたまっていた ほうがよい。 そのためにはある基準値を設定し、それに 沿ってエントリを挿入、分割すべきである。 R-treeではArea、R*-treeではAreaに加えて Margin、Overlapを基準値として用いている。 Area(領域) X 面積、体積など
R-treeの挿入アルゴリズム ChooseSubtreeアルゴリズム ①Nを根ノードとする ②Nが葉ノードならばNを返す そうでなければ領域の拡大が 最小である子ノードを選択 N (根ノード) ③Nを選択した子ノードにして ②へ 領域の拡大を 最小にする子 ノードを選択し ていく。
Area(領域)の拡大 挿入 増える領域の小さい 子ノードを選択。 R2 R1 拡大した領域 拡大した領域 R2 R2 R1 R1
R-treeの分割アルゴリズム QuadraticSplitアルゴリズム • ① ノードの、それぞれ2つのエントリE1, E2を含むMBR • Rを作成 • d = area(R) -area(E1のMBR) - area(E2のMBR)を計算 • dが最大であるE1とE2を選択 • 全てのエントリが分割されるか、2つのグループのうち1 • つがM-m+1個になるまでDistributeEntryを繰り返す。 • (最小値はmなので2つに分けた後の最大値はM-m+1) • ④ エントリが残っていたら、もう一方のグループにそれらを • 入れる M個のエントリ このようにE1、E2をとればdは最大になる。 このE1、E2をそれぞれ グループ1、2として分け、 残りのエントリをDistrib uteEntryによって追加していく。 E2 E1
R-treeの分割アルゴリズム DistributeEntryアルゴリズム ① 次に割り当てられるエントリを選択するためPickNext を呼び出す ② 選択されたエントリをAreaの拡大が少ないほうのグループに追加 PickNextアルゴリズム ① まだグループにないそれぞれのエントリEに対し d1 = EのMBRをGroup1に入れたときのAreaの拡大量 d2 = EのMBRをGroup2に入れたときのAreaの拡大量 を計算 ② d1とd2の差が最大であるエントリを選択 Group1 Group1 この場合、Group1にEを 入れたほうが拡大量が 少ないのでEをGroup1に入れる。 Group2 Group2
R-treeの分割アルゴリズムの問題点 ① ③ ② はじめに選んだMBRが小さい場合 • 距離は離れているが、1つの座標値がはじめに選んだMBRに近い場合、Areaの拡大が小さいため同じグループに分割される • グループが大きくなると、エリアの拡大は小さくなり片方にばかり分割される • 片方のグループにばかり分割され、グループがいっぱいになると残りのMBRは幾何的特性を使わずに、もう一方のグループに分割される MBR ④ ⑤ ①と⑤がはじめに選ばれたとする ⑤のグループに③が入る ⑤のグループに②が入る ①のグループに④が入る M=4 m=2
R*-treeの挿入アルゴリズム Eを挿入するエントリとする ① ChooseSubtreeを呼び出す ② ①の返り値の葉ノードLにEを挿入してもOverflowが起こらなければLにEを挿入。 Overflowが起こるならそのノードの高さでOverflowが起こるのは初めてかを調べる • Overflowが初めてならば、再挿入(Reinsert)を呼び出す • Overflowが初めてでないならば、Splitを呼び出す ③ Lを引数としてAdjustTreeを呼び出す、もし②でSplitが呼び出されていたら、分割されたノードLとLLを引数とする ④ Splitが根ノードを分割していたら、その分割されたノードを子ノードに持つ根ノードを新しく作成する。
ChooseSubtreeアルゴリズム Overlapとは対象のMBRとそれ以外の すべてのMBRとの重なっている領域の ことである。 overlap(Ek) = Σp i=1,i≠k area( Ek . rect ∩Ei . rect), 1 ≦ k ≦ p ①Nを根ノードとする ② Nが葉ノードならばNを返す そうでなければ ②-1 もしNの子ノードが葉ならば、そのノードの中でoverlapの 拡大が最小のエントリを選ぶ ②-2 もしNの子ノードが葉でないならば、そのノードの中でArea の拡大が最小のエントリを選ぶ ③ Nを選択したエントリの子ノードにして②へ ②-1と②-2それぞれの効果 ②-1 検索ノードの数を減らすことができる ②-2 なるべく近いエントリを選択できる
Overlapの拡大 挿入 Overlapの拡大 Overlapの拡大
R*-treeの再挿入アルゴリズム ReInsertアルゴリズム ① ノードのM+1個の全てのエントリに対し、そのノードのMBR の中心と、それぞれのエントリのMBRの中心との距離(Distance) を計算 ② 最も距離が遠いP個のエントリを求めて取り除く (Pは1≦P≦M-m+1の範囲で適当に決める) ③ 取り除いたエントリを、再挿入する
再挿入で用いる評価値(Distance) MBR Distance • OverflowしたノードのM+1個のエントリのすべてを含むMBRの中心とそれぞれのMBRの中心のユークリッド距離 例: 2 2 2 X+Y +Z など
R*-treeの再挿入の特徴 • 再挿入することによりノードの分割回数を減らすことできる。 再挿入するとき、そのノードから取り出すエントリの数を 0.3Mとした時、最もよい結果がでた。 • Overflowが起きたとき、同じ高さのノードでは一度しか再挿入を行なわない • 根ノードでOverflowが起きたら,再挿入は行わず分割を行う
R*-treeの挿入フローチャート START ChooseSubtree no Overflow Split yes 再起的呼出し no その高さではじめて yes ChooseSplitAxis 挿入 Reinsert Overlapが最小になるように分割 no no 根ノード 根ノード yes yes 修正、親ノードへ移る 修正、親ノードへ移る no 根ノードが分割 yes 新しく根ノードを作る AdjustTree END
2度目以降のoverflowの時 R*-treeの挿入アルゴリズム Splitアルゴリズム ① 分割を行なう軸(X軸、Y軸、Z軸など)を決定するため ChooseSplitAxisを呼び出す。 ② 選択された軸に対して、overlapが最小となる分割を選択 ③ エントリを2つに分割 ChooseSplitAxisアルゴリズム ① それぞれの軸に対しMBRをソートする ② S = 異なる分割の全てのmarginの和を計算 ③ Sが最小である軸を返す
ChooseSplitAxisアルゴリズム ① それぞれの軸に対しMBRの最小の点でソートする ② 2つに分割するとき、分割されたグループのmarginの和を 計算し、すべての分割の方法においての総和をSとする。 ③ Sが最小である軸を返す MBRの分割の方法は 最小がmなのでM-2m+2通り M=4 m=2のとき 分割の方法は2通り (11122)、(11222) X ① ②
P11 P12 X X 分割② 分割① P21 P22 この例では、この4つのmarginの和がX軸のSとなる。
Y ② ① X ① ② 軸に沿ってエントリが並んでいるとSは小さくなり、 軸に対して垂直方向にエントリがばらついているとSは大きくなる。 この図の場合X軸方向にエントリが並んでいるので Y軸のSよりもX軸のSのほうが小さくなり、 ChooseSplitAxisはX軸を返す。 その結果、X軸に垂直にグループを分断する形になる。 Splitでは、X軸に対するoverlap(長さ)が一番短い組み合わせで グループを分けるので、上の図の例ではX軸①の組み合わせで 分割される。
AdjustTreeアルゴリズム Lはエントリが挿入された葉ノードである ① N=Lとする、もし引数としてLLを持っていたら(Lは分割された)NN=LLとする ② もしNが根ノードならば終了する ③ Nの親ノードをPとする。Pの中でNのMBRを持つエントリをEnとする。EnのMBRをNにあわせて修正する。 ④ もし引数NNを持っていたら、NNへのポインタとNNのMBRを持つエントリEnnを新しく作成する。 PにEnnを挿入してもOverflowが起こらなければにEnnを挿入。 Overflowが起こるならPの高さのOverflowflagを調べる • Overflowが初めてならば、再挿入(Reinsert)を呼び出す • Overflowが初めてでないならば、Splitを呼び出す ⑤ N=P,もし④でSplitが呼び出されたらPを分割してできたPPを、NN=PPとして②へ
R*-treeの削除アルゴリズム Tを根ノード、Eを削除するエントリとする Deleteアルゴリズム ① FindLeafを呼び出す。Eが見つからなければ終了 ② 葉ノードLからEを削除 ③ Lを引数としてCondenseTree(次ページ)を呼び出す ④ もし根ノードに1つしかエントリが残らなければ、その子ノードを根ノードにする FindLeafアルゴリズム ① Tが葉ノードでなければ、Tのすべてのエントリに対してEを含むエントリFを見つける。Eが見つかるか,すべてのエントリをチェックするまで,Fが指している子ノードをTとして①を繰り返す • Tが葉ノードならば、すべてのエントリに対してEを探して,見つかれば,Tを返す
CondenseTreeアルゴリズム Lはエントリを削除された葉ノード ① N=Lとする。削除されたノードを格納する集合Qをつくり、初期値としてQは空とする ② Nが根ノードならば、⑥へ そうでなければ、Nの親ノードをP、EnをPノードのNのMBRを持つエントリとする ③ もしNのエントリ数がmより少ないならば、Enを削除して、NをQに入れる ④ もしNが削除されなければ、EnのMBRを修正する ⑤ N=Pとして②へ戻る ⑥ 削除されたノードの集合QのすべてのエントリをInsertする。 ただし,エントリは削除されたときと同じ高さのノードに挿入する ※ReInsertでは、対象のノードのエントリ数がmより小さくならないので、 CondenseTreeは呼び出されずに、AdjustTreeが呼び出される。
R5 R,R*-treeの平衡木が保たれる理由 • 木の高さに変更が生じるのは挿入と削除のとき • 挿入のとき 新しく作成されたノード R’1 R’2 挿入 ノードの分割 R3 R2 R1 R4 R4 R3 R2 R1 R5 M=4のノード 分割されたノード このように分割することによって木の平衡を保つ
例 ReInsert,Splitを繰り返し、 親ノードのエントリ数がM になる。 エントリを7つ挿入 エントリを挿入 親ノードが分割される。 新しく親ノードが作られる。 よって、木の平衡は保たれる。 ReInsertで同じノードに挿入する ことになり、ノードを分割。
根ノード • 削除のとき R1 R2 新しく作成された根ノード R13 R12 R11 R21 R22を削除 R21 R13 R12 R11 R22 m=2のノード このように削除することによって木の平衡が保たれる