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。但是接下來是內部循環。Boruvka算法的複雜度如何可能爲O(E * logV)?
如果您使用等價關係跟蹤集合,這意味着您只獲取表示集合的元素,因此您無法確定兩個集合之間權重最小的邊緣,因爲您沒有擁有所有元素。如果修改結構以保存對孩子的引用,則仍然需要獲取每個孩子的所有孩子。這意味着,更壞的情況下,每個集合的O(V/2)= O(V)。
之後,您仍然需要找到連接兩個組件的最小邊,這意味着要遍歷連接這兩個組件的所有邊。因此,您需要遍歷每個節點,並查看其邊緣是否連接到另一個組件中的某個元素,如果它的確如此,那麼它是否比您當前擁有的最小邊緣更小。
意義,一個外部循環遍歷節點和一個內部循環遍歷該節點的邊緣 - O(V E)。由於它在O(logV)循環內部,因此可以得到O(logV V * E)。
現在,您似乎只需遍歷所有邊,但您將如何選擇2個組件之間的最小邊?我可以判斷給定的邊是否連接了不同組件中的節點,但我無法判斷哪個連接節點具有最小權重。如果我得到最小重量的那個,它可能不會連接它們。
我有一個關於僞代碼的問題。一開始,每個組件都是一個頂點,對吧?對於每個組件,您都會添加一個邊,但是您將添加'n'個邊,根據定義,這不是一棵樹!我錯過了哪一點? – kunigami 2010-07-28 13:30:24
當有一組未連接的節點(不相交組件)時,您必須保持添加邊緣。這意味着添加| V | - 1條邊。 – iceburn 2010-07-28 16:47:41
@ kunigami:在第一次迭代中爲每個節點添加邊的事實並不意味着您現在有n個新邊;請記住,有重複。組件的最佳橋樑也可能是其他組件中最好的組件。 – 2010-07-28 19:15:17