ノードの視覚的な挿入と削除に推奨されるバイナリ ツリー Web サイト: Red/Black Tree Visualization (usfca.edu)
1。概要
Red-Black Tree (Red-Black Tree) は、自己平衡型二分探索木 (Binary Search Tree) です。通常の二分検索ツリーに基づいて追加の色属性といくつかの特定のルールを導入することでツリーのバランスを維持し、より効率的な挿入、削除、検索操作を提供します。赤黒木の時間計算量もO(log N)です
2. 特徴
-
二分探索ツリーの特性: 赤黒ツリーは二分探索ツリーです。つまり、左側のサブツリーのすべてのノードの値が現在のノードの値より小さく、右側のサブツリーのすべてのノードの値が現在のノードの値より大きいです。現在のノードの値。
-
ノードの色: 各ノードは赤または黒でマークされます。
-
ルート ノードとリーフ ノード: ルート ノードとリーフ ノード (NIL ノードまたは空のノード) は両方とも黒です。
-
レッド ノード ルール: 2 つの隣接するレッド ノードは存在できません。つまり、レッド ノードの親ノードも子ノードもレッド ノードになることはできません。
-
黒ノード ルール:ルート ノードからリーフ ノードまでのパス上の黒ノードの数は同じです(黒ノードの高さが等しい)。
-
最長パスと最短パス:赤黒ツリーの最長パスは最短パスの 2 倍を超えず、これによりツリーのバランスが確保されます。例:黒黒黒黒黒 (5) と赤黒赤黒 赤黒赤黒 赤黒 (10)
3. 赤黒木とAVLの違い
Red-Black Tree と AVL ツリーはどちらも、ツリーのバランスを維持し、効率的な挿入、削除、および検索操作を提供するという同様の目標を持つ自己バランス型の二分探索ツリーです。ただし、実装にはいくつかの違いがあります。
バランス要件: AVL ツリーでは、左右のサブツリー間の高さの差が 1 を超えないことが必要ですが、赤黒ツリーには明確な高さの差の制限はなく、赤黒ツリーの 5 つのプロパティを満たす必要があるだけです。
バランス調整操作: ノードを挿入または削除した後、AVL ツリーは高さの差の制限を満たすバランスを維持するためにさらに回転操作を実行する必要がある場合があります。赤黒ツリーのバランス調整操作は比較的少なく、通常は色の変換と回転のみが必要です。
メンテナンスのオーバーヘッド: AVL ツリーはより厳密なバランスを必要とするため、比較的多くのバランス調整操作が必要になります。そのため、頻繁に挿入および削除操作が行われると、AVL ツリーのバランス調整がさらに必要になり、メンテナンスのオーバーヘッドが高くなる可能性があります。赤黒ツリーはバランス調整操作が比較的少ないため、挿入と削除操作が頻繁に行われる場合、通常は赤黒ツリーの方がパフォーマンスが優れています。
メモリ使用量: AVL ツリーは通常、各ノードの高さの差を記録するために追加のバランス係数を必要とするため、占有されるメモリ空間は比較的大きくなります。赤黒ツリーは、ノードの色を記録するための追加の色属性のみを必要とするため、メモリ使用量の点で比較的優れています。
要約すると、AVL ツリーは厳密なバランスを維持する点で優れており、バランス要件が高いシナリオに適していますが、頻繁な挿入および削除操作ではメンテナンスのオーバーヘッドが大きくなります。赤黒ツリーは、バランス要件が比較的緩い場合にパフォーマンスが向上し、メンテナンスのオーバーヘッドが低くなり、幅広いアプリケーション シナリオに適しています。
4. 赤黒ツリーの挿入処理
(1) インサート1、2
(2) 3 を挿入します。親ノードは赤、叔父ノードは黒、タイプは右-右(RR)、左利き
(3) 4を挿入、親ノードは赤、叔父ノードも赤
親ノードと叔父ノードの両方が黒になり、祖父が赤になり、祖父が現在のノードになります。つまり、2 つのノードが現在のノードになります。このルールは再帰的に適用されます: (2 つのノードがルート ノード、黒になる)
(4) インサート10、12
(5) 11 を挿入します。親ノードは赤、叔父ノードは黒、タイプは右左 (RL)、最初に右に回転し、次に左に回転して色を変更する必要があります。
右利き
左利き
変色
5. 面接の質問
Java8 では、HashMap が実装されています。各バケットはリンク リストです。リンク リストの長さがしきい値 (デフォルトでは 8) より大きい場合、リンク リストは赤黒ツリーに変換されます。変換することを選択する理由BSTとAVLの代わりに赤黒の木?
答え:
BST がない場合: 増加または減少するシーケンスがリンクされたリストに縮退する可能性があります
異なる AVL: AVL のバランス条件はより厳しく、より頻繁な回転操作が必要となり、パフォーマンスの低下につながります。
さらに、AVL ツリーと比較して、赤黒ツリーは挿入および削除操作時のバランス調整が少なく、頻繁に挿入および削除操作が実行される場合には赤黒ツリーのパフォーマンスが向上する可能性があることも意味します。
したがって、リンク リストの長さがしきい値を超えた場合に、HashMap でデータ構造変換として赤黒ツリーを使用することを選択すると、バランスとパフォーマンスのより良いバランスが得られます。これにより、ほとんどの場合に良好なパフォーマンスが維持され、頻繁なローテーション操作によるパフォーマンスの低下が回避されます。