我正在对最小生成树进行分析,并想知道排序时间如何影响Kruskal算法的整体时间复杂度?
示例:
O(n log log n)
O(n)
对于这两种情况,答案仍然是O(e log n)
还是会改变?
答案 0 :(得分:1)
Kruskal算法的时间是O(e log e)
,它是对边缘进行排序的时间。如果你可以在O(e)中做到这一点,考虑到算法的其余部分,找到最小生成树是O(e log n),你有O(e) + O(e log n)
。自e=O(n^2)
起,算法时间将为O(n^2 log n)
或O(e log n)
。如果排序采用相同分析的O(e log log e),则总时间为O(e log log e)
。
详细信息:查找最小生成树的时间是根据需要对边进行排序然后循环(e次)计算的,在该循环中从排序列表中删除每条边并检查是否它连接两个不相交的区域或不连接。 (这项检查需要O(log n)),如上所述,循环的时间为O(e log n)
。
使用更复杂的不相交集数据结构来查找和检查不相交的区域,该循环具有O(Eα(V))时间,其中α是单值Ackermann函数的极其缓慢增长的逆({{3} })
答案 1 :(得分:1)
如果使用不相交集来实现kruskal算法,则复杂度为SortComplexity+Eα(E)
(E
是边数,alpha
是非常缓慢增长的函数(根据wikipedia小于5 n
的实际值))
因此,如果可以在O(n)
中进行排序,那么kruskal的复杂性将为O(E α(E))
如果排序复杂度为O(nloglogn)
,则kruskal的复杂度为O(EloglogE)
,对于密集图,它将为O(v^2loglogv)
(v
为顶点数)