スレッド化されたバイナリ検索ツリーの中央値を一定の時間で実装および検索する方法を理解することに問題があります。
ツリーは、ワーカーのIDと名前で構成されます。
与えられた詳細は与えられます:
N個のノードを持つ二分探索木には、値NILを持つn + 1個の左および右ポインターがあります。ツリー内のすべてのノードzについて、次の変更を行います。left[z] = NILの場合、left [z]はtree-predecessor(z);の値を取得します。そして、right [z] = NILの場合、right [z]はtree-successor(z)の値を取得します。
基本的に、私が理解していることから、それは二重にスレッド化された二分探索木です。
一定時間内に中央値を返す方法がわかりません。
私が知っているのは、通常の二分探索木でO(n))に中央値を返したい場合、Morrisの順序トラバーサルを使用して取得され、数がノードの数は偶数または奇数です。
しかし、それを一定の時間でどのように計算できますか?
私はすでに、要素の数を含む線形時間を使用して、インオーダー、ポストオーダー、プレオーダーでトラバーサルを実行しました。
私を助けてください、かなり長い間それに固執しました。
どうもありがとうございました
「スレッド化された二分探索木」とは、「平衡二分木」を意味します。
簡単です。ルートを返します!
https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
バランスの取れたバイナリツリーの重要な機能は、ツリーを変更するときに、ノードの左側と右側のバランスを調整し、ノードの半分を左側に、半分を右側に維持することです;-)その場合、中央値は常にのルートになります木。だからトリック質問;-)
他のことを意味する場合-一定の時間内にそれを見つけることができない可能性があります。ほぼすべての程度まで木をさまよう必要がある場合、それはほとんどの木の大きさに依存する必要があり、一定ではありません。
奇数サイズのサイズバランスのとれた二分探索木の場合、ルートノードは中央値を表します。
サイズが均等なサイズのバランスのとれたバイナリ検索ツリーの場合、アプローチは中央値の定義によって異なります。 2つの中央の値を単純に平均すると、ルート値とその隣接する値が大きい方のサブツリー側で平均化されます。リンクされたツリーで、ネイバーが一定時間の操作であることを検出します。
ここでの困難な部分は、ツリーのサイズのバランスを保つ(重みのバランスを保つ)ことです。ほとんどのツリーバランシングアルゴリズムは、代わりに高さのバランスを取りますが、ここでは面白くありません。ウェイトバランシングアルゴリズムは通常、左右のウェイトを一定の係数内に保ちますが、ここではウェイトの差を0または1にする必要があります。
私の知る限り、これは与えられたO(n)挿入(たとえば、各挿入後にツリーを再構築することによって)することで)簡単です。
簡単にするために、中央値はインオーダートラバーサル(1-indexed)のceil(n/2)インデックスの値であると仮定します。ツリーの先頭に、ノードの中央値とノード数(n)へのポインターを追加します。メンテナンス:すべてのノードの挿入/削除で、古いnを一時変数に保持し、nを1ずつインクリメントしてから、中央値(ceil(n/2))のインデックス値が変更されたかどうかを確認します。 1増加した場合は、中央値の後継を中央値として設定します。1減少した場合は、中央値の先行を中央値として設定します。このようにして、一定時間で中央値を返すことができます。