1 Begin with a connected graph G containing edges of distinct weights, and an empty set of edges T
2 While the vertices of G connected by T are disjoint:
3 Begin with an empty set of edges E
4 For each component:
5 Begin with an empty set of edges S
6 For each vertex in the component:
7 Add the cheapest edge from the vertex in the component to another vertex in a disjoint component to S
8 Add the cheapest edge in S to E
9 Add the resulting set of edges E to T.
10 The resulting set of edges T is the minimum spanning tree of G.
ウィキペディアより。セットに参加しているので、外側のループはlogVであることを理解しています。しかし、内部ループが発生します。
セットを追跡するために同値関係を使用する場合、それはセットを表す要素のみを取得していることを意味するため、すべての要素を持っているわけではないため、2 つのセット間で最小の重みを持つエッジを決定することはできません。 . 子への参照を保持するように構造を変更する場合でも、各セットのすべての子を取得する必要があります。つまり、最悪のシナリオ、各セットの O(V/2) = O(V) です。
その後、2 つのコンポーネントを接続する最小のエッジを見つける必要があります。これは、2 つのコンポーネントを接続するすべてのエッジを調べることを意味します。したがって、各ノードを反復処理して、そのエッジが他のコンポーネントの要素に接続されているかどうかを確認する必要があります。接続している場合は、現在の最小エッジよりも小さいかどうかを確認します。
つまり、ノードを反復する外側のループと、そのノードのエッジを反復する内側のループ - O(V E)。O(logV) ループ内にあるため、O(logV V*E) が得られます。
さて、すべてのエッジを繰り返し処理する必要があるように思えますが、2 つのコンポーネント間の最小エッジをどのように選択するのでしょうか? 特定のエッジが異なるコンポーネントのノードを接続しているかどうかはわかりますが、それらを接続しているノードの重みが最小かどうかはわかりません。そして、最小の重量のものを取得すると、それらが接続されない可能性があります.