我在想什么时候应该用Prim的算法,什么时候用Kruskal的算法来寻找最小生成树?它们都有简单的逻辑,同样的最坏情况,唯一的区别是实现可能涉及一些不同的数据结构。那么决定因素是什么呢?
当前回答
在kruskal算法中,我们在给定的图上有一些边和顶点,但在每条边上我们都有一些值或权重,我们可以为这些值或权重准备一个新的图,这个图必须不是循环的,也不能从任何一侧闭合 例如
graph like this
_____________
| | |
| | |
|__________| |
给任意顶点a b c d e f命名。
其他回答
Kruskal算法的一个重要应用是单链聚类。
考虑n个顶点,你就有了一个完整的图。得到这n个点组成的k个簇。在已排序边集的前n-(k-1)条边上运行Kruskal算法。你得到了具有最大间距的图的k个簇。
在kruskal算法中,我们在给定的图上有一些边和顶点,但在每条边上我们都有一些值或权重,我们可以为这些值或权重准备一个新的图,这个图必须不是循环的,也不能从任何一侧闭合 例如
graph like this
_____________
| | |
| | |
|__________| |
给任意顶点a b c d e f命名。
克鲁斯卡尔时间复杂度最坏情况是O(eloge)这是因为我们需要对边排序。 Prim时间复杂度最坏的情况是O(E log V)优先队列,甚至更好的情况是O(E+V log V)斐波那契堆。 我们应该使用Kruskal当图是稀疏的,即少量的边,如E=O(V),当边已经排序或如果我们可以在线性时间内排序。 当图是密集的,即边的数量很高时,我们应该使用Prim,如E=O(V²)。
我知道你没有要求这样做,但如果你有更多的处理单元,你应该总是考虑bornikolvka的算法,因为它可能很容易并行化——因此它比Kruskal和Jarník-Prim算法有性能优势。
Kruskal's的最佳时间是O(elogv)。对于Prim使用fib堆,我们可以得到O(E+V lgV)。因此,在密集图上,Prim的效果要好得多。
推荐文章
- 什么时候我应该使用Kruskal而不是Prim(反之亦然)?
- 取一个集中在中心的随机数
- 如何计算圆周长上的一点?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?
- 如何使用JavaScript比较软件版本号?数量(只)
- 跳跃表vs.二叉搜索树
- 如何使四舍五入百分比加起来为100%
- 是否有可能得到一个函数的所有参数作为单一对象内的函数?
- LL和LR解析之间的区别是什么?
- log(n!) = Θ(n·log(n))?
- C语言中位反转的高效算法(从MSB->LSB到LSB->MSB)
- 递归还是迭代?
- 两个长度不等的表之间的排列