【问题标题】:Running time of Kruskal's algorithmKruskal 算法的运行时间
【发布时间】: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


    【解决方案1】:

    你能解释一下为什么我们推断出在第 4 行对边进行排序的时间是 O(E*lgE)?

    为了对一组 N 个项目进行排序,我们使用 O(Nlg(N)) 算法,即快速排序、归并排序或堆排序。因此,为了对 E 条边进行排序,我们需要 O(Elg(E)) 时间。然而,在某些情况下这不是必需的,因为我们可以使用更复杂的排序算法(进一步阅读)。

    另外我们如何得到总时间复杂度为 O((V+E)α(V))?

    我不认为总复杂度是 O((V+E)α(V))。那将是 5-8 循环的复杂性。 O((V+E)α(V)) 复杂度来自 V MAKE-SET 操作和 E Union 操作。要了解为什么我们将它与 α(V) 相乘,您需要深入阅读一些算法书籍中对不相交集数据结构的分析。

    你能让克鲁斯卡尔算法运行多快?

    对于第一部分,第 4 行,我们有 O(E*lg(E)) 复杂度,对于第二部分,第 5-8 行,我们有 O((E+V)α(V)) 复杂度.这两者相加产生 O(Elg(E)) 复杂度。如果我们使用 O(N*lg(N)) 排序,这将无法改进。

    如果边权重是 1 到 W 范围内的整数 某个常数 W?

    如果是这样,那么我们可以对第一部分使用计数排序。给出 O(E+W) = O(E) 的第 4 行复杂度。在这种情况下,算法将具有 O((E+V)*α(V)) 总复杂度。但请注意,实际上 O(E + W) 包含一个可能相当大的常数,对于较大的 W 可能不切实际。

    时间复杂度如何取决于边的权重?

    如前所述,如果边的权重足够小,我们可以使用计数排序并加快算法速度。

    编辑:

    另外,假设图中所有边的权重都是整数 从 1 到 |V|。你能让 Kruskal 的算法运行多快?我有 想到以下:

    为了使 Kruskal 算法运行得更快,我们可以对边进行排序 应用计数排序。

    第 1 行需要 O(1) 时间。第 2-3 行需要 O(vα(|V|)) 时间。 第 4 行需要 O(|V|+|E|) 时间。第 5-8 行要求 O(|E|α(|V|)) 时间。第 9 行需要 O(1) 时间。

    您的想法是正确的,但是您可以缩小界限。

    第 2-3 行需要 O(|V|) 而不是 O(|V|α(|V|))。然而,我们在之前的计算中将其简化为 O(|V|α(|V|)) 以使计算更容易。

    这样,您可以获得以下时间: O(1) + O(|V|) + O(|V| + |E|) + O(|E|α(|V|)) + O(1) = O(|V| + |E| ) + O(|E|α(|V|))

    您可以将其简化为 O((|V| + |E|) * α(|V|) 或 O(|V| + |E|*α(|V|)。

    所以虽然你是对的,因为 O((|V| + |E|) * α(|V|)

    |W| 的计算是类似的。

    【讨论】:

    • Riko You 说“O((V+E)α(V)) 将是 5-8 循环的复杂度。O((V+E)α(V)) 复杂度来来自 V MAKE-SET 操作和 E Union 操作。”但是在这个 for 循环中,我们没有 MAKE-SET 操作。那么我们是否也考虑了另一个 for 循环?如果是这样,为什么我们可以这样做,尽管两个 for 循环执行的次数不一样?你还说,对于第 4 行,我们有 O(ElgE) 复杂度,对于第 5-8 行,我们有 O((E+V)α(V)) 复杂度。那么我们不考虑第一个for循环吗?如果我们将这两者相加,我们会得到 O(ElgE) 吗?
    • 是的,我的错,你还需要计算第一个循环。第 2-3 行和第 5-8 行一起会产生 O((V+E)α(V)) 复杂度。如果我们将 O(ElgE) 和 O((E+V)α(V)) 相加,我们得到 O(ElgE),因为 O((E+V)α(V))
    • N 表示我们排序的元素数。它们在什么范围内并不重要,但该范围应该是合理的小。要更好地理解计数排序,请在此处阅读:en.wikipedia.org/wiki/Counting_sort
    • Riko 那么第 2-3 行的时间复杂度是否等于 O(Vα(V)) ?也是这样吗? O(ElgE)+O((E+V)α(V))=O(ElgE)+O((V+E)*lgE),因为α(V)=O(lgE)和O(ElgE)+ O((V+E)*lgE)=O(ElgE+VlgE+ElgE)=O((V+E)*lgE)。那么我们知道|E|lgE) 还是我错了?我们如何推导出 O(ElgE)+O((E+V)α(V))=O(E*lgE) ?
    • 是的,是的,你的计算是正确的,你假设 |E| = |V|-1。如果你改变它,你会得到 O(Elg(E))
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多