赤黒木はこの方法で学ぶのが正しいです!

赤黒木はまだこの方法で学ぶことができますか?私は前にその気持ちを見たことがあります

赤黒木は実際には神秘的ではありません。私の前回の記事を読んで、4次のB木の性質を知っていれば、この記事を通して、赤黒木が何であるかを確実に理解できると思います。

わかりやすくするために、2つの部分に分かれています。前回の記事では、ツリーのデータ構造の開発プロセスを大まかに紹介しました。これらはすべて、赤黒木を学習するための基礎として使用されます。ポータルは次のとおりです:https://blog.csdn.net/weixin_44829930/article/details/111658813(強くお勧めします:赤黒木を学ぶ前にこれらのコンテンツを習得する必要があります)

なぜ赤黒木があるのですか?

前の記事で説明したAVLツリーを振り返ると、要素を見つけるのは非常に高速です。時間計算量はLog(n)レベルですが、最大の欠点は、最大でLog(n)回調整する必要があることです。 。、目的は左右子树高度差不超过1このプロパティを維持することです。このプロパティはAVLツリーの動作を非常に良くしますが、毎回調整する必要があります。これは、いくつかのシナリオでトレードオフがあるため、バランスを維持するために支払われるパフォーマンス価格です。ダウンロードにはまだ欠陥があるため、より人気のある赤黒の木が誕生しました。これは、HashMapの最下層など、多くの分野で使用されています。你可以将它理解为它相对于AVL树是牺牲了一小部分平衡性的,因此它的综合性也能要强于AVL树

赤黒木とは何ですか?

紹介する前に、4次のBツリーを知っていることを前提としています。さて、始めましょう!

一般的な赤と黒の木の外観をみんなに見せましょう

ここに画像の説明を挿入

唖然としませんか?もしそうなら、そうです。あなたがそれのいくつかを理解するために、私はあなたにその特性のいくつかを教えます:

  1. ノードは红色的または黑色的

  2. 根节点黒です

  3. リーフノード(空节点)はすべて黒です

  4. 赤いノード子节点はすべて黒です

    赤いノード父节点はすべて黒です

    ルートノードからリーフノードへのパスには、2つの連続する赤いノードを含めることはできません。

  5. 任意のノードからリーフノードへのすべてのパスには、同じ数の黒いノードが含まれています

上記のモデルを読んだ後、あなたはまだ少し混乱していますか?それは問題ではありません。おなじみの4次Bツリーと比較してみましょう。
ここに画像の説明を挿入

ここに画像の説明を挿入

明らかではありませんか?それなら私はあなたを変形させます、

次のようになります。

ここに画像の説明を挿入

パターンは見つかりましたか?これを見ると、前回の記事でBツリーと言った理由が理解できるはずです。実際、赤黒木を別の観点から見ると、赤子ノードとその親ノードが組み合わされて4次Bツリーのノードと見なされ、その後の学習プロセスで完全に実行できます。それをBツリーの学習と見なしてください。红黑树的性质和4阶B树是等价的

  • 概要

    赤黒木を変形した後、非常に短い、つまり比較的バランスが取れていることがわかりますが、変形する前は、AVLツリーほどバランスが取れていないこともわかります。 。

赤黒木のパフォーマンスはどうですか?

まず、ここでは赤黒木の特定の追加と削除について詳しくは説明しません。インターネット上で、赤黒木の追加と削除のプロセスに特化した作品を見つけることができます(ここにヒント:実際、これはBツリーとまったく同じです。したがって、赤黒木の追加と削除の操作をすばやく学習するには、Bツリーの追加と削除の操作を学習するだけで済みます)、本文主要目的是想告诉你的是怎样去学红黑树,而不是红黑树的具体内容

パフォーマンスの比較:

比較指標 AVLツリー 赤黒木
残高 最も厳しい 比較的緩い
追加 O(logn)ルックアップ+
O(logn)回転調整
O(logn)検索+
O(1)回転調整
削除 O(logn)検索+
O(1)回転調整
O(logn)検索+
O(1)回転調整

表の比較はあまり明白ではないかもしれませんが、さらに分析してみましょう。

  1. AVLの構造はRB-Treeよりもバランスが取れており、ノードの挿入と削除はツリーの不均衡を引き起こす可能性が高いため、大量のデータを挿入または削除する必要がある場合は、AVLをより頻繁にリバランスする必要があります。したがって、RB-Treeは、多数のノードを挿入および削除する必要があるシナリオでより効率的です。当然、AVLはバランスが取れているため、AVL検索の方が効率的です。

  2. ノードを挿入するとツリーの不均衡が発生する場合、AVLとRB-Treeの両方で必要な回転操作は最大で2つだけです。つまり、両方ともO(1)ですが、ノードを削除するとツリーの不均衡が発生する場合、最悪の場合次に、AVLは削除されたノードからルートまでのパスに沿ったすべてのノードのバランス。したがって、O(logN)の回転の大きさが而RB-Tree最多只需3次旋转必要であり、O(1)の複雑さのみが必要です。

  3. AVLツリーのバランスが最も良いため、挿入された要素が同じ場合、ツリーの高さはAVLツリーの中で最も短くなければなりません。したがって、検索の数が挿入と削除の数よりもはるかに多い場合、 AVLツリーが使用され、その逆も同様です。赤黒ツリー

総括する

同じ挿入要素の場合、ツリーの高さはAVLツリーの最短である必要があります。したがって、検索の数が挿入と削除の数よりもはるかに多い場合は、AVLツリーが使用されます。それ以外の場合は、赤黒木を使用

おすすめ

転載: blog.csdn.net/weixin_44829930/article/details/111771454