すべての赤黒の木のバランスが取れているわけではありませんか?


30

直感的に、「バランスの取れたツリー」は、各ノードの左右のサブツリーが「ほぼ同じ」数のノードを持たなければならないツリーでなければなりません。

もちろん、赤黒木*(最後の定義を参照)のバランスについて話すとき、実際には、それらは高さのバランスが取れており、その意味で、バランスが取れていることを意味します。

上記の直観を次のように形式化しようとするとします。

定義:バイナリツリーはμ -balanced と呼ばれ、、ノードごとに不等式0μ12N

μ|NL|+1|N|+11μ

がすべて保持され、上記のステートメントが失敗するノードがあります。は、および左サブツリー内のノードの数ですがルート(ルートを含む)であるツリーの下のノードの数です。μ>μ|NL|N|N|N

このトピックに関する文献のいくつかでは、これらはウェイトバランスツリーと呼ばれています。

ノードを持つバイナリツリーが -balanced(定数)である場合、ツリーの高さはであるため、適切な検索を維持できることがわかります。プロパティ。nμμ>0O(logn)

質問は次のとおりです。

いくつかありますすべてのビッグ十分な赤黒木があるように、 -balancedは?μ>0μ


使用する赤黒木の定義(Cormenらによるアルゴリズムの紹介から):

各ノードが赤または黒に色付けされているバイナリ検索ツリー

  • 根は黒です
  • すべてのNULLノードは黒です
  • ノードが赤の場合、その子は両方とも黒です。
  • 各ノードについて、そのノードから子孫NULLノードへのすべてのパスには、同じ数の黒いノードがあります。

注:上記の -balancedの定義では、NULLノードはカウントしません。(私たちがそうするかどうかは問題ではないと思いますが)。μ


@Aryabhata:編集の一意性()はどうですか?私は1μ>μ -balancedは1を意味します13バランス。高さがOlogn)であることを証明するために正確なμを見つける必要はないと思います。何か不足していますか?14 μO(logn)
jmad

さらに、あなたはすべてのために一本の木で反例チェーンを提供するために、負の文を必要と。ノードのサイズが減少しない無限チェーンであれば十分でしょう。nN
ラファエル

@jmad:編集がなければ、すべてのツリーは0でバランスがとれているため、質問に対する答えはありません。それを避けたかった。μ0
アルヤバタ

@ラファエロ:わかりません。ツリーのノードサイズはnです。あなたは我々が選ぶどのような木は関係ありませんと言っているR B nは、そのμ nは0?私には自明ではないようです。それが問題です。nthnRBnμn0
アルヤバタ

1
この質問の以前のバージョンは、各ステップで線形量の作業を行う赤黒木での再帰アルゴリズムの実行時間は必ずしもはないことを主張しました。この主張は間違っていました。height-balanceは、nノードの赤黒木の深さO log n であることを意味します。したがって、ツリーの各レベルでO n 作業を実行すると、合計作業量はO n log n )になります。O(nlogn)nO(logn)O(n)O(nlogn)
-JeffE

回答:


31

主張:赤黒木は任意に非μバランスを取ることができます。

証明のアイデア:右のサブツリーを可能な限り多くのノードで満たし、左側をすべてのルートリーフパス上の指定された数kの黒いノードに対してできるだけ少ないノードで満たします。

証明:ルートから(仮想)リーフへのすべてのパスにT kk個の黒ノードがあるように、赤黒木のシーケンスTkを定義します。T k = B L kR kを定義するTkkTk=B(Lk,Rk)

  • Rkは高さ2k1の完全なツリーで、1番目、3番目、...レベルは赤、他は黒、
  • Lkすべてのノードが黒で着色された高さk1の完全なツリー。

明らかに、すべてのTkは赤黒木です。

たとえば、これらはそれぞれT1T2、およびT3です。


T_1
[ ソース ]


T_2
[ ソース ]


T_3
[ ソース ]


ここで、右側が左側に比べて大きいという視覚的な印象を確認しましょう。仮想の葉は数えません。結果には影響しません。

Tkの左のサブツリーは完全であり、常に高さk1であるため、2k1個のノードを含みます。一方、右側のサブツリーは完全であり、高さは2k122k1個のノードが含まれます。これで、ルートのμバランス値は

2k2k+22k=11+2kk0

これは、要求どおりにμ>0がないことを証明します。


14

いいえ 。次の特別な構造を持つ赤黒の木を考えてください。

  • 左のサブツリーは深さ完全な二分木で、すべてのノードは黒です。d
  • 右側のサブツリーは、深さが完全な二分木で、深さが奇数のノードはすべて赤、深さが偶数のノードはすべて黒です。2d

これが有効な赤黒木であることを確認するのは簡単です。ただし、右サブツリーのノード数()は、おおよそ左サブツリーのノード数(2 d + 11)の2です。22d+112d+11


+1:ありがとう!ただし、ノードの数はです。おそらくこれらを十分に「パディング」して、特定のサイズnのツリーを取得できますか?(それは実行可能であるはずです)。22d+1+2d+11n
アルヤバタ

1
あなたはすでに無限に多くの反例を持っているので、なぜわざわざ?ただし、必要に応じて、左側のサブツリーにさらに赤いノードを追加したり、右側のサブツリーからいくつかの赤いノードを削除したりできると思います。n
-JeffE

@JeffE:基本的に、反例の連鎖は「スパース」サブセットではなく「密」サブセットになります。おそらく、質問の定式化を変更します。
アルヤバタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.