假设我在全局内存中有一个大数组,大部分都是0,但有一些元素(25%)是数字:
[9, 0, 0, 0, 7, 0, 0, 3, 0, 0, 0, 0, 5, 0, 0, 0, 8, 0, 2, 0, 0, 4, 0, 0, 0, 0, 5]
是否有任何有效的内核通过移动数字来压缩该数组> 0到左侧?
[9, 7, 3, 5, 8, 2, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我认为在许多潜在的解决方案中,通常从二进制缩减算法中获取灵感,但那些并不真正适用,因为我没有将所有数字压缩成一个,而是很多。例如,半完整的初始数组不会发生很大变化。当然,一种方法是将数组移动到CPU并应用明显的顺序算法:
var j = 0;
var x = 0;
for (int i = 0; i < len; ++i) {
if (arr[i] !== 0) {
x = arr[j];
arr[j] = arr[i];
arr[j] = x;
}
if (arr[j] > 0) {
j += 1;
}
}
但对于足够大的数组而言,开销可能很大。我找不到任何需要少于O(N)
内核调用的解决方案。