就地将物品分类成段

时间:2014-10-19 21:27:39

标签: arrays algorithm sorting parallel-processing

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

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

一个想法就是一个接一个地进行一个分段(首先将所有0&#s交换到开头的一个分段[O, i0 ],然后是所有1个分段(在 i0 之后开始到之后的新片段等)。这将是O( n * k )( n 越来越小),但不可并行化。

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

我的问题是这个问题的好方法是什么,以及如何在文献中调用这个问题?

1 个答案:

答案 0 :(得分:0)

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

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