データ構造におけるソリッドツリー(実線木)とは?基本概念と仮想木の構造
ソリッドツリー(実線木)の基本概念
与えられた森(forest)に対して、一部の辺を「破線(dashed)」に、残りを「実線(solid)」として扱います。各非葉ノードは、その子のうちただ一つだけを実線の辺で結び、それ以外の子はすべて破線の辺で接続します。
より具体的には、どの木においても「右端の子」へのリンクを実線で保持し、その他の子へのリンクはすべて「破線」として作成します。
木の分解と仮想木(virtual tree)
この操作の結果、木は複数の実線パス(solid path)の集合へと分解されます。実線パスの根どうしは、破線の辺によって別の実線パスと接続されます。
ここで、「仮想木(virtual tree)」と呼ばれる新たなデータ構造が構築されます。リンク・カット操作の対象となる各木 T は、同じノード集合を含む仮想木 V によって表現されます。ただし、元の木における各実線パスは、仮想木では二分木へと変換され、この二分木は可能な限り平衡(balanced)な形に保たれます。
したがって、仮想木の各ノードは、(実線の)左の子、(実線の)右の子、そして 0 個以上の(破線の)中間子(middle children)を持ちます。
仮想木の構造と親ノードの決まり方
言い換えれば、仮想木とは「破線の辺で連結された実線二分木の階層構造」です。各ノードは、親へのポインタ、および左の子・右の子へのポインタを保持します。
各パスは二分木へ変換されます。パス内のノード p の親 q は、実線木における p の中順(in-order/対称順)での後続ノードになります。ただし、p がその実線部分木内で対称順の最後のノードである場合は、p を含む実線部分木の根の親が、その親パスとなります。
Formally, Parentpath(v) = Node(Inorder(v) + 1)
中順と祖先・子孫の関係
任意のノード v について、左部分木内のすべてのノードは v より小さい中順番号を持ち、右部分木内のノードはより大きい中順番号を持ちます。この性質により、左部分木のノードはすべて「子孫」、右部分木のノードはすべて「祖先」として扱うことができます。
つまり、二分木における左の子の親は、元の木では「祖先」とみなされ、逆に二分木における右の子の親は、元の木では「子孫」とみなされます。この順序規約によって、コスト追加(add cost)処理を効率的に実行できるのです。
mincost と δ フィールドの定義
話を進めるために、いくつかの定義と記法を導入します。
mincost(x):x と同じ実線部分木内にある x のすべての子孫の中で、最小キー値を持つノードのコストを表します。
そして、各ノードには δcost(x) と δmin(x) という 2 つのフィールドを格納します。定義は次の通りです。
δmin(x) = cost(x) − mincost(x) δcost(x) = cost(x) − cost(parent(x)) (x が実線の親を持つ場合) δcost(x) = cost(x) (それ以外:x は実線木の根として扱う)
-
BSPツリー(空間分割木)とは?データ構造の基本原理と生成アルゴリズムを徹底解説
BSPツリーの概要 コンピュータサイエンスの分野では、バイナリ空間分割(Binary Space Partitioning:BSP)と呼ばれる手法が用いられています。これは、超平面(ハイパープレーン)を分割面として使用し、空間を再帰的に2つの凸集合へと分割していく方法です。この分割処理を繰り返すことで、領域内のオブジェクトを木構造(ツリー構造)として表現できるようになります。このデータ構造がBSPツリーです。 バイナリ空間分割は、1969年に3Dコンピュータグラフィックスの文脈で考案されました。BSPツリーの構造により、シーン内のオブジェクトに関する空間情報を高速に参照することが可能になりま
-
データ構造の範囲ツリー(レンジツリー)とは?仕組み・kd-treeとの違い・構築方法を解説
範囲ツリー(range tree)は、点の集合を格納するための順序付き木構造として定義されるデータ構造です。最大の特徴は、指定された範囲内に存在するすべての点を効率的に取得できる点にあり、実務では主に2次元以上の空間で実装されます。範囲ツリーはkd-tree(kd木)とよく似た構造を持っていますが、両者には明確なトレードオフがあります。範囲ツリーはクエリ時間が O(logd n + k) とkd-treeより高速である一方、必要な記憶領域は O(n logd-1 n) と大きくなります。ここで、d は空間の次元数、n は木に格納されている点の総数、k は1回のクエリで取得される点の数を表します