【发布时间】:2015-06-16 03:46:35
【问题描述】:
克鲁斯卡尔算法如下:
MST-KRUSKAL(G,w)
1. A={}
2. for each vertex v∈ G.V
3. MAKE-SET(v)
4. sort the edges of G.E into nondecreasing order by weight w
5. for each edge (u,v) ∈ G.E, taken in nondecreasing order by weight w
6. if FIND-SET(u)!=FIND-SET(v)
7. A=A U {(u,v)}
8. Union(u,v)
9. return A
根据我的教科书:
在第 1 行初始化集合 A 需要 O(1) 时间,排序的时间 第 4 行的边是 O(E lgE)。第 5-8 行的 for 循环执行 O(E) 在不相交集森林上的 FIND-SET 和 UNION 操作。沿着 与 |V| MAKE-SET 操作,这些操作总共需要 O((V+E)α(V)) 时间,其中 α 是一个增长非常缓慢的函数。因为我们假设 G 是连通的,我们有 |E|
你能解释一下为什么我们推断出在第 4 行对边进行排序的时间是 O(E lgE) 吗? 另外,我们如何得到总时间复杂度为 O((V+E)α(V)) ?
另外,假设图中所有边的权重都是从 1 到 |V| 的整数。你能让 Kruskal 的算法运行多快?如果对于某个常数 W,边权重是 1 到 W 范围内的整数怎么办?
时间复杂度如何取决于边的权重?
编辑:
另外,假设图中所有边的权重都是整数 从 1 到 |V|。你能让 Kruskal 的算法运行多快?
我想到了以下几点:
为了让 Kruskal 算法运行得更快,我们可以应用计数排序对边进行排序。
- 第 1 行需要 O(1) 时间。
- 第 2-3 行需要 O(v) 时间。
- 第 4 行需要 O(|V|+|E|) 时间。
- 第 5-8 行需要 O(|E|α(|V|)) 时间。
- 第 9 行需要 O(1) 时间。
所以如果我们使用计数排序来解决边缘,Kruskal 的时间复杂度将是
你能告诉我我的想法是否正确吗?
还有:
如果边权重是 1 到 W 范围内的整数 某个常数 W?
我们将再次使用计数排序。算法将是相同的。我们发现时间复杂度如下:
- 第 1 行需要 O(1) 时间。
- 第 2-3 行需要 O(|V|) 时间。
- 第 4 行需要 O(W+|E|)=O(W)+O(|E|)=O(1)+O(|E|)=O(|E|) 时间。
- 第 5-8 行需要 O(|E|α(|V|)) 时间。
- 第 9 行需要 O(1) 时间。
所以时间复杂度为:
【问题讨论】:
标签: performance time graph kruskals-algorithm