【发布时间】:2012-09-22 16:32:20
【问题描述】:
我有一个字节数组
unsigned char* array=new unsigned char[4000000];
...
我想获取数组中所有非零元素的索引。
当然,我可以这样做
for(int i=0;i<size;i++)
{
if(array[i]!=0) somevector.push_back(i);
}
还有比这更快的算法吗?
更新 1 我可以看到大多数人的答案是否定的。我希望有一些我不知道的神奇位操作。有些人建议进行排序,但在这种情况下不可行。但是非常感谢您的所有回答。
更新 2 在发布此问题 4 年零 4 个月后,@wim 建议 this answer that looks promising。
【问题讨论】:
-
除非您有特殊限制,否则没有比查看每个元素以检查其是否为零更快的方法了。
-
示例拉取所有正面元素
-
怎么会比 O(n) 快?如果不检查每个元素,您将无法分辨。
-
嗯,您可以做的一件事是避免浮点到整数的转换。 IE。比较 0.f 而不是 0
-
@David,那么我会考虑使用字节数组来存储值,然后进行 ULONG 比较,以便一次比较 4 个字节(32 位架构)。然后如果有一个非零,确定哪些字节是非零。这应该会在一次比较 4 字节的速度上产生显着差异。