AVLと赤の黒の木は、ノード内の赤と黒を除いて、両方とも自己均衡しています。 AVLツリーの代わりに赤黒ツリーを選択する主な理由は何ですか?赤黒木の用途は何ですか?
AVLツリーの代わりに赤黒ツリーを選択する主な理由は何ですか?
赤黒木とAVL木の両方が最も一般的に使用される平衡二分探索木であり、保証されたO(logN) time
での挿入、削除、ルックアップをサポートします。ただし、次の2つの比較ポイントがあります。
O(N)
余分なスペースが必要です。ただし、ツリーに挿入されるキーが常に0より大きいことがわかっている場合は、キーの符号ビットを使用して赤黒ツリーの色情報を格納できます。したがって、そのような場合、赤黒木は余分なスペースを取りません。レッドブラックツリーの用途は何ですか?
赤黒の木はより一般的な目的です。追加、削除、およびルックアップでは比較的うまくいきますが、AVLツリーではルックアップが高速になりますが、追加/削除が遅くなります。赤黒ツリーは次の場合に使用されます。
これを読んでみてください 記事
相違点、類似点、パフォーマンスなどに関する優れた洞察を提供します。
記事からの引用です:
RBツリーは、AVLツリーと同様に、自己分散型です。どちらもO(log n)ルックアップと挿入のパフォーマンスを提供します。
違いは、RBツリーが挿入操作ごとにO(1)ローテーションを保証することです。これが実際の実装で実際にパフォーマンスを犠牲にするものです。
簡略化されたRBツリーは、動的ノード構造のオーバーヘッドを持ち越すことなく、概念的に2〜3本のツリーであるという利点を得ることができます。物理的にRBツリーはバイナリツリーとして実装され、赤/黒フラグは2-3の動作をシミュレートします
私自身の理解では、AVLツリーとRBツリーはパフォーマンスの点でそれほど遠くありません。 RBツリーは単純にBツリーの変形であり、バランシングはAVLツリーとは異なる方法で実装されます。
パフォーマンスの違いに関する理解は長年にわたって改善されており、現在、AVLで赤黒ツリーを使用する主な理由は、CLRSでカバーされていないためか、あまり一般的ではないため、適切なAVL実装にアクセスできないことです。
両方のツリーは rank-balanced trees の形式と見なされますが、赤黒ツリーは 実世界のテストで約20% だけ一貫して遅くなります。または、 シーケンシャルデータが挿入される の場合、30〜40%遅くなります。
そのため、AVLツリーではなく赤黒ツリーを学習した人は、赤黒ツリーを選択する傾向があります。赤黒木の主な使用法は Wikipediaのエントリ で詳しく説明されています。
ここでの他の回答は、RBツリーとAVLツリーの長所と短所をうまくまとめていますが、この違いは特に興味深いことがわかりました。
AVLツリーは定数償却更新コストをサポートしていません[ただし、赤黒ツリーはサポートしています]
出典: Mehlhorn&Sanders(2008) (セクション7.4)
したがって、RBツリーとAVLツリーの両方がO(log(N))ルックアップ、挿入、削除、およびAVL/RBプロパティの復元ノードの挿入または削除は、O(1) 償却時間 で赤黒木の場合に行うことができます。
プログラマは通常、メモリを動的に割り当てることを好みません。 avlツリーの問題は、「n」個の要素について、ツリーの高さを格納するために少なくともlog2(log2(n))...(height-> log2(n))ビットが必要なことです!そのため、膨大なデータを処理する場合、各ノードに高さを格納するために割り当てるビット数を確認することはできません。
たとえば、高さを格納するために4バイトのint(32ビット)を使用する場合。最大高さは2 ^ 32です。したがって、ツリーに格納できる要素の最大数は2 ^(2 ^ 32)です(非常に大きいように見えますが、データのこの時代には大きすぎるとは思いません)。したがって、この制限を超えて撮影すると、高さを保存するためにより多くのスペースを動的に割り当てる必要があります。
これは私の大学の教授から提案された答えで、私にとっては理にかなっているように思えました!私が理にかなっていることを願っています。
編集:AVLツリーは、赤黒ツリーと比較してよりバランスが取れていますが、挿入および削除中により多くの回転が発生する場合があります。そのため、アプリケーションに頻繁な挿入と削除が頻繁に含まれる場合は、赤黒木を優先する必要があります。また、挿入と削除の頻度が低く、検索の頻度が高い場合は、AVLツリーをRed Black Treeより優先する必要があります。 -ソースGEEKSFORGEEKS.ORG