请帮助我填补我的知识空缺(自学):
到目前为止,据我所知,给定N个顶点和边的图形,我们想要形成一个具有N-1边的MST
我们按重量排列边缘
我们创建一组子集,其中每个顶点都有自己的子集。因此,如果我们将{A,B,C,D}作为我们的初始顶点集,我们现在有{{A},{B},{C},{D}}
我们还创建了一个包含答案的集合
我们沿着有序边缘列表前进。我们看看它的顶点,所以V1和V2。如果它们处于单独的子集中,我们可以连接两个子集,并将边添加到保存边的集合A.如果它们在同一子集中,我们将转到下一个选项(因为它是一个循环)
我们继续这种模式,直到我们到达Edge列表的末尾或者达到顶点数 - 1表示集合A的长度。
如果上述断言属实,我的以下问题将考虑实施:
如果我们使用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))
有更好的方法还是我正确地做到了这一点?
答案 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))。