我想实现一个快速的算法来完成作业,但是希望使用并行处理来完成这个任务。我听说并行版本的快速排序是最好的选择,但我不确定...也许堆排序是一个不错的选择。您认为哪种算法是最适合并行化环境的,为什么?
我想实现一个快速的算法来完成作业,但是希望使用并行处理来完成这个任务。我听说并行版本的快速排序是最好的选择,但我不确定...也许堆排序是一个不错的选择。您认为哪种算法是最适合并行化环境的,为什么?
归并排序是一种很好的第一种并行排序技术。最佳排序方法始终取决于机器,通常涉及不同大小输入的排序技术的组合。
正如Dean J所提到的,归并排序是一个很好的选择。但它有一个缺点,就是需要在两个线程都完成后进行同步(合并过程)。
虽然快速排序在分区时不可预测,但可以做的是有意识地使第一个分区(决定处理器负载)更或多或少地均匀分配负载,然后让算法自行处理。
优点是,在处理器完成工作后,您无需进行任何类型的同步。完成后,您已经准备好了排序数组,无需额外的合并步骤,这可能会很昂贵。
怎么样考虑分成两步呢。
第一步。将我的数据分成N个块,其中N是我的处理器/节点/核心数。对每个块进行排序。
第二步。将我的N个块组合在一起。
对于排序N个块,您可以根据您的数据使用任何您想要的方法。快速排序、堆排序,我不在乎。对于第二步,归并排序很好地处理了两个已排序列表的组合,所以这可能是您最好的选择。
快速排序是递归的,使任何递归算法并行化的简单方法(仅当它涉及两个或更多递归调用时,如快速排序所做的那样)是为递归调用生成两个新线程,并等待它们完成,然后完成您的函数。这绝不是最优的方法,但这是一种相当快速和简单的递归调用并行化的方法。
我曾经为一个并行化库工作过,开发了一个并行排序算法,但最终得出结论:这样做不值得。对于小数据集,即使只有几个同步原语的成本也会使并行排序比常规排序更慢。对于大数据集,你主要受到共享内存带宽的限制,获得的速度提升很小。在排序大量(我记得是1000万)整数的情况下,我只能在双核处理器上使用并行快速排序获得不到1.5倍的加速。
编辑:
我所做的大部分编程都是数字计算,因此我倾向于按照简单基元进行排序。我仍然认为对于这些情况,使用并行排序是一个坏主意。但如果你正在排序昂贵的比较对象,则此答案不适用。