繁体   English   中英

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

[英]fastest way to check if all elements in an array are equal

什么是最好的方式,最好是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);

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

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

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

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

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

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

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

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

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

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

一些psudo代码:

 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;

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

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

check = times[a]==n;

因为除非check是真的,否则你永远不会达到那条线。

简单干净的方式:

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

你可以用更短的方式写它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM