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

时间:2014-11-05 00:03:35

标签: java arrays performance optimization boolean

最好的方法是检查数组的所有元素是否等于某个值,最好是java的原生方式? (在此表示为n)

到目前为止,我有:

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

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

编辑:这会更快吗?

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

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

5 个答案:

答案 0 :(得分:15)

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

boolean check = Arrays.asList(times).stream().allMatch(t -> t == n);

仅此一点并不比直接迭代数组更快。但是如果你切换到parallel stream,那么在大型阵列上可能会明显加快。如果性能是一个问题,那么你可能会关注大型数组。

boolean check = Arrays.asList(times).parallelStream().allMatch(t -> t == n);

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

答案 1 :(得分:4)

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

现在只是因为这是algorithm发现所有元素等于某个值并不意味着您已将其优化到最大潜力的最快multi-threaded/multiprocessor

这为 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; 实施留下了空间。

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

一些psudo代码:

{{1}}

当阵列非常大时,这是最好的

答案 2 :(得分:2)

check = times[a]==n && check;

可以

check = times[a]==n;

因为除非check成立,否则你永远不会达到那条线。

答案 3 :(得分:2)

一种简单而干净的方式:

public static boolean allEqual(E[] array, E element) {
    for(E e : array) {
        if(e != element) {
            return false;
        }
    }
    return true;
}

答案 4 :(得分:1)

您可以用更短的方式编写它:

for(int a = 0; a < len && (check = times[a]==n); a++);