web-dev-qa-db-ja.com

赤黒木の応用

赤黒(RB)ツリーの用途は何ですか? RBツリーのみを使用でき、他のデータ構造は使用できないアプリケーションはありますか?

42
nishant

red-black treeself-balancing binary search tree の特定の実装であり、今日では最も一般的な実装の選択のようです。

二分探索木 は、関連する値を持つ一連のキーを格納する有限マップを実装するために使用されます。キーのみを使用し、値を保存しないでセットを実装することもできます。

たとえば、すでにソートされているキーを挿入した場合など、ツリーがリストに退化する可能性があるため、良好なパフォーマンスを保証するにはツリーのバランスをとる必要があります。

ハッシュテーブルに対する検索ツリーの利点は、ツリーをソート順に効率的にトラバースできることです。

AVL-trees は、平衡型二分探索木の別のバリアントです。赤黒木が知られる前は人気があった。それらはより慎重にバランスが取れており、左と右のサブツリーの高さの最大差は1です(RBツリーは最大で2の係数を保証します)。彼らの主な欠点は、リバランスがより多くの労力を要することです。

したがって、赤黒の木は確かに良いですが、このアプリケーションの唯一の選択肢ではありません。

37
starblue

赤黒木は、自己均衡BSTのクラスからのものであり、他の人が回答したように、そのような自己均衡ツリーを使用できます。赤黒木はシステムシンボルテーブルとして広く使用されていることを付け加えておきます。たとえば、次の実装に使用されます。

  • Java:Java.util.TreeMap、Java.util.TreeSet。
  • C++ STL:マップ、マルチマップ、マルチセット。
  • Linuxカーネル:完全に公平なスケジューラー、linux/rbtree.h
16
Nikunj Banka

非常に具体的なパフォーマンス要件がない限り、R-Bツリーは、他の自己分散バイナリツリー(AVLツリーなど)に置き換えることができます。それらの2つを選択することは、基本的にはパフォーマンスの最適化です。これらは同じ基本的な操作を提供します。

どちらか一方が他方よりも明らかに「高速」であるというわけではありません。それらが十分に異なるため、それらの特定の使用法ではパフォーマンスがわずかに異なる傾向があり、それ以外はすべて等しくなる傾向があります。したがって、要件を注意深く、または偶然に描いた場合、どちらか一方が「十分に速く」使用できるようになり、もう一方はそうではなくなる可能性があります。 R-BはAVLよりもわずかに高速な挿入を提供しますが、ルックアップがわずかに遅くなります。

9
Steve Jessop

赤黒は特定の場合にのみ使用できるなどのルールはありません。1回だけツリーを作成する必要があり、何度もクエリを実行する必要がある場合は、AVLツリーにアクセスできるため、アプリケーションに依存します。 AVLツリー検索は非常に高速です。ただし、厳密にバランスが取れているため、挿入と削除に時間がかかる場合があります。AVlツリーは、1回だけデータ構造を構築する必要がある言語辞書に使用でき、完全に赤い黒ツリーが使用されます。現在、現在のLinuxカーネルで使用されているFair Schedulerです。

赤黒木に適用された制約は、ルートから最も遠い葉までのパスが、ルートから最も近い葉までのパスの2倍以下であることも強制します。

ちなみに、ここで赤黒木に必要なさまざまな検索や挿入などの時間を探すことができます

        Average     Worst case

Space   O(n)        O(n) 

Search  O(log n)    O(log n)

Insert  O(log n)    O(log n)

Delete  O(log n)    O(log n)
5
aman Verma