《木》

提供: ORWiki
ナビゲーションに移動 検索に移動

【き (tree) 】

 平面上 (空間内) の幾何的な問題を解く際に対象領域を分割しながら部分領域に対応する木のノードを考えて分割の階層構造を木 (構造のデータ構造) を用いて表現する. 分割のしかたにより様々な木が得られそれぞれ特別な名前がつけられている. 計算幾何の代表的な問題である点位置決定 (point location) 問題(与えられた平面上のn点からなる直線分の平面グラフに対して, 質問点が与えられたとき, を含む面 (領域) を求める問題) および領域探索 (range search) 問題(与えられた平面上の点の集合に対して, 質問多角形が与えられたとき, に含まれるの点を列挙する問題)を例にとり説明する.

 これらの問題は, いずれも, 与えられた対象物の集合(以下台集合と呼ぶ)に対して, 質問が与えられたとき, とある種の条件をみたすの要素を列挙する問題であり, その意味で探索問題と呼ばれている. 同一の台集合に対して, 質問(問い合わせ)が繰り返し行われることも多いので, 台集合に前処理を施して質問に高速に応答できるように工夫する. すなわち, 質問に高速に応答できるようにを計算機内で違った形(データ構造)で表現する. 実際のデータベースでもこのような工夫がなされている.

 このような状況下では, を表現するデータ構造のための記憶領域, を構成するための手間(および作業領域), および質問に応答している時間 (探索時間) のつの基準に基づいて性能を総合的に評価しなければならない.

 点位置決定問題に対応する1次元の問題は, 一直線上に与えられた個の点の集合で分割された区間の集合に対して質問点が与えられたときを含むの区間を求める問題となる. これは, およびを平衡探索木で表現しておけば, の手間で応答できる. を構成するための手間および記憶領域はいずれもである. さらに点集合に新しい点が付加されたり古い点が除去されたりして台集合が変化するのが普通である. このときにはそれに応じても更新しなければならないが, この更新操作をダイナマイゼーション (dynamization) という. 1回の更新に要する手間がのダイナマイゼーション技術が多数知られている.

 領域探索問題に対応する1次元の問題は, 一直線上に与えられた個の点の集合に対して質問区間が与えられたときに含まれるの点をすべて列挙する問題となる. これもを平衡探索木で表現しておけば, の手間で応答できる. ここでは列挙される点の個数である. 更新の手間もである.

 次元の点位置決定問題や領域探索問題は1次元のこのような探索問題(の系列)に帰着して解かれている. たとえば, 点位置決定問題に対して有名な手法であるスラブ法 (slab method) では, グラフの頂点を通る (軸に) 垂直な直線を引いて平面を垂直な帯に分割する. この垂直な帯がスラブ (slab) と呼ばれる. 一つのスラブ内では, 横切るグラフの線分は上下関係で一列に並べることができるのでそれを平衡探索木で表現しておく. すると, 点位置決定問題は, 質問点に対して, を含むスラブを二分探索で見つける. 次にそのスラブ内で平衡探索木を利用してのすぐ上にある線分を求め, その線分を境界にもつ下の面をを含む領域として求めればよい. これは2次元の問題を個のスラブでの問題(1次元の問題)に帰着していると見なせる. 応答の手間はとなるが, 必要とするデータ構造を構築するための手間と記憶領域はとなる. これに対して, サーナクとタージャン (Sarnak-Tarjan) の残存化スラブ法 [2] では, 座標の値を時刻と考えて, 連続する2つのスラブの構造の変化が定数であることに注目して, 過去に遡っても探索が可能になるようにデータ構造に工夫をしている. これは点位置決定問題に対して, 理論的に最適なアルゴリズム (前処理時間, 記憶領域, 応答時間) の一つである.

 領域探索に対しては多角形は軸に平行な辺からなる長方形の場合が多く, そのときにはk-d木 (- tree), 四分木 (quadtree), 領域木 (range tree) などのデータ構造が有効である.

 領域木は平面上の点集合の領域を座標の中央値に基づいて二分割を繰り返してできる分割に対応する二分木で, 各ノードには対応する対象領域内にある点をすべて記憶しておく. すなわち区間木 (interval tree) の各ノードに対応する区間に入る点を平衡探索木などで記憶しているものである. すると軸に平行な質問長方形が与えられたとき, 区間が区間木の分割に対応して互いに共通部分をもたない区間の和集合として表現されるが, そのような区間に対応するノードで一次元の領域探索をすることでに含まれるSの点を効率的に列挙できる.

 -木は次元の空間の領域分割を表現するデータ構造の一つであり, 2次元の場合では, 根に全体領域が対応し, その左右の子には座標に注目して左右に二等分された点集合の領域が対応する. 次に分割された左(右)点集合領域を座標に基づいて上下に二等分しそれぞれ左(右)の子の左右の子に対応させる. 以下交互に繰り返して対応する領域に点が1個になったら分割を終了する. この分割法を表現したものが2-木である. 次元のときは, 座標, 座標, , 座標といってまた, 座標に戻り循環しながら分割していったものを表現する. これに対して, 四分木は次元平面の領域分割を表現するデータ構造で, 根に全体領域が対応し, 根のつの子には座標の中央値および座標の中央値を通る水平線および垂直線をひいて四分割された部分領域が対応する. さらにそれぞれの子に対応する部分領域を同様に水平線および垂直線で四等分しての4つの子に対応させる. このようにして得られる分割を表現するデータ構造が四分木である. 分割された領域に対象物がなくなると分割を停止する.

 -木も四分木も探索は同様で, 軸に平行な質問長方形が与えられたとき, と共通部分をもつ領域に対応するノードで1次元の領域探索をすることでに含まれるの点を効率的に列挙できる.

 八分木 (octree)は3次元空間の点の集合の分割を表現するデータ構造で, 3次元の領域探索などに用いら, 2次元平面における四分木に対応する. 計算幾何の様々な探索問題に対するアルゴリズムとその詳細については文献 [1] を参照のこと.



参考文献

[1] 伊理正夫監修, 腰塚武志編集, 『計算幾何学と地理情報処理(第2版)』, 共立出版, 1993.

[2] N. Sarnak and R.E. Tarjan, "Planar Point Location Using Persistent-Search Trees," Communications of the ACM, 29 (1986), 669-679.