需要对Kruskals和Union-Find做一些澄清

时间:2016-09-26 23:18:51

标签: python graph kruskals-algorithm

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

到目前为止,据我所知,给定N个顶点和边的图形,我们想要形成一个具有N-1边的MST

  1. 我们按重量排列边缘

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

  3. 我们还创建了一个包含答案的集合

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

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

  6. 如果上述断言属实,我的以下问题将考虑实施:

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

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

    并且每个边缘由需要查找两个子集组成 所以我们需要找到(6,7)

    结果将是

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

    不会发现子集中的子集需要花费太长时间才能成为O(nlog(n))

    有更好的方法还是我正确地做到了这一点?

2 个答案:

答案 0 :(得分:0)

  

不会发现子集中的子集需要花费太长时间才能成为O(nlog(n))

  

有更好的方法还是我正确地做到了这一点?

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

答案 1 :(得分:0)

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

其表现的关键在于你的观点4,更具体地说,如果'a'和'b'属于同一组,则确定轻边e =(a,b)的实现,如果不是,执行各自的联合会。

关于这个主题的更多说明,我推荐你的书:“Algoritms简介”,来自MIT出版社,ISBN 0-262-03293-7,第561页(关于MST的一般主题)和第568页(关于Kruskal's)算法)。 正如它所述,我引用:

  

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

以后几行和一些简单的“时间复杂性理论”微积分,证明其时间复杂度为O(E log(V))。