是否可以选择并行排序算法来实现作业?

时间:2010-08-27 12:42:44

标签: algorithm sorting parallel-processing implementation

我想为家庭作业实施快速算法,但是使用并行处理来执行此任务。我听说Quicksort的并行版本是最好的选择,但我不确定这个......也许Heapsort是个好主意。您认为哪种算法最适合并行化环境?为什么?

7 个答案:

答案 0 :(得分:6)

快速排序可以将未排序的列表分成两半,但不幸的是,这两半并不能保证在任何地方都能接近。因此,一台机器(或一组机器的一半)可以获得20个条目,另一半可以获得200亿条。

我想不出一个让heapsort并行工作的好方法。它可以做到,但男人,这感觉真的违反直觉。

合并排序是我认为你想要的。

  • 每个拆分都是列表的50%,因此很容易在处理器之间进行拆分。
  • 您可以在两组磁带机上实现合并排序,这意味着它不需要整个列表一次在内存中。对于大型列表,尤其是那些大于您可用内存的列表,这是必须的。
  • 合并排序在并行实现中也很稳定,如果重要的话。

答案 1 :(得分:3)

合并排序是一种很好的第一种并行排序技术。最佳排序始终取决于机器,通常涉及不同大小输入的排序技术组合。

答案 2 :(得分:2)

作为Dean J mentions,合并排序是一个很好的候选者。但它的缺点是在完成两个线程时需要同步(合并过程)。

虽然quicksort的缺点是在分区时不可预测,但可以做的是使第一个分区(决定处理器负载)有意识地或多或少均匀地划分负载,然后让算法顺其自然。

优点是在处理器完成工作后,您无需进行任何类型的同步。完成后,您可以准备好已排序的数组,而无需额外的合并步骤,这可能代价高昂。

答案 3 :(得分:1)

如何分两步思考这个问题。

步骤1.将我的数据分解为N个块,其中N是我的处理器/节点/核心数。对每个块进行排序。

步骤2.将我的N块组合在一起。

为了对N个块进行排序,您可以根据数据使用任何您想要的内容。 Quicksort,heapsort,我不在乎。对于第2步,合并排序可以很好地组合两个排序列表,因此这可能是您最好的选择。

答案 4 :(得分:0)

快速排序是递归的,一种使任何递归算法并行的简单方法(只有当涉及两个或更多递归调用时,如同quicksort所做的那样),是为递归调用生成两个新线程,并等待它们完成,然后完成你的功能。这绝不是最佳选择,但它是一种相当快速和脏的并行递归调用方式。

答案 5 :(得分:0)

我实际上在一段时间之前为并行化库工作了一个并行排序算法,并得出结论,它不值得做。对于小型数据集,即使是一些同步原语的成本也使得并行排序比常规排序慢。对于大型数据集,您主要受共享内存带宽的限制,并且您获得的加速最小。对于对大量(我认为1000万)整数进行排序的情况,我只能使用并行快速排序IIRC在双核上获得<1.5倍的加速。

编辑:

我所做的大部分编程都是数字运算,因此我倾向于考虑对简单基元进行排序。对于这些情况,我仍然认为并行排序是一个坏主意。但是,如果您要对比较昂贵的东西进行排序,则此答案不适用。

答案 6 :(得分:0)

您应该考虑Bitonic Sorting

这个算法有点类似于合并排序,但它有一个有趣的转折:不是将数组的两半从下到上排序,然后合并,而是在相反的方向上排序数组的一半< / em>,获取 bitonic 数组:包含两个相反方向的单调部分。

Bitonic数组可以以非常好的并行方式合并到排序数组中:虽然它的总时间复杂度为O(n log(n)),但它的所有比较和交换都是独立的,即元素的选择与通常的合并不同,compare不依赖于之前的比较结果。因此,它承认完全并行化。

Youtube video表现出一种讽刺的感觉。

PS - 我猜测提问者的作业已经到期... 3年前。