回答:
AVLツリーの代わりに赤黒木を選択する主な理由は何ですか?
どちらの赤黒の木とAVL木が最も一般的に使用されているバランス二分探索木と彼らが保証さで挿入、削除およびルックアップをサポートO(logN) time
。ただし、次の2つの比較点があります。
O(N)
余分なスペースが必要です。ただし、ツリーに挿入されるキーが常に0よりも大きいことがわかっている場合は、キーの符号ビットを使用して赤黒ツリーの色情報を格納できます。したがって、そのような場合、赤黒木は余分なスペースを取りません。レッドブラックツリーの用途は何ですか?
赤黒木はより一般的な目的です。追加、削除、およびルックアップは比較的うまく機能しますが、AVLツリーは、追加/削除が遅くなる代わりに、ルックアップが高速になります。赤黒木は以下で使用されます:
java.util.TreeMap
、java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
真実ではない。
std:: map
を義務付けておらず、友人たちは特定の構造を使用しています。libstdc ++とDinkumwareは少なくとも赤黒木を使用していますが、それは実装に委ねられており、実際には正しいようです。
この記事を読んでみてください
違い、類似点、パフォーマンスなどについて、いくつかの良い洞察を提供します。
これは記事からの引用です:
RBツリーは、AVLツリーと同様に、自己バランスです。どちらもO(log n)検索と挿入のパフォーマンスを提供します。
違いは、RBツリーは挿入操作ごとにO(1)回転を保証することです。これが、実際の実装で実際にパフォーマンスにかかるコストです。
単純化されたRBツリーは、動的ノード構造のオーバーヘッドを持ち越さずに、概念的に2〜3ツリーであることからこの利点を獲得します。物理的にRBツリーはバイナリツリーとして実装され、赤/黒フラグは2-3の動作をシミュレートします
私自身が理解している限り、AVLツリーとRBツリーはパフォーマンスの点ではそれほど遠くありません。RBツリーは単にBツリーのバリアントであり、バランシングはAVLツリーとは異なる方法で実装されます。
パフォーマンスの違いに関する私たちの理解は年を重ねるごとに向上し、今ではAVLで赤黒木を使用する主な理由は、CLRSでカバーされていないためか、あまり一般的ではないため、適切なAVL実装にアクセスできないことです。
現在、両方のツリーはランクバランスツリーの形式と見なされていますが、実際のテストでは赤黒木は常に約20%遅くなっています。または、順次データが挿入されると、30〜40%遅くなります。
したがって、AVLツリーではなく赤黒木を研究した人は、赤黒木を選択する傾向があります。赤黒の木の主な用途は、ウィキペディアのエントリで詳しく説明されています。
ここでの他の答えは、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バイトの整数(32ビット)を使用する場合。最大の高さは2 ^ 32になる可能性があるため、ツリーに格納できる要素の最大数は2 ^(2 ^ 32)です(非常に大きいようですが、このデータの時代では、大きすぎるとは思いません)。したがって、この制限を超えると、高さを格納するためにより多くのスペースを動的に割り当てる必要があります。
これは私の大学の教授が提案した答えです。私が理にかなっていると思います。
編集:AVLツリーは赤黒ツリーと比較してバランスが取れていますが、挿入および削除中に回転が多くなる可能性があります。したがって、アプリケーションに頻繁な挿入と削除が頻繁に含まれる場合は、Red Blackツリーをお勧めします。また、挿入と削除の頻度が低く、検索の頻度が高い場合は、レッドブラックツリーよりもAVLツリーを優先する必要があります。--Source GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
AVLツリーのノードの高さを実装する必要はありません。あなたが旧姓1ビットの各ノードのための追加情報のを(Iが最大AM最高サブツリーと(兄弟)))。AVとLによって提示されたように、2つのビットを追加する(子は左と右の方が高い)と、従来の方法よりも便利です
AVLツリーの再バランスは、以下のプロパティを満たす必要があります。(Wikiリファレンス-AVLツリー)
AVLツリーでは、ノードの2つの子サブツリーの高さは最大で1つだけ異なります。常に2つ以上異なる場合は、このプロパティを復元するためにリバランスが行われます。
したがって、これはAVLツリーの全体的な高さが狂ってしまうことはあり得ないことを意味します。つまり、AVLツリーを使用すると、ルックアップが改善されます。また、高さを狂わせないように追加の操作(回転)を行う必要があるため、ツリーの変更操作は少しコストがかかる可能性があります。