完全な二分木の極小値を見つける方法は?


7

完全な二分木の極小値を見つける方法は?

考慮してください n完全二分木-node、いくつかについて。各ノードは実数ラベル付けされています。ノードにラベルを付ける実数はすべて異なると想定できます。ノードラベルの場合は極小であるラベルよりも小さいすべてのノードのに接合されているエッジによって。Tn=2d1dvV(T)xvvV(T)xvxwwv

あなたは、それぞれの完全なバイナリツリー与えられているが、標識は唯一以下で指定された暗黙的な方法:各ノードのために、あなたは価値判断できすることにより、プロービングノード。極小値を見つける方法を示してのみ使用プローブのノードに。TvxvvTO(logn) T

帰属:これは、Jon KleinbergとEva Tardosによる本「Algorithm Design」の第5章「Divide and Conquer」の問題6のようです。


3
あなたは「the」極小値について話しているが、いくつかあるかもしれない。
Yuval Filmus

2
時間内に完全な二分木で極小値の1つを見つけるアルゴリズムがありO(log n)ます。これはあなたが探しているものですか?ヒントは次のとおりです。ノードが親よりも小さい場合は、ノードを「候補極小値」と呼びます。さて、候補極小値については、それは極小値であるか、候補極小値である子を持っています。
rici

テキストが演習からコピーされたというメモが表示されます。このサイトでは、帰属のない教科書から問題をコピーすることは許可されていません。(私の意見では属性付けてコピーするのはかなり貧弱な形式ですが属性を付けずにコピーすると盗作になるため、ここでは歓迎しません。)属性をそのままにしておいてください。
DW

回答:


5

ツリーは有限であり、ラベルは実数であるため、ラベルのセットに最小の要素があることが保証されます(math.SEからのこの質問には、この単純なプロパティの証明があります)。この場合、すべてのラベルが区別されるため、極小値を隣接するものよりも厳密に小さくする必要があります。そうであれば、この条件を「以下」に緩和する必要があります。そうでない場合、解決策がない可能性があります。それにもかかわらず、少なくとも1つの極小値を見つける必要があることはわかっています。

ツリーがルート化されている場合(つまり、親子関係の概念がある場合)、問題をわずかに安く解決できます。ツリーがルート化されていない場合は、漸近的にも同様に実行できますが、より実際のプローブを実行する可能性があります。

最初に、根本的なケースを扱います。

ツリーは(完全な)バイナリツリーであるため、各頂点には最大で3つの隣接ノード、その親と2つの兄弟(ルートには親がありません)があるため、ラベルがラベルよりも小さい場合、頂点は極小になりますその2人の子供と親の。したがって、頂点がローカルミニマムであるかどうかを最大4つのプローブで判断できます(実際には順序付けされた方法でツリーをトラバースするため、ルート付きの場合は最大3つが必要です)。

ローカルミニマムを実際に見つけるには、次の方法で、ルートを現在の頂点として、ツリーをトラバースできます。

  1. 現在の頂点のラベルとその2つの子のラベルを調べます。
  2. 現在のラベルが最小の場合、停止し、現在の頂点が局所最小であることを報告します。
  3. それ以外の場合は、現在の頂点を最小のラベルを持つ子に設定し、手順1に戻ります。

ルートから始めると、親のラベルについて心配する必要はありません。ルートには親がなく、現在の頂点に親がある場合は、前の反復でそれを割り引いていたに違いありません。ステップ2では、最小のラベルを選択する必要は厳密にはありません。現在のラベルよりも小さいラベルで十分です1。最小のラベルを選択すると、明確な選択肢が与えられます(ここでも、ラベルが異なるため)。

2つの子から1つの頂点を選択すると、トラバーサルはルートから(最も遠い)リーフへのパスを選択します。したがって、深さのバイナリツリーがあるので d<ログ+1 (それは完全なバイナリツリーなので =2d1 頂点)、最大で実行します dOログ プローブ。

