在执行排序与使用优先级队列之间Kruskal算法的权衡是什么?

时间:2015-12-15 05:37:07

标签: algorithm

我正在学习Kruskal的算法,我遇到了几个不同的实现,并想知道它们之间可能存在什么样的权衡。这两个实现如下:

实施一 - 将图中的所有边放入优先级队列PQ - 从PQ中删除最小边e    - 如果e连接2个先前未连接的图形组件(使用Union Find数据结构测试),则将其添加到MST - 重复直到MST中的边数等于图中的顶点总数 - 1

实施二 - 对图中的所有边执行合并排序或快速排序 - 从排序的边缘数组中删除最小边 然后和上面的算法一样做

所以唯一真正的区别是在O(eloge)时间内是使用优先级队列还是执行前期排序。

这里的权衡是什么?两个实现似乎都有相同的运行时间 - O(ElogV)。我说logV而不是logE,因为连接的无向图中的最大边数是O(V ^ 2),logV ^ 2 = 2logV,因此去除常数因子可以减少到O(logV)。

2 个答案:

答案 0 :(得分:2)

两种变体都具有相同的渐近复杂度。如果存在大量边缘,则具有优先级队列的实现可以稍微好一些,因为实际上按重量对它们进行全部排序可能不是必需的。在找到生成树之前,只需要最小的边。其余边缘的确切顺序无关紧要。

然而,如果这导致节省,则很大程度上取决于输入数据。例如,如果权重最高的边是最小生成树的一部分,则必须考虑所有边。在实践中,我不会期待太大的差异。

答案 1 :(得分:0)

除了亨利的答案之外,在实践中,排序方法的性能还取决于使用哪种排序算法的特定变体。例如。快速排序可以是O(n ^ 2),除非使用昂贵的中位数查找算法(通常它不是 - 并且通常不会导致问题)。

Mergesort是最坏情况的O(n log n)。 Heapsort也是如此,但它的内存访问非常分散,因此与基本上所有其他排序算法相比,它从缓存和RAM突发模式中获益更少 - 在中小型输入或近似排序的输入上,可以使它比快速O(n ^ 2)排序更慢,如插入排序。关于我能说得最有信心的是,PQ方法应该胜过基于堆的排序方法,因为它确实是后者工作的严格子集。