木構造のリバランス(再平衡化)アルゴリズム徹底解説:DSW・CoWツリー・並行スキップリスト
リバランス(再平衡化)アルゴリズムは、主に以下の3つのアプローチによって実現できます。それぞれの特徴と実装方法を詳しく見ていきましょう。
Day-Stout-Warren(DSW)アルゴリズム
リバランス処理を実際に実装する方法として、Day-Stout-Warren(DSW)アルゴリズムが知られています。このアルゴリズムの最大の特徴は、ノード数に対して線形時間(O(n))で処理が完了する点です。
以下に、DSWアルゴリズムの基本的な流れを擬似コード形式で示します。
- 「疑似ルート(pseudo-root)」と呼ばれるノードを新たに確保し、木の実際のルートを疑似ルートの右の子として接続します。
tree-to-vine関数を呼び出し、疑似ルートを引数として渡すことで、木をソート済みの連結リスト(バイン:vine)へと変換します。vine-to-tree関数を呼び出し、疑似ルートと木のサイズ(要素数)を引数として渡すことで、ソート済み連結リストを再び平衡化された木へと変換します。- 疑似ルートの右の子を、新しい木の実際のルートとして設定します。
- 最後に、不要となった疑似ルートを解放(dispose)します。
この一連の処理により、任意の二分探索木を完全に平衡な木へと効率的に再構築できます。
「Copy-On-Write(CoW)」ツリー
線形化可能性(linearizability)の欠如を許容できるのであれば、「コピーオンライト(Copy-On-Write)」ツリーの採用が有効です。線形化可能性の欠如とは、たとえば「値を書き込んだ直後に検索しても見つからないが、100ミリ秒〜10秒後には必ず見つかる」という、結果的に一貫性(eventual consistency)が保たれる状態を指します。
この方式では、すべての書き込み操作(リバランスを含む)を単一のスレッドが担当します。そして定期的に木全体を読み取り専用のコピーとして複製し、それをアトミックに公開します。こうすることで、読み取り側のスレッドは一切の並行性制御(ロックなど)なしに、安全かつ高速にツリーへアクセスできるようになります。
並行スキップリスト(Concurrent Skip List)
もう一つの有力な選択肢が並行スキップリストの実装です。スキップリストは、検索・削除・挿入のすべてを対数時間(O(log n))の平均計算量で実行でき、さらに並列化が容易であるという大きなメリットがあります。
Javaで実装する場合、標準ライブラリとしてロックフリー実装(java.util.concurrent.ConcurrentSkipListMap など)が提供されているため、手軽に利用できます。
並行スキップリストや平衡探索木に関する詳細な情報源では、クロマティックツリー(chromatic tree)についても言及されています。これは、並行環境下でのリバランス処理に最適化された二分探索木であり、マルチスレッド環境での高性能なデータ構造として注目されています。
-
多方向ツリー(多分木)とは?定義とm-way探索木の条件をわかりやすく解説
多方向ツリー(多分木)の定義多方向ツリー(multiway tree、多分木)とは、各ノードが2つ以上の子ノードを持つことができる木構造のことです。通常の二分木では子ノードは最大2つに制限されていますが、多方向ツリーではこの制限が緩和され、より柔軟なデータ構造を実現できます。もし多方向ツリーの子ノード数の最大値が m 個である場合、その木は「次数 m の多方向ツリー(m-way tree、m分木)」と呼ばれます。ノードの構造これまで学習してきた他の木構造と同様に、m-way ツリーの各ノードは以下の要素で構成されます。キー(鍵)フィールド: 最大 m-1 個子ノードへのポインタ: 最大 m 個
-
m分木(m-aryツリー)とは?定義・m-way探索木の条件・B木との関係を解説
コンピュータサイエンスにおけるm分木(m-ary tree)とは、ノードの集合を階層的に表現したデータ構造であり、一般的に次のように定義されます。木は根(ルート)ノードから始まる。木の各ノードは、子ノードへのポインタのリストを保持している。各ノードが持てる子ノードの数はm以下である。m分木の典型的な実装では、子ノードを格納するためにm個の参照(ポインタ)からなる配列を使用します。ここで、mは子ノード数の上限値(最大値)である点に注意してください。実際の子の数がmより少ない場合は、未使用のスロットが生じます。m分木の構造イメージm-way探索木の条件m-way探索木(m-way search t