我想知道Boruvkas算法和Kruskals算法之间的区别。
他们有什么共同点:
唯一的区别似乎是,Boruvkas透视图是每个单独的节点(从哪里寻找最便宜的边缘),而不是查看整个图形(如Kruskal所做的那样)。
因此,似乎Boruvka应该相对容易并行(与Kruskal不同)。真的吗?
答案 0 :(得分:1)
您的描述是准确的,但可以澄清一个细节:Boruvka算法的视角是每个连接的组件而不是每个单独的节点。
你对并行化的直觉也是正确的 - this paper有更多细节。摘自摘要:
在本文中,我们为任意稀疏图设计并实现了四种并行MST算法(Boruvka的三种变体加上我们的新方法),与最佳顺序算法相比,它首次提供了加速。
答案 1 :(得分:1)
Boruvka算法与Kruskal或Prim之间的重要区别在于,使用Boruvka,您不需要预先设定边缘或保持优先级队列。
Boruvka仍然会在成本中产生额外的log N因子,但它需要O(log N)通过边缘。
你可以并行化Boruvka算法,但你也可以并行排序,所以我不知道Boruvka在实践中是否比Kruskal有任何真正的优势。
答案 2 :(得分:1)
对于 Kruskal算法,首先我们要对从最便宜到最昂贵的边缘进行排序。然后在每个步骤中我们删除最小权重边缘,如果它没有在我们的图形中创建一个循环(最初由|V|-1
个单独的顶点组成),那么我们将它添加到MST。否则我们只是删除它。
Boruvka算法查找每个组件的最近邻居(最初是顶点)。它不断从每个组件中选择最便宜的边缘并将其添加到我们的MST中。当我们只有一个连接组件时,就完成了。
可以轻松地并行完成从每个节点/组件中找到最便宜的传出边缘。然后我们可以合并新的,获得的组件并重复发现阶段,直到找到MST。这就是为什么这个算法是并行性的一个很好的例子(在发现MST的情况下)。
关于使用 Kruskal 算法的并行处理,我们需要严格按顺序保留和检查边缘,这就是为什么难以实现显式并行性的原因。它是相当顺序的,我们不能做很多事情(即使我们仍然可以考虑例如并行排序)。虽然很少有方法以并行的方式实现这种方法,但可以很容易地找到那些文件来检查它们的结果。