2014-02-12 37 views
3

我需要并行kruskal算法,序列版本使用联合查找算法来检测无向图中的周期。有什么办法可以将这部分代码并行化吗?并行联合查找算法

+0

好问题!但是,你能告诉我们迄今为止你的尝试代码吗? –

+0

由于[Disjoint-set_data_structure](http://en.wikipedia.org/wiki/Disjoint-set_data_structure)的所有功能几乎都是恒定时间(但初始化)。我想知道在这些函数上做并行性是否合理...可以通过并行来对边缘进行分类。 – Jarod42

回答

3

那么,它可以在一定程度上并行化。它如下:

最初所有的边都按照升序排序。有一个main thread实际上从头开始扫描每条边,并决定添加当前边是否形成循环。我们并行化算法的主要目的是使这些检查平行。

这是我们使用worker threads的地方。每个线程都有一定数量的边进行检查,每个线程在每次迭代后检查其边是否与当前表示形成循环(迭代表示主线添加新边)。当主线程继续添加边时,一些线程会看到某些边已经与当前表示形成一个循环。

这样的边缘被标记为discarded。当主线程到达这样的边缘时,它会简单地移动到下一个边缘,而不进行任何检查。

因此,我们实际上使这些检查并行,这意味着算法运行迅速提高效率。

实际上,有一个nice paper使用了上述相同的想法。

编辑:

如果你非常在意过的所有算法的运行时间,你甚至可以使用并行排序算法最初是作为@ jarod42建议。

+0

在openMP中使用这种方法很容易吗?我的意思是,用时间表管理线程似乎很困难.. – Betelgeuse

+1

@Betelgeuse你只需创建线程并为每个线程分配特定数量的边线。一种分配方式是序列式的。而且他们会在添加新边缘后检查。如果分配给线程的所有边都由主线程完全处理,则终止相应的工作线程。我想这很容易! – nitish712