是否有比O(n)更快的方法来检查未排序数组中的所有元素是否为0?

时间:2014-09-24 23:57:10

标签: c

我有一个代码需要检查大小为2048的给定缓冲区是否全为零。现在我进行一次遍历,但想知道是否有更快的方法来检查是否所有包含0.是否有更快的方法?我所拥有的密码如下:

static int isSilent(Uint8* buf, int length){
       int i;
       for(i=0; i<length; i++)
          if(buf[i] != 0) return 0;
       return 1;
}

编辑: 我正在进行实时音频处理,因此缓冲区尺寸很小,并试图减少延迟。只是试图探索更快的方式。谢谢。

3 个答案:

答案 0 :(得分:3)

不,一般来说,如果你想检查整个数组,你必须检查整个数组。如果您事先了解有关阵列的信息,那么您当然可以对此进行优化。

答案 1 :(得分:2)

O(n) is the Big-O complexity for a linear scan

即使在更大的数据对齐中处理(例如,在字或更大的边界上进行处理),仍然会考虑恒定的时间改进。如果适用,执行此类优化/技巧 1 可能会使挂钟时间更长,并且运行速度更快&#34;但不要影响O(n)界限。

但是,请确保这是一个相关的问题,因为2048个元素很小,一旦检测到失败的情况,循环就会终止。


1 在这种情况下可以使用各种技巧。其中一个最值得注意的例子是memcpy,在实现such as this中显示,它使用&#34;字对齐&#34;循环。

答案 2 :(得分:1)

从理论上讲,没有这样的方法。对于未排序的数组,您必须检查它的每个元素,因此这样的操作具有Θ(n)的复杂性。在实践中,您可以使用SIMD概念进行并行处理,但这对于这种简单(小?)任务来说似乎有些过分。基本上你拥有的处理器越多,你就可以获得更高的加速。但假设有一些k ∈ ℕ,其中k > 0是处理器数量,对于任意大Θ(n),您仍然有n的时间复杂度。