检查数组中所有元素是否相等的最快方法

spy*_*r03 4 java arrays optimization performance boolean

什么是最好的方式,最好是java本机检查数组的所有元素是否等于一个值?(在此表示为n)

到目前为止,我有:

boolean check = true;
int len = times.length;
for(int a = 0; check && a < len; a++) {
    check = times[a]==n && check;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果每个元素等于一个值,则check设置为true,否则设置为false.

编辑:这会更快吗?

boolean check = true;
int len = times.length
int a = 0;
while(a < len && times[a]==n) {
    a++;
}
check=(a==len);
Run Code Online (Sandbox Code Playgroud)

好的,看了这里的答案,我明白代码的规模和它一样小,所以我将不得不研究线程和并行处理,感谢大家的帮助和链接

Joh*_*ica 15

在Java 8中,您可以使用Stream API:

boolean check = Arrays.asList(times).stream().allMatch(t -> t == n);
Run Code Online (Sandbox Code Playgroud)

仅这一点并不比直接迭代数组更快.但是,如果您随后切换到并行流,则在大型阵列上可能会明显更快.如果性能是一个问题,它可能是您关心的大型阵列.

boolean check = Arrays.asList(times).parallelStream().allMatch(t -> t == n);
Run Code Online (Sandbox Code Playgroud)

并行流允许将阵列扫描分配到多个线程,使用并行CPU或内核扫描阵列.


Jay*_*Jay 4

该算法是O(n)检查列表中所有元素的最快方法,因为您只需检查每个元素一次。

现在,仅仅因为这是查找所有元素是否等于某个值的最快方法,algorithm并不意味着您已将其优化到最大潜力。

这就为multi-threaded/multiprocessor实施留下了空间。

使用更多核心或线程的解决方案是将数组拆分为您想要同时处理的线程/核心数量,即,如果您有一个包含 100 个元素的数组并希望同时运行 10 个线程 - 将数组拆分为 10 个部分,然后运行阵列上的每个部分。

一些伪代码:

 int from,to, threadCount = 10;
 boolean check[threadCount];  

 int factor = array.length()/threadCount;
 for(int i = 0; i < threadCount; i++){
      from = i*factor;
      to = i*factor+factor;
      newThreadProcess(from, to, array, check[i]);     
 }

 barrier(); //Wait till all the threads are done processing
 for(int i = 0; i < threadCount; i++){
    if(!check[i]) return false;
 }
 return true;
Run Code Online (Sandbox Code Playgroud)

当数组很大时这是最好的