データ構造:仮想木におけるスプレー操作のアルゴリズム
仮想木(Virtual Tree)では、一部の辺は実線(solid)として扱われ、その他の辺は破線(dashed)として扱われます。通常のスプレー操作は、実線で構成される木(solid tree)の内部でのみ実行されます。仮想木内のノード y でスプレーを行うには、以下に示す手法が用いられます。
このアルゴリズムは、木を3回走査し(各パスで1回ずつ)、その都度木を書き換えていきます。第1パスでは、ノード y から開始して実線の木内でのみスプレーを行うことで、y から木全体の根までの経路が破線に変わります。続いて、スプライシング(splicing)によってこの経路を実線に変換します。最後にノード y でスプレーを行うことで、y が木の根になります。以下、より具体的にアルゴリズムを説明します。
スプレー操作 Splay(y) のアルゴリズム
パス1
仮想木を根に向かって上方向にたどります。ただし、スプレーは実線の部分木内でのみ実行します。このパスが終了した時点で、y から根までの経路はすべて破線になります。
パス2
ノード y から上方向へたどりながら、y の各真の祖先(proper ancestor)においてスプライシングを行います。このステップが終了した時点で、y から根までの経路は実線になります。また、ノード y および元の木(第1パス実行前の木)における y のすべての子は、左の子として配置されます。
パス3
ノード y から根まで、通常の方法でスプレーを実行しながら上方向へたどります。
応用例:外部経路重みの最小化とハフマン符号
このような木構造の操作は、事前の知識を活用して確率推定の精度を高めることにも役立ちます。与えられた葉の集合に対して、外部経路の重み(external path weight)が最小となる木を構築することが目標となります。
具体例として、以下の文字出現頻度表を用いたハフマン符号の構築を示します。
文字の出現頻度表
| 文字 | z | k | m | c | u | d | l | e |
| 出現頻度 | 2 | 7 | 24 | 32 | 37 | 42 | 42 | 120 |
ハフマン符号
| 文字 | 出現頻度 | 符号 | ビット数 |
|---|---|---|---|
| e | 120 | 0 | 1 |
| d | 42 | 101 | 3 |
| l | 42 | 110 | 3 |
| u | 37 | 100 | 3 |
| c | 32 | 1110 | 4 |
| m | 24 | 11111 | 5 |
| k | 7 | 111101 | 6 |
| z | 2 | 111100 | 6 |
上記の例に対応するハフマン木は下図のとおりです。

-
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回のクエリで取得される点の数を表します