我有两个数组名[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)中实现它?
答案 0 :(得分:0)
这是不可能的,只是弄清楚哪一个是零,哪一个是一个将花费O(n)时间因为你必须看每一个。
使用n个核心,你可以让每个核心看一个不同的元素,然后他们看向他们的邻居,左边的一个接受所有的零,而奇数接受那些有一个。偶数索引核心用偶数索引的邻居重复这个,依此类推......
在这些操作的O(log n)之后,最左边的核心将具有零的所有项目,并且最右边的核心将具有所有具有一个的项目。
答案 1 :(得分:0)
也许你可以根据信号值将名称分成两个大小为n的数组。然后使用类似“Parallel Reduction”的算法在每个数组中收集你的名字,然后将两个数组合并为一个。
每个线程读取与其线程编号关联的名称。如果名称的信号为0,则在name_0 [thread_id]中添加名称,信号等于1的类似事物。因此,您有2个有序数组,第一个是所有信号0,第二个是信号1.所以你“只是”必须折叠这两个阵列(启发你的“并行减少算法”?)。
这是我看到的最简单/并行处理算法。