記事ディレクトリ
序文
なぜ赤と黒の木がこれほど人気があるのでしょうか?皆さんは、面接中に必ず「赤黒の木とは何ですか?なぜ赤黒の木を使用する必要があるのですか?」と質問することをよく知っているはずです。まるで、赤と黒の木を知っているということは、彼がすごいということを意味しているかのように、それをよく理解しているようだ。
とにかく、基礎ができているかどうかに関係なく、赤黒木をまだ理解していない場合は、この入門書が赤黒木をより簡単に理解するのに役立つことを願っています。
赤黒木の提案
まず、赤黒木とは何でしょうか?赤黒ツリーは自己平衡型二分探索ツリーでもあり、基本が分からない場合は、前の記事にアクセスしてデータ構造と AVL ツリーについて学ぶことができます。
なぜ赤黒の木を使うのでしょうか?AVL ツリーと比較して、赤黒ツリーはより効率的です。なぜ?
AVL ツリーは回転操作を使用して、ノードの挿入または削除時にノードの左右のサブツリーの高さの差が 1 を超えないようにして、ツリーのバランスを確保していることがわかっています。しかし、AVL ツリーのバランスは比較的厳しく、基本的にノードの追加や削除のたびにローテーションが発生し、頻繁にローテーションすると効率が悪くなってしまうため、赤黒ツリーが提案されました。
誰もが知っているいくつかの定義
赤黒木について学ぶときに、誰もが次の定義を見たことがあると思います。
- 各ノードは赤または黒である必要があります。
- ルート ノードは黒でなければなりません。
- 葉の節はすべて黒です。
- 2 つの赤いノードを隣接させることはできません。現在のノードが赤の場合、子ノードは黒でなければなりません。
- 任意のノードから各リーフ ノードへのパス内の黒いノードの数は同じです。
そして待ってください。
この定義を読んだら、なぜ赤黒ツリーが AVL ツリーよりも効率的であるか理解できますか? どうせ理解できないので、これらの定義に影響されないでください、ましてやこれらのことを暗記しないでください。
赤黒ツリーは本質的に 2-3-4 ツリーであり、赤黒ツリーはキャッシュを使用するという主張もありますが、個人的には理解できません。
赤黒木の効率を理解する
正直に言うと、初めて赤黒の木に触れたとき、最初に冒頭の定義に衝撃を受けたのですが、次に、左右に回転することでバランスが保たれていることに気づき、AVLの木と何ら変わらないように感じました。それどころか、いわゆる「赤黒ツリーは AVL ツリーよりも効率的」であることは言うまでもなく、AVL ツリーよりも複雑で理解しにくいです。
赤黒ツリーが AVL ツリーよりも効率的であることをどのように理解すればよいでしょうか?
AVL ツリーと比較して、赤黒ツリーのバランスは緩く、それほど厳密ではない、つまり、赤黒ツリーの回転数はそれほど頻繁ではないため、赤黒ツリーの方がAVL ツリーよりも効率的です。
では、赤と黒の木の緩やかなバランスを反映するにはどうすればよいでしょうか? スピンが比較的少ないのはなぜですか? 上記の 2 つの定義に注目してみましょう。
- 2 つの赤いノードを隣接させることはできません。現在のノードが赤の場合、子ノードは黒でなければなりません。
- 任意のノードから各リーフ ノードへのパス内の黒いノードの数は同じです。
これら 2 つの定義は、上記の 1 により、ツリー内の最も長いチェーン上のノードが赤と黒であることを意味します。上記 2 により、最短のチェーンはすべて黒いノードになります。
上の図でわかるように、最も長いチェーン(右)と最も短いチェーン(左)の長さの差は2:4です。このとき右側のツリーにノードを挿入すると、バランスを保つために回転します。 、以下に示すように
したがって、赤黒ツリーの最長チェーンと最短チェーンの長さの差は 2 倍を超えないことがわかり、そのため、AVL ツリーよりも回転数が少なく、相対的な回転数を維持します。緩いバランスと効率性、そしてAVLの木よりも高いです。ただし、赤黒ツリーと AVL ツリーの両方の全体的な複雑さは O(log n) です。
要約する
- 赤黒ツリーは、AVL ツリーの頻繁なローテーションによって引き起こされる非効率を解決するために提案されました。
- AVL ツリーのバランスは、左右のサブツリー間の高さの差 (1 を超えることはできず、比較的厳密) に依存し、赤黒ツリーのバランスは、赤と黒のノードの分布 (あいまい、緩い) に依存します。 )。
- 赤黒ツリーの効率は AVL ツリーよりも高く、これは赤黒ツリーの最長チェーンと最短チェーンの長さの差が 2 倍を超えないという事実に反映されています。
- 赤黒ツリーと AVL ツリーの両方の全体的な複雑さは O(log n) です。