ツリーを同じ部分に分割する

私はそれから1つのエッジを削除することによってNノード(各ノードの最大次数が3である)を持つツリーを分割するアルゴリズムを探しているので、結果として得られる2つのツリーはできるだけN/2に近い。 「最も中心がある」エッジを見つけるにはどうすればよいですか?

ツリーはアルゴリズムの前段階からの入力として提供され、グラフとして入力されるため、どのノードがルートであるかは明確ではありません。

私の考えは、ツリー内で最長のパスを見つけて、最も長いパスの途中でエッジを選択することです。それは動作しますか?

最適には、どちらのツリーにも2N/3ノード以上が存在しないようにするソリューションを探しています。

あなたの答えをありがとう。

2
私はあなたのアルゴリズムが動作するとは思わない。ルートに入るノードの長いチェーンを持つ、完全にバランスのとれた3値ツリーを考えてみましょう。この場合、最長のパスを取って中間点で切断すると、完全な3値ツリーと単純なリンクリストが得られます。ツリーは、リンクリストより指数関数的に多くのノードを持ちます。
追加された 著者 templatetypedef,
ツリーのレイアウトバランスについてのデータがない場合は、縮退したツリー(左腕で100、右腕で50など)から開始し、後で50/100分割して同じボートに戻すことができます。
追加された 著者 Marc B,
縮退樹は、基本的にリンクされたリストです。例えば2つの子を持つ唯一のノードはルートノードです。だから、ルートからツリーを通る2つのパスがあります。左に100の線形ノードを、右に50を下にします。最長のパス(100ノードの分岐点)を分割すると、100を50/50に分割し、残りの部分を右の分岐に分割します。/50~50/100である。
追加された 著者 Marc B,
OK。ゴッチャ。 ...
追加された 著者 Marc B,
明白な宿題。私は失望しています。
追加された 著者 Per,
はい、しかし、長さが150になる最長のパスを取って、中央のエッジ(パスの75番目または76番目)を取ると、それは等しい部分に分割されます。問題は、そのような最適なエッジが常に存在するかどうかです(私はそうは思わない)。
追加された 著者 anonymous,
申し訳ありませんが、私はあなたが私を誤解したと思います。入力は、実際には、指向していないエッジを持つグラフです。つまり、私が見つけようとする最も長いパスは、「2つのノード間の最大可能距離」です。一般的なグラフで最も長いパスを見つけることは、NP完全です。しかし、グラフを出力するアルゴリズムは、出力グラフが常にツリー(ツリーデータ構造ではなくツリーグラフ)であるように設計されています。
追加された 著者 anonymous,

2 答え

私はあなたの最初のアルゴリズムが私がコメントで言及した理由のために働くとは思わない。しかし、修正されたDFSを使ってO(n)時間と空間でこれを解決できると思います。

まずグラフを歩いて、そこにあるノードの数を数えます。これをnと呼ぶ。ここで、任意のノードを選択し、ツリーをルートにします。ルートから始まるツリーを再帰的に探索し、各サブツリーのノード数を計算します。これは単純な再帰を使用して行うことができます:

  • If the current node is null, return 0.
  • Otherwise:
    • For each child, compute the number of nodes in the subtree rooted at that child.
    • Return 1 + the total number of nodes in all child subtrees

この時点で、エッジの下にあるサブツリーにk個のノードがある場合、こぼれ落ちは(k、n - k)になるため、各エッジに対して、そのエッジを削除することによって得られる分割を知ります。したがって、すべてのノードを反復し、最も均等にバランスをとるノード(k、n-k)を探すことで、最適なカットを見つけることができます。

ノードを数えるにはO(n)時間がかかり、再帰を実行すると各ノードとエッジをたかだかO(1)回訪問するので、O(n)時間もかかります。最適カットを見つけるには、O(n)のネット実行時間に対して、追加のO(n)時間が必要です。サブツリーのノード数を格納する必要があるため、O(n)メモリーも必要です。

お役に立てれば!

7
追加された
これを行うためのアルゴリズムをすべて見つけることはできません。
追加された 著者 Saeed Amiri,
私は、サイズ3の最大程度を見ませんでした。
追加された 著者 Saeed Amiri,
@ SaeedAmiri-申し訳ありませんが、あなたはこれを詳述できますか?
追加された 著者 templatetypedef,
非常に良いアルゴリズム。 1つの発言:頂点をカウントする最初の部分は不要です。なぜなら、2番目の部分が終了した後、ツリー内に頂点の数があるからです。
追加された 著者 tommsch,
はい、これは動作します。ありがとう。私は、片側のノードと他の側のノードを数えることを考えていましたが、単純なアプローチはO(n ^ 2)です。あなたのアルゴリズムは線形ですが、それは素晴らしいです。再度、感謝します。
追加された 著者 anonymous,