ルート化されていないケースでは、そのような便利な開始点はありませんが、(アルゴリズムがそれを知らなくても)ツリー構造はまだあります。次のアルゴリズムを使用できます。

  1. 任意の頂点を選択して、初期の現在の頂点にします。
  2. 現在の頂点とその近傍すべてのラベルを調べます。
  3. 現在の頂点が最も低いラベルを持っている場合、停止し、それを極小値として報告します。
  4. それ以外の場合は、ラベルが最も低い近傍を新しい現在の頂点として選択し、手順2に戻ります。

各反復では最大4つのプローブしか実行しないため、問題は反復がいくつあるかということです。重要なのは、後戻りできないことを確認することです(元のラベルが大きいことはわかっています)。そのため、グラフ内の単純なパスをたどる必要がありますが、グラフは実際には完全なバイナリツリーなので、最も長い単純なパスです。長さがあります2d。したがって、根ざしていない場合でも、私たちはせいぜい実行します8dOログ プローブ。

正確さを期すために、2番目のアルゴリズムを調べます(根付きの場合は明らかに根なしの特別な場合にすぎません)。

グラフが有限であるため、アルゴリズムが決してバックトラックできないという事実も終了を保証します。これで、頂点がv私たちが終了するのは、実際には極小です。矛盾していないと仮定すると、隣人がいるあなた値が小さいラベルがあります。3つのケースがあります:(1)あなた アルゴリズムがたどったパスの前の頂点です。この場合、アルゴリズムが あなた、選択されなかったでしょう v次の頂点として; (2)あなたはパスに表示されますが、以前の複数の反復、この場合、グラフはツリーではありません。および(3)あなた アルゴリズムがたどったパスにはありませんが、アルゴリズムは あなた ステップ4の次の頂点として、アルゴリズムは v。したがってv 極小値でなければなりません。

これを確認する別の方法は、アルゴリズムによって選択された頂点のラベルのシーケンスが単調減少していることを単に観察することです。これから、終了と正当性の両方がすぐに続きます。

脚注:

  1. これを可能にするプロパティは、すべてのサブツリーにローカルミニマムがあることです。ここでも、全体の順序付けを持つすべての有限セットには最小の要素があります。したがって、帰納法により、サブツリーを新しいルートと兄弟サブツリーで拡張すると、次の3つのケースがあります。(2)新しいルートは1つの子よりも小さく、他の子よりも小さい場合、アルゴリズムはより大きなルートを選択せず​​、定義により最小にする必要があります。または(3)両方の子が小さいが、この場合、前述のように、各サブツリーには少なくとも1つの極小値があるため、どちらかを選択できます。

アルゴリズムの正当性の証明が望ましい:なぜ他のサブツリーを安全に破棄して、最小のラベルを持つ子だけを選択できるのか?IMO、アルゴリズムが存在する限り、アルゴリズムが局所的な最小値を見つけることを証明する必要があります。さらに、より強力な特性が当てはまる場合があります。すべての完全な二分木には、少なくとも1つの極小値があります。
hengxin 2014年

@hengxin(うまくいけば)が明確になりました。
ルークマシソン2014年

O(log n)プローブはツリー値の挿入に何らかの順序を必要とするため、この推論には欠陥があると思います。これにより、分割統治は左へ行くか右へ行くかを区別できます。この場合、ステップ4では、ツリー値に順序付けがないため、「最も低いラベルの隣接セルを選択」が常に正しいパスを選択するわけではありません(極小値が右端のサブツリーにある場合があります)。ツリーの挿入時に順序付けがある場合、親ノードは常に現在のノードよりも大きく、極小値がツリーの左側の葉にのみ存在するようになります。
Juan Zamora

Cormen et at(2011)は、ツリーをバイナリ検索ツリーと見なすには、ツリー挿入で特定の順序を必要とする「binary-search-treeプロパティ」が必要であると定義しています。
フアン・サモラ

@JuanZamora問題は二分探索木についてではなく、頂点ラベル付き完全二分木についてです。第二に、それがBSTについてであったとしても、それはグローバルな最小値ではなく、ローカルな最小値を見つけることについてです。
ルークマシソン2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.