ツリーの線形時間ラベル付けアルゴリズム?


12

頂点にラベルを付けたい無向ツリーがあります。リーフノードには1つのラベルを付ける必要があります。次に、葉が取り除かれたと仮定します。残っているツリーでは、葉に2つのラベルを付ける必要があります。このプロセスは、すべての頂点にラベルが付くまで明白な方法で続きます。これを行う理由は、頂点をキューに保存し、それらを「最初に残す」ことです。この時間を実行する簡単な方法はありますか?O(n+m)

すべてのステップでBFSを実行することで問題を解決できます。しかし最悪の場合、すべてのステップですべての頂点を通過し、ちょうど2つのリーフを削除してキューに入れます。これには二次時間がかかると思います。

別のアイデアは、最初にすべての葉を見つけ、次にすべての葉からBFSを実行することでした。これは私に望ましい解決策を与えません。たとえば、次の図のような「クラウングラフ」の種類を考えます。目的のソリューションが示されていますが、各リーフからBFSを起動すると、2つのラベルのみが使用されます。

ここに画像の説明を入力してください

理想的には、線形時間アルゴリズムの説明と実装も簡単です。

回答:


8

根のない木

優先キューを使用して、これを解決できます。O(E+VlogV)

  • すべての頂点を優先度キューに入れます。優先度は次数です。
  • キューが空でない間:
    • 最小優先度の頂点を削除します。これは1(または最後に0)でなければなりません。v10
    • してみましょう、どこuはすべて乗り越えて、元の隣人Vσ(v)=1+maxσ(u)uv
    • u(存在する場合)の一意の残りのネイバーの優先度からを引きます。1u

実際、優先度キューは実際には必要ありません。このアルゴリズムは、時間単純なキューを使用して実装できます。O(E+V)

  • すべての頂点の次数で長さ配列を初期化します。V
  • 「アライブ」で長さ別の配列を初期化します。V
  • 最初の配列を1回通過し、次数すべての頂点をキューにプッシュします。1
  • キューが空でない間:
    • 頂点ポップします。v
    • してみましょう、どこuは、すべての元隣人を乗り越え、Vσ(v)=1+maxσ(u)uv
    • を「デッド」としてマークします。v
    • に「生きた」近傍uがある場合、uの次数から1を引きます。vu1u
    • の新しい次数が1の場合、uをキューにプッシュします。u1u

根付きの木

代わりにDFSを使用してください。これがアルゴリズムのスケッチです。

  • ノード与えられ、vがリーフの場合、d v = 1に設定します。vvd(v)=1
  • がリーフでない場合、すべての子に対してアルゴリズムを実行し、d v = 1 + max d u とします。ここで、uはすべての子のセットを調べます。vd(v)=1+maxd(u)u

ルートでこのアルゴリズムを実行します。


これは正しいですか?1-> 2-> 3-> 4-> 5というツリーを考えてみましょう。1はルートです。2はラベル1を取得するはずですが、3を与えるのですか?それとも子供たちとは隣人のことですか?それからどのノードをdfsから始めますか?
ヌース

245432

私は質問をしませんでした:-)。私は質問を次のように解釈しました:無向の木。すべての葉にラベルを付けます。それらを削除します。結果のツリーを再帰します。その場合、ツリーは実際には1-2-3-4-5、ステップ1であり、1と5、2と4、そして3を削除します。「クラウングラフ」に関する段落を参照してください。これは、ツリーの中心を見つけるための古典的なアルゴリズムの1つです。
ヌース

1は葉ではありません。葉であるとはほど遠い、根です。この質問は、根付きツリーを対象とするものとして解釈しました。おそらく、OPが応答するのを待つ必要があります。
ユヴァルフィルマス

2
@YuvalFilmus、私の2セントを投げ入れるために、であってはいけませんか?葉は1です。削除する場合、新しい2になります。したがって、頂点が葉になるまでに削除する必要があるレイヤーの数の尺度です。minでは、リーフに隣接する頂点は2になりますが、リーフが削除されるとリーフにならない場合があります。その文には葉が多すぎました。ほうきが必要です。1+max{d(u)}12
ルークマティソン

2

簡単な答えは次のとおりです。

  • (u,v)uv

  • グラフをトポロジ的にソートします。

  • vv

O(n+m)O(n+m)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.