在时间日志中移动数组中的元素(n)

时间:2015-03-10 16:21:39

标签: c parallel-processing

我有两个数组名[i]和信号[i],两个都是大小n。

Tom  Tim  Kate  Jim
0    1     1    0

其中名称以数组名称存储,并且每个名称的值为0或1。

我想将所有带有0值的名称移动到数组的左侧,而将那些带有1的名称移动到右侧,并且顺序不会改变。因此结果看起来像

Tom   Jim   Tim   Kate
0      0     1     1

关键是如何用n CPU在时间log(n)中实现它?

2 个答案:

答案 0 :(得分:0)

这是不可能的,只是弄清楚哪一个是零,哪一个是一个将花费O(n)时间因为你必须看每一个。

使用n个核心,你可以让每个核心看一个不同的元素,然后他们看向他们的邻居,左边的一个接受所有的零,而奇数接受那些有一个。偶数索引核心用偶数索引的邻居重复这个,依此类推......

在这些操作的O(log n)之后,最左边的核心将具有零的所有项目,并且最右边的核心将具有所有具有一个的项目。

答案 1 :(得分:0)

也许你可以根据信号值将名称分成两个大小为n的数组。然后使用类似“Parallel Reduction”的算法在每个数组中收集你的名字,然后将两个数组合并为一个。

每个线程读取与其线程编号关联的名称。如果名称的信号为0,则在name_0 [thread_id]中添加名称,信号等于1的类似事物。因此,您有2个有序数组,第一个是所有信号0,第二个是信号1.所以你“只是”必须折叠这两个阵列(启发你的“并行减少算法”?)。

这是我看到的最简单/并行处理算法。