是否可以并行对几乎排序的数组进行排序?

Is it possible to sort an almost sorted array in parallel?

提问人:user5965026 提问时间:3/11/2021 最后编辑:user5965026 更新时间:3/11/2021 访问量:136

问:

“几乎排序的数组”在这里被定义为每个元素在排序数组中距离其位置最多。数组大小为 。串行中的基本算法是使用最小堆(假设您要按升序排序),它给出 O((n-k)log k + k) 运行时间,或者,您可以使用插入排序并获得 O(nk) 运行时间。kn

对于这两种算法中的任何一种,我都没有看到并行化它的好方法。因此,您可以将数组拆分为连续的块,并将每个段发送到单个线程,但问题是段末尾的某些元素总是会落入排序数组中的不同段。因此,如果您要使用多线程,则会遇到数据争用问题,或者,您可以添加锁以避免数据争用问题,但会牺牲性能。

有没有更好的方法可以并行解决这个问题?

数组 与语言无关

评论

0赞 Gene 3/11/2021
如果 n 比 k 大得多,则将其拆分为与处理器一样多的子数组,并使用在所有子数组上并行运行的最小堆算法是有意义的。完成后,您就知道唯一不在正确位置的元素位于子数组之间边界的 k 个元素内。然后通过重新排序这些区域来完成,再次并行。这只是一个 2 次通过算法。无需锁定。可能有一种更精致的方式来表达这个想法。
0赞 user5965026 3/14/2021
@Gene 说我们想要 n/num_processors >> k,而不是简单地说 n >> k 会更正确吗?我想可能存在 n >>> k 但你有一堆处理器的情况,使得 n/num_processors ~ k。
0赞 user5965026 3/14/2021
@Gene 至于第二遍,你会少用一个处理器,对吧?因为您只需要检查连续处理器之间的边界。

答: 暂无答案