質問
どのようにして二分探索木の平均高さを計算していますか?平均身長は何ですか?
解決
あなたはこの再帰的な定義を使用して、バイナリツリーの高さを計算することができます:
height(empty) = 0
height(tree) = 1 + max(height(tree.left), height(tree.right))
経験的に、このような木の平均高さを測定する一つの方法は、繰り返し空のツリーを作成し、それを1000個のランダムなアイテムを追加することです。上記の関数を使用して、各試験の高さを測定し、それらを平均する。
私はあなたのタスクは、バイナリツリーの平均高さのための式を見つけるために、おそらく疑います。
他のヒント
この質問は、私はあなたが決定的に実際に木を生成せずにこれをうまくできるかどうかを尋ねました。
私はあなたが単純に実装されたバイナリツリーにN固有の番号の可能なすべての順列を追加した場合の平均身長がどうなるかの答えを計算することができアプリケーションを作成するために管理しました。
私が得た答えがこのグラフです。 (X軸は、ツリー内の項目の数であり、青線は平均の高さで、赤線が最適可能高さ)
N Average Height 2 2 16 7.039 32 9.280 64 11.679 256 16.783 343 17.896
Granitebolshevikは右である:それは単純に実装ツリーが余分バランシング機能せず、最適な高さになるという可能性が、統計的にそうです。
このアルゴリズムはO(N ^ 2)の複雑さを持っており、本当に大きな数を計算するのに十分な速ではありません。
それは(そのような赤黒木として)平衡ツリー構造の任意の並べ替えを使用しているかどうかに依存します。バイナリツリーに乱数を挿入しているので、平均的な深さは約LOG2(1000)であると予想するのが妥当であろう - そう値10と11が「通常」であろう。私はそれがから外れる可能性がどのくらいか分かりません。無浅い10以上のレベル、おそらくやや深いです。ノーバランシングと極端な場合には、1000年に深いだろう。それは、乱数で発生することはほとんどありません。
例えば、数値の近似値の数がありますが、この質問に簡単な答えがあるように表示されません:ます。
Devroye、リュック。 「二分探索木の高さに注意してください。」 ACMのジャーナル(JACM)33.3(1986):489-498。
。リード、ブルース。 「ランダムバイナリ検索ツリーの高さ。」 ACMのジャーナル(JACM)50.3(2003):306から332
。
http://staff.ustc.edu.cn /~csli/graduate/algorithms/book6/chap13.htmする
これらの近似は、一般的に形を取る:A ln n - B ln ln n + C
どこA~4.311
とB~1.953
だから、おそらく言うことは最も有用なものは、ランダムな挿入のための平均的な高さはO(log n)
ですが、実際の数値近似を必要とする場合、私は(4.311 ln n - 1.953 ln ln n)
が大きなnに対して十分に近いことだと思うことです。
n=1000
のために、それは26
について提供します - 非常にうまく他の場所で報告された実験結果にフィットしている。
この質問は、実際には注意が必要です。それはありそうなので答えは、1000年ではありませんが、LOG2(1000)もありそうですが、それ以上に木が成長している方法に応じています。
ツリーはその後、単純にそれを追加しても、あなたが踏んでint型を追加する場合は、ツリーは事実上、常にLOG2(1000)よりも背が高くなります。
これは通常の確率分布に関連すると思われるので、、統計学者に相談してください。それらは、反復ランダムイベント(ヘッド一単位の右尾同上左)、そしてそれは葉に沈降のようにツリーを介して、ランダムな整数の反復の値の多くによって生成されます。
これは、インクルードが追加された順序に依存します。あなたが最も小さい値で始まる場合は、すべての新しい値が右の子BSTに追加されますので、その後、ツリーが深くなります。あなたが最大の価値を追加した場合、右が空の間、まず左の子は深くなります。
は関係なく、あなたが平均的な高さを使用している木の、(1000)LOG2されます。それは数字の順番に応じて、実際の高さは変更になる場合があります挿入ことは事実だが、あなたが言及してランダムに分布番号を、と仮定すると、その後、実際の値は、少なからず、期待値(どちらが、近似するもう一度、LOG2です(1000))。