web-dev-qa-db-ja.com

avlツリー上の赤黒ツリー

AVLと赤の黒の木は、ノード内の赤と黒を除いて、両方とも自己均衡しています。 AVLツリーの代わりに赤黒ツリーを選択する主な理由は何ですか?赤黒木の用途は何ですか?

77
suren

AVLツリーの代わりに赤黒ツリーを選択する主な理由は何ですか?

赤黒木とAVL木の両方が最も一般的に使用される平衡二分探索木であり、保証されたO(logN) timeでの挿入、削除、ルックアップをサポートします。ただし、次の2つの比較ポイントがあります。

  • AVLツリーはより厳密にバランスが取れているため、ルックアップが高速になります。したがって、ルックアップ集中タスクでは、AVLツリーを使用します。
  • 挿入を集中的に行うタスクには、赤黒ツリーを使用します。
  • AVLツリーは、各ノードでバランス係数を保存します。これにはO(N)余分なスペースが必要です。ただし、ツリーに挿入されるキーが常に0より大きいことがわかっている場合は、キーの符号ビットを使用して赤黒ツリーの色情報を格納できます。したがって、そのような場合、赤黒木は余分なスペースを取りません。

レッドブラックツリーの用途は何ですか?

赤黒の木はより一般的な目的です。追加、削除、およびルックアップでは比較的うまくいきますが、AVLツリーではルックアップが高速になりますが、追加/削除が遅くなります。赤黒ツリーは次の場合に使用されます。

  • Java:Java.util.TreeMap、Java.util.TreeSet
  • C++ STL(ほとんどの実装):マップ、マルチマップ、マルチセット
  • Linuxカーネル:完全に公平なスケジューラー、linux/rbtree.h
90
Nikunj Banka

これを読んでみてください 記事

相違点、類似点、パフォーマンスなどに関する優れた洞察を提供します。

記事からの引用です:

RBツリーは、AVLツリーと同様に、自己分散型です。どちらもO(log n)ルックアップと挿入のパフォーマンスを提供します。

違いは、RBツリーが挿入操作ごとにO(1)ローテーションを保証することです。これが実際の実装で実際にパフォーマンスを犠牲にするものです。

簡略化されたRBツリーは、動的ノード構造のオーバーヘッドを持ち越すことなく、概念的に2〜3本のツリーであるという利点を得ることができます。物理的にRBツリーはバイナリツリーとして実装され、赤/黒フラグは2-3の動作をシミュレートします

私自身の理解では、AVLツリーとRBツリーはパフォーマンスの点でそれほど遠くありません。 RBツリーは単純にBツリーの変形であり、バランシングはAVLツリーとは異なる方法で実装されます。

10
jordan

パフォーマンスの違いに関する理解は長年にわたって改善されており、現在、AVLで赤黒ツリーを使用する主な理由は、CLRSでカバーされていないためか、あまり一般的ではないため、適切なAVL実装にアクセスできないことです。

両方のツリーは rank-balanced trees の形式と見なされますが、赤黒ツリーは 実世界のテストで約20% だけ一貫して遅くなります。または、 シーケンシャルデータが挿入される の場合、30〜40%遅くなります。

そのため、AVLツリーではなく赤黒ツリーを学習した人は、赤黒ツリーを選択する傾向があります。赤黒木の主な使用法は Wikipediaのエントリ で詳しく説明されています。

4
David McManamon

ここでの他の回答は、RBツリーとAVLツリーの長所と短所をうまくまとめていますが、この違いは特に興味深いことがわかりました。

AVLツリーは定数償却更新コストをサポートしていません[ただし、赤黒ツリーはサポートしています]

出典: Mehlhorn&Sanders(2008) (セクション7.4)

したがって、RBツリーとAVLツリーの両方がO(log(N))ルックアップ、挿入、削除、およびAVL/RBプロパティの復元ノードの挿入または削除は、O(1) 償却時間 で赤黒木の場合に行うことができます。

2
emanek

プログラマは通常、メモリを動的に割り当てることを好みません。 avlツリーの問題は、「n」個の要素について、ツリーの高さを格納するために少なくともlog2(log2(n))...(height-> log2(n))ビットが必要なことです!そのため、膨大なデータを処理する場合、各ノードに高さを格納するために割り当てるビット数を確認することはできません。

たとえば、高さを格納するために4バイトのint(32ビット)を使用する場合。最大高さは2 ^ 32です。したがって、ツリーに格納できる要素の最大数は2 ^(2 ^ 32)です(非常に大きいように見えますが、データのこの時代には大きすぎるとは思いません)。したがって、この制限を超えて撮影すると、高さを保存するためにより多くのスペースを動的に割り当てる必要があります。

これは私の大学の教授から提案された答えで、私にとっては理にかなっているように思えました!私が理にかなっていることを願っています。

編集:AVLツリーは、赤黒ツリーと比較してよりバランスが取れていますが、挿入および削除中により多くの回転が発生する場合があります。そのため、アプリケーションに頻繁な挿入と削除が頻繁に含まれる場合は、赤黒木を優先する必要があります。また、挿入と削除の頻度が低く、検索の頻度が高い場合は、AVLツリーをRed Black Treeより優先する必要があります。 -ソースGEEKSFORGEEKS.ORG

1
Prakhar Agrawal