我想为家庭作业实施快速算法,但是使用并行处理来执行此任务。我听说Quicksort的并行版本是最好的选择,但我不确定这个......也许Heapsort是个好主意。您认为哪种算法最适合并行化环境?为什么?
答案 0 :(得分:6)
快速排序可以将未排序的列表分成两半,但不幸的是,这两半并不能保证在任何地方都能接近。因此,一台机器(或一组机器的一半)可以获得20个条目,另一半可以获得200亿条。
我想不出一个让heapsort并行工作的好方法。它可以做到,但男人,这感觉真的违反直觉。
合并排序是我认为你想要的。
答案 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年前。