【问题标题】:Need some clarification on Kruskals and Union-Find需要对 Kruskals 和 Union-Find 进行一些澄清
【发布时间】:2016-09-26 23:18:50
【问题描述】:

请帮助我填补我的知识空白(自学):

到目前为止,我知道给定一个包含 N 个顶点和边的图,我们希望形成一个具有 N-1 条边的 MST

  1. 我们按边的重量排序

  2. 我们创建了一组子集,其中每个顶点都有自己的子集。所以如果我们有 {A,B,C,D} 作为我们的初始顶点集,我们现在有 {{A}, {B}, {C}, {D}}

  3. 我们还创建了一个集合 A 来保存答案

  4. 我们沿着有序边的列表向下移动。我们看它的顶点,所以 V1 和 V2。如果它们在单独的子集中,我们可以连接这两个子集,并将边添加到包含我们边的集合 A 中。如果它们在同一个子集中,我们转到下一个选项(因为它是一个循环)

  5. 我们继续这种模式,直到到达 Edge 列表的末尾,或者达到顶点数 - 1 代表我们的集合 A 的长度。

如果上述断言属实,我的以下问题与实现有关:

如果我们使用 list[] 来保存包含该顶点的集合的子集:

子集 = [[1][2][3][4][5][6][7]]

每条边由需要寻找两个子集组成 所以我们需要找到 (6,7)

结果是

my_path = [(6,7)] #包含所有路径 子集 = [[1][2][3][4][5][6,7]]

不会在子集中找到子集需要太长时间才能成为 O(nlog(n))

有更好的方法还是我这样做正确?

【问题讨论】:

    标签: python graph kruskals-algorithm


    【解决方案1】:

    不会在子集中找到子集需要太长时间才能成为 O(nlog(n))

    是的

    有更好的方法还是我这样做正确?

    更好的方法是使用 Disjoint Set Forest 数据结构和 Union by Rank 技术。应用此技术会为 Union 或 Find 操作产生 O(log n) 的最坏情况运行时间

    【讨论】:

      【解决方案2】:

      其实算法的运行时间是O(E log(V))。

      其性能的关键在于您的第 4 点,更具体地说,确定轻边 e = (a, b) 的实现是否 'a' 和 'b' 属于同一集合,如果不属于,执行它们各自集合的并集。

      关于该主题的更多说明,我向您推荐这本书:“算法简介”,来自 MIT Press,ISBN 0-262-03293-7,第 561 页(针对 MST 的一般主题)和第 568 页(针对 Kruskal 的算法)。 正如它所说,我引用:

      "Kruskal 算法对图 G = (V, E) 的运行时间取决于 关于不相交集数据结构的实现。我们将假设 第 21.3 节的不相交集森林实施与按等级联合和 路径压缩启发式,因为它是渐近最快的实现 知道。”

      几行之后,通过一些简单的“时间复杂度理论”演算,证明了它的时间复杂度为 O(E log(V))。

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 2011-10-11
        • 1970-01-01
        • 2015-03-10
        相关资源
        最近更新 更多