成長する無向グラフのバランスの取れたスパニングツリーを維持する


19

グラフに新しいノード/エッジを追加する際に、グラフの比較的バランスの取れたスパニングツリーを維持する方法を探しています。

単一のノード、「ルート」として開始する無向グラフがあります。

各ステップで、新しいノードとグラフに接続するエッジ、または2つの古いノードを接続する新しいエッジのいずれかをグラフに追加します。グラフを成長させると、スパニングツリーが維持されます。ほとんどの場合、これは、新しいノードとエッジを追加するときに、新しいノードを接続先の古いノードの子に設定することを意味します。

新しいノードを追加する順序を制御することはできません。そのため、上記のツリー構築アルゴリズムは明らかに、不均衡なスパニングツリーにつながる可能性があります。

再ツリー化で行われる作業量を最小限に抑えながら、スパニングツリーを「比較的バランスの取れた」状態に保つオンラインヒューリスティックを知っている人はいますか?ツリー構造を完全に制御できます。私が制御できないのは、グラフの接続性、または新しいノードが追加される順序です。

「balanced」、「spanning」、「tree」などの用語に対するGoogleの標準的な応答は、どちらも当てはまらないバイナリツリーとBツリーのように見えることに注意してください。グラフノードには任意の数の隣接ノードを含めることができるため、ツリーノードには2つのバイナリツリーのような2つではなく、任意の数の子を含めることができます。Bツリーは、隣接リストを変更することでバランスを維持しますが、グラフの接続を変更することはできません。


3
静的グラフのバランスのとれた理想的なスパニングツリーがどのようなものであるかについて、より具体的に説明すると役立つかもしれません。BFSツリーは、バランスのとれたツリーとして自動的に適切な選択になりますか(適切なルートを選択した場合、またはルートに関係なく2倍以内であれば、できるだけ浅い)。各サブツリー内のノードの数を、ツリー内のどこでも、親のノードの数より一定の係数だけ小さくする必要がありますか?その場合、そのようなツリーを持たないグラフに対してはどうしますか?
デビッドエップシュタイン

グラフ全体を一度に表示して、これをオフラインで実行している場合、BFSツリーは実際に理想的なバランスの取れたスパニングツリーになります。各サブツリーのノードの数は、親のノードの数よりも一定の係数だけ小さくする必要はありません。
スーパーエレクトリック

最上位の木を調べましたか?en.wikipedia.org/wiki/Top_tree
Peer Sommerlund

回答:


4

エッジを持つ新しい頂点を追加するたびに、オプションはありません。新しいエッジを追加するたびに、ルートへの現在の距離が新しいエッジを通る距離よりも大きい場合、古い最短パスの古いエッジを削除して、新しいエッジを追加します。それ以外の場合は、ツリーを変更しないでください。この方法では、ツリーのレベルに同じ頂点が含まれ、頂点からルートまでの距離がBFSツリーの距離と同じになるという意味で、BFSツリーに非常に似たものが得られると思います(そしてグラフ)、しかし、それがあなたの「理想的なバランスの取れたスパニングツリー」条件を満たすために十分であるかどうかはわかりません。


2

私は次のことをしました:

Vinicius Santosの答えはその最初の部分です。彼が言うように、どのフレームでも、新しいノードとそれに接続する親子エッジを追加するか、単に2つの既存のノード間にクロスエッジを追加します。親子エッジはツリー構造を変更する機会を提供しません。クロスエッジのみが提供します。ノードAとBの間にクロスエッジEを追加することを検討してください。ここで、Bはツリーの深さがより大きくなります。(A.depth + 1)<B.depthの場合、Aの子にすることでB.depthを減らすことができます。

Bの深さを減らしたので、Bの子になることによって深さを減らすことができるかどうかを確認するために、Bの隣人を確認する必要があります。したがって、Bから幅優先トラバースを実行します。 depth + 1 <Y.depth、YをXの子に設定します。

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