web-dev-qa-db-ja.com

ノードの数を指定して、AVLツリーで最小および最大の高さを見つけますか?

特定の数のノードが与えられた場合、AVLツリーの最大および最小の高さを計算する式はありますか?

例:
教科書の質問:
3ノード、5ノード、および7ノードのAVLツリーの最大/最小の高さは何ですか?
教科書の答え:
3ノードのAVLツリーの最大/最小の高さは2/2、5ノードは3/3、7ノードは4/3です。

彼らが何らかの魔法の式でそれを計算したのか、それとも与えられた高さのそれぞれについてAVLツリーを引き出してそのように決定したのかはわかりません。

11
darkserith

以下の解決策は、手作業で物事を直観して直感を得るのに適しています。大きな木(54+ノード)については、この回答の最後にある正確な式をご覧ください。

最小の高さは簡単です。使い果たすまで、ツリーの各レベルをノードで埋めるだけです。その高さが最小です。

最大値を見つけるには、最小値と同じことを行いますが、1つ前に戻り(最後に配置されたノードを削除し)、そのノードを反対側のサブツリー(以前の場所)に追加するとAVLツリープロパティに違反するかどうかを確認します。もしそうなら、最大の高さはちょうどあなたの最小の高さです。それ以外の場合、この新しい高さ(最小高さ+ 1である必要があります)は最大高さです。

AVLツリーのプロパティの概要、またはAVLツリーの一般的な説明が必要な場合は、 ウィキペディアは開始するのに最適な場所です

例:

7ノードの例を取り上げましょう。すべてのレベルを記入し、高さ3の完全に満たされたツリーを見つけます(レベル1で1、レベル2で2、レベル3で4、1 + 2 + 4 = 7ノード)。これは3が最小であることを意味します。

今最大を見つけます。その最後のノードを削除し、右ではなく左のサブツリーに配置します。右側のサブツリーの高さは3のままですが、左側のサブツリーの高さは4になりました。ただし、これらの値の違いは2未満なので、AVLツリーのままです。したがって、最大の高さは4です(最小は+1)。

以下の3つの例はすべて解決しました(数字は配置の順序に対応していることに注意してくださいNOT value):

Worked out as an example:


フォーミュラ1

非常に多数のノードを持つツリーがある場合、上記の手法は当てはまりません。この場合、次の式を使用して正確な最小/最大を計算できます。

与えられたn個のノード2

最小:ceil(log2(n + 1))

最大:floor(1.44 * log2(n + 2)-。328)

好奇心が強い場合、max-min> 1が初めてn = 54になります。

1Jamie S に感謝します。より大きなノード数でこの障害を引き起こしてくれました。

2これらの式は、 Wikipedia AVL page からのもので、定数がプラグインされています。元のソースは、Donald E. Knuth(2nd Edition)によるSorting and searchです。

13
River

AVLツリーの以下の定義特性に注意することが重要です。

AVLツリープロパティ

  • AVLツリーのノードは、BSTプロパティに従います
  • ANDノードの左右のサブツリーの高さの差は1以下です。

定理:AVLプロパティは、最悪の場合のツリーの高さO(log N)を維持するのに十分です。

次の図に注意してください。 AVL Tree

-T1は、高さ1の場合、T0 + 1ノードで構成されます。
-T2は、T1とT0 + 1ノードで構成され、高さ2を提供します。
-T3は、左のサブツリーのT2と、右のサブツリーのT1 + 1ノード、高さで構成されます。
-T4は、高さ4の場合、左のサブツリーのT3と、右のサブツリーのT2 + 1ノードで構成されます。

天井の O(log N)(NはAVLツリーのノード数を表す)を取得すると、高さが取得されます。

例)T4には12個のノードが含まれます。 [天井] O(ログ12)= 4。

ここで展開しているパターンを参照してください??

**最悪の場合の高さは enter image description here

6
Evan Bechtol

ノードの数がnであると仮定しましょう

AVLツリーの最小の高さを見つけようとすることは、ツリーを完全なものにすることと同じです。つまり、各レベルで可能なすべてのノードを埋め、その後、次のレベルに移動します。

したがって、各レベルで適格なノードの数は2 ^(h-1)だけ増加します。ここで、hはツリーの高さです。

したがって、h = 1でnodes(1)= 2 ^(1-1)= 1ノード

h = 2の場合、ノード(2)=ノード(1)+ 2 ^(2-1)= 3ノード

h = 3の場合、ノード(3)=ノード(2)+ 2 ^(3-1)= 7ノード

そのため、nodes(h)が指定されたノード数nより大きい最小のhを見つけるだけです。

AVLツリーの最大高さの問題:-

aVLツリーの高さがh、F(h)はAVLツリーのノード数であると仮定します。

高さを最大にするために、左のサブツリーFLと右のサブツリーFRの高さに1の差があると仮定します(AVLプロパティを満たしているため)。

ここで、FLが高さh-1のツリーであり、FRが高さh-2のツリーであると仮定します。

今のノードの数

F(h)=F(h-1)+F(h-2)+1 (Eq 1)

両側に1を追加:

F(h)+1=(F(h-1)+1)+ (F(h-2)+1) (Eq 2)

したがって、最大高さの問題をFibonacci sequence。そして、これらのツリーF(h)は、 フィボナッチツリー と呼ばれます。

したがって、F(1)= 1およびF(2)= 2

したがって、最大の高さを取得するには、フィボナッチ数列のn以下の数値のインデックスを見つけるだけです。

したがって、適用(式1)

F(3)= F(2) + F(1)+ 1 = 4。したがって、nが2〜4の場合、ツリーの高さは3になります。

F(4)= F(3)+ F(2)+ 1 = 7同様に、nが4〜7の場合、ツリーの高さは4になります。

等々。

3
Naman Choradia

http://lcm.csa.iisc.ernet.in/dsa/node112.html

およそ1.44 * log nです。ここで、nはノードの数です。

それがどのように導き出されたかについてのより詳細な説明のため。このリンクは、13ページの途中から参照できます。 http://www.compsci.hunter.cuny.edu/~sweiss/course_materials/csci335/lecture_notes/chapter04.2.pdf

0
Michelle