【问题标题】:Time Complexity of the Kruskal Algorithm?Kruskal 算法的时间复杂度?
【发布时间】:2013-12-24 07:54:53
【问题描述】:

我正在计算这样的 kruskal 算法的时间复杂度(请参阅附件中的算法)

T(n) = O(1) + O(V) + O(E log E) + O(V log V)
     = O(E log E) + O(V log V)
as |E| >= |V| - 1
T(n) = E log E + E log E
     = E log E

CLRS 算法:

是正确的还是我做错了什么请告诉。

【问题讨论】:

  • 请告诉我第4行和第5-9行的复杂性
  • 第 5-9 行将不是 VlogV;循环针对每条边运行,因此它将是 E*(something)。 findset 和 union 需要 logV 时间,总体 5-9 应该需要 E.logV 时间。所以整体复杂度来了:O(ElogE + ElogV)。因为 E 可以至少为 O(V) 并且最多为 O(V^2);术语 ElogE 总是大于或等于 ElogV;因此总体上它的 O(ElogE)。
  • @SpawN 对不起,我没有得到这部分:“因为 E 至少可以是 O(V) 和最多 O(V^2)” 我可以理解 E 可以至少是 V - 1次为什么最多 V^2 ?以及为什么我们要考虑这个“ElogE 总是大于或等于 ElogV?”
  • @MrA 对于 v 个顶点,最大边可以是 v*(v-1)/2,即 O(V^2)。 v 个顶点至少需要 (v-1) 条边(连通图),因此需要 O(V)。

标签: algorithm time-complexity graph-algorithm asymptotic-complexity kruskals-algorithm


【解决方案1】:

克鲁斯卡尔是 O(E log E);你的推导是正确的。你也可以说 O(E log V) 因为 E

【讨论】:

  • 但是为什么 O(E log V) 比 O(E log E) 更可取?是因为通常图形复杂性在公式中同时使用 E 和 V?
  • Elog(V) 可以在此处简化为 Elog(V^2) [ e = v^2 in most best case // complete graph ] 所以 Elog(V^2) E) 写成 O(VE) 只是为了同时拥有两个变量。
  • 您甚至可以使用计数排序来减少排序时间。这不会产生总体影响,但在实施过程中可能会有用。
【解决方案2】:

自从 |V| > |E|+1,我们更喜欢使用 V 项而不是 E 项的严格上限。

    |E| <= |V|²   
.   log |E| < log |V|²   
.   log |E| < 2 log |V| 
.   running time of MST-KRUSKAL is: O(E log V)

【讨论】:

  • 假设图是连通的,所以不应该是|V| |V| = |E| + 1. 通过添加更多的边,你会得到一个有环的图,所以 |V|
  • 另外,对于那些可能无法立即理解的人|E|
【解决方案3】:

抱歉回复晚了。
Kruskal 算法的运行时间是 O(E log E) 而不是 O(E log V)。

因为,必须首先对边进行排序,并且它需要 O(E log E),它在运行时中占主导地位,以验证所考虑的边是否是安全边,这将花费 O(E log V)。和 |E| > |V|((如果图已经是一棵树,则为极端情况)),因此可以安全地假设运行时为 O(E log E)

【讨论】:

  • 对,但是E不能超过V * V,也就是说log(E)
  • 是的,我也在 CLRS 中找到了相同的声明。我也同意这一点,但我觉得 O(ElogE) 会是一个更严格的上限。底线:O(ElogE) 和 O(ElogV) 应该可以工作
  • 对此有任何参考吗?
  • 参考:people.cs.umass.edu/~barring/cs611/lecture/7.pdf -- 我还没有完全验证。只是略读并被说服。所以,请用少许盐完成
  • @Bandrami 你不认为相反的情况也会发生。 E在O(V)和O(VV)之间。因此,如果您尝试将 logE 与 logV 进行比较,E 至少为 O(V),那么不会使 logE > log V 吗?这就是为什么我觉得 O(ElogE + ElogV) = O(ElogE);但是,我仍然不能不同意 EV 所以 logE
【解决方案4】:

第 5 到 9 行,复杂度为 O(E)。

  1. O(E)
  2. O(1)
  3. O(1)
  4. O(1)
  5. O(1)

直到第 5 行,您已经正确计算了复杂性。最后,这里的主导因素是 O(E lg E)。所以,复杂度是 O(E lg E)

【讨论】:

    【解决方案5】:

    所有其他答案都是正确的,但我们可以考虑以下情况,这给了我们 O(|E|) 的时间复杂度。
    以下答案来自Algorithms book by Dasgupta,第 5 章,第 140 页,部分路径压缩:
    在该算法的时间复杂度计算中,主要部分是边缘排序部分,即 O(|E| log|E|) 或所有其他答案解释为 O( |E|.log|五|)。

    但是,如果给定的边是排序的呢?
    或者如果权重很小(比如 O(|E|)),那么可以在线性时间内完成排序(比如应用 counting sort)。
    在这种情况下,数据结构部分成为瓶颈(Union-find),考虑将其性能提高到每个操作的 log n 之外是有用的。 解决方案是使用路径压缩方法,同时执行 find() 操作。

    这个摊销成本仅略高于 O(1),低于早期的 O(log n)。更多详情请查看this reference。 简单的想法是,每当调用 find(v) 操作来查找 v 所属的集合的根时,所有节点到其父节点的链接都将改变并指向根。这样,如果您在同一路径上的每个节点 x 上调用 find(x) 操作,您将在 O(1) 中获得集合的根(标签)。因此,在这种情况下,算法瓶颈是联合查找操作,使用所描述的解决方案是 O(1),该算法在所描述情况下的运行时间是 O(|E|)。

    【讨论】:

      【解决方案6】:

      O(ElogE) 肯定是 O(ElogV),因为 E

      ElogE

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        相关资源
        最近更新 更多