【问题标题】:In-place sorting items into segments将项目就地分拣成段
【发布时间】:2014-10-19 21:27:38
【问题描述】:

我有 nT 类型的项目数组,以及一个为每个项目分配一个类别的分类函数 f(t)数字,从 O 到 k-1。 (k 是类别的数量)。 目标是将数组分成 k 个段,每个类别一个,然后重新排列项目,使它们都在正确的段中。

使用两个不同的输入和输出数组,我可以在 O(n) 中完成,但我需要就地完成(即使用交换作为基本操作),如果可能的话,使用可并行化的算法。

一个想法是一个接一个地做一个片段(首先将所有 0 交换到开头 [O, i0] 的片段上,然后全为 1(从 i0) 到之后的新段,等等)。这将是 O(n * k)(n 越来越小),但不可并行化。

另一种方法是使用 O(n log n) 中的排序算法,该算法可能是可并行化的,但这可能不是最优的,因为大多数项目比较相等.

我的问题是什么是解决这个问题的好方法,以及这个问题在文献中如何称呼?

【问题讨论】:

  • 这里是部分副本(不讨论并行化):stackoverflow.com/questions/15682100/…。并行化的一种方法是分成几部分;安排好每一件作品;然后就地并行合并(最后一个不是 O(n)。)希望能给你一些搜索键。

标签: arrays algorithm sorting parallel-processing


【解决方案1】:

作为一个简短的说明,这个问题与 Dutch national flag problem 有关 - 但不完全相同。在这个问题中,您有一个包含三种不同颜色(红色、白色和蓝色)的球的数组,目标是重新排序元素以使它们排序,使红色先出现,然后是白色,然后是蓝色。

使用来自荷兰国旗问题的想法,我认为您可以相对有效且就地解决这个问题。例如,您可能想要使用专门设计用于处理重复元素的快速排序变体。例如,Bentley-McIlroy 3-way partitioning algorithm 专门设计用于处理存在大量重复键的输入,并进行快速排序,其中分区方案将元素分为三组 - 小于键的元素、大于键的元素和元素等于键 - 然后只对“更少”和“更大”组进行排序。如果你有一个只有 k 个不同值的数组,那么运行时间将是 O(n log k) 的预期,因为每个递归调用都将在一个子数组上进行,其中的不同键数量大约是其一半。这不是 O(n),但它确实在原地工作并且并行化得非常好(让不同的线程处理每个子数组)。

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2016-05-16
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    相关资源
    最近更新 更多