我正在计算像这样的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算法:
这是正确的还是我做错了请告诉你。
答案 0 :(得分:10)
Kruskal是O(E log E);你的推导是对的。你也可以说O(E log V),因为E< = V * V,所以log(E)< = 2 log(V)(我不知道为什么我记得那个,除了我认为一个教授把它放在考试上......)
答案 1 :(得分:4)
从| 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)
答案 2 :(得分:1)
很抱歉迟到的回复 Kruskal算法的运行时间为O(E log E)而不是O(E log V)。
因为,必须首先对边进行排序,并且它需要O(E log E)来支配运行时,以验证所考虑的边是否是安全边缘,这将需要O(E log V)。并| E | &GT; | V |((如果图形已经是树的情况下的极端情况)),因此可以安全地假设运行时为O(E log E)
答案 3 :(得分:0)
第5到9行,复杂度为O(E)。
直到第5行,你已经正确地计算了复杂性。最后,这里的支配因子是O(E lg E)。因此,复杂性是O(E lg E)
答案 4 :(得分:0)
所有其他答案都是正确的,但是我们可以考虑以下情况,这给了我们 O(| E |)的时间复杂度。
以下答案来自Algorithms book by Dasgupta,第5章,第140页,节路径压缩:
在此算法的时间复杂度计算中,主要部分是边缘排序部分,该部分为 O(| E | log | E |)或所有其他答案都说明为O(| E | .log |。 V |)。
但是,如果给定的边被排序怎么办?
或者,如果权重较小(例如O(| E |)),则可以在线性时间内进行排序(例如应用counting sort)。
在这种情况下,数据结构部分将成为瓶颈(联合查找),考虑将其性能提高到每个操作的log n以上是很有用的。
解决方案是在执行find()操作时使用path-compression方法。
实际摊销成本仅略高于O(1),而较早的O(log n)更低。有关更多详细信息,请检查this reference。
简要的想法是,每当调用find(v)操作以查找v所属集合的根时,所有节点到其父节点的链接都将更改,并指向该根。这样,如果您在同一路径上的每个节点x上调用find(x)操作,您将在O(1)中获得集合的根(标签)。因此,在这种情况下,算法瓶颈是联合查找操作,使用所描述的解决方案是O(1),在所描述的情况下该算法的运行时间是O(| E |)。
答案 5 :(得分:0)
O(ElogE)肯定是O(ElogV),因为E <= V ^ 2(全连接图)
ElogE <= Elog(V ^ 2)= 2ElogV = O(ElogV)