重みのある無向連結グラフが与えられます。w:E->{1,2,3,4,5,6,7} - 可能な重みは 7 つしかないことを意味します。O(n+m) の Prim のアルゴリズムと O( m*a(m,n)) の Kruskal のアルゴリズムを使用してスパニング ツリーを見つける必要があります。
これを行う方法がわかりません。ここでウェイトがどのように役立つかについてのガイダンスが本当に必要です.
重みのある無向連結グラフが与えられます。w:E->{1,2,3,4,5,6,7} - 可能な重みは 7 つしかないことを意味します。O(n+m) の Prim のアルゴリズムと O( m*a(m,n)) の Kruskal のアルゴリズムを使用してスパニング ツリーを見つける必要があります。
これを行う方法がわかりません。ここでウェイトがどのように役立つかについてのガイダンスが本当に必要です.
エッジの重みをより速く並べ替えることができます。
Kruskal アルゴリズムでは、O(M lg M) ソートは必要ありません。カウント ソート (または他の O(M) アルゴリズム) を使用できます。したがって、最終的な複雑さは、ソートの場合は O(M) であり、共用体検索フェーズの場合は O(Ma(m)) です。合計で O(Ma(m)) です。
Prim アルゴリズムの場合。ヒープを使用する必要はありません。重みごとに 1 つずつ、7 つのリスト/キュー/配列/その他 (一定時間の挿入と取得) が必要です。そして、最も安い発信エッジを探しているときは、これらのリストの 1 つが (最も安いものから) 空でないことを確認し、そのエッジを使用します。7 は定数なので、アルゴリズム全体が O(M) 時間で実行されます。
私が理解しているように、宿題に答えるのは一般的ではありませんが、これはあなただけでなく他の人にも役立つことを願っています;)
堅苦しい:
Prim は、Kruskal と同様に、最小スパニング ツリー (MST) を見つけるためのアルゴリズムです。アルゴリズムを視覚化する簡単な方法は、紙にグラフを描くことです。次に、選択したすべてのノードに移動可能な線 (カット) を作成します。以下の例では、セット A がカット内のノードになります。次に、カットを通過する最小のエッジを選択しました。つまり、ラインの内側のノードから外側のノードまでです。重みが最小のエッジを常に選択します。新しいノードを追加した後、カットを移動して、新しく追加されたノードが含まれるようにします。次に、すべてのノードがカット内に収まるまで繰り返します。
アルゴリズムの簡単な要約は次のとおりです。
クラスカル:
Kruskal は Prim に似ていますが、カットがない点が異なります。したがって、常に最小のエッジを選択します。
これらのアルゴリズムの正確なパフォーマンスについては確信が持てませんが、Kruskal は O(E log E) であり、Prim のパフォーマンスは、エッジを格納するために使用するデータ構造に基づいていると想定しています。バイナリ ヒープを使用すると、最小エッジの格納に隣接行列を使用する場合よりも、最小エッジの検索が高速になります。
お役に立てれば!