检查数组中所有元素是不是相等的最快方法
Posted
技术标签:
【中文标题】检查数组中所有元素是不是相等的最快方法【英文标题】:fastest way to check if all elements in an array are equal检查数组中所有元素是否相等的最快方法 【发布时间】:2015-01-01 01:38:00 【问题描述】:检查数组的所有元素是否等于一个值的最快方法是最好的 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);
好的,看到这里的答案后,我知道代码尽可能小,所以我必须研究线程和并行处理,感谢大家的帮助和链接
【问题讨论】:
【参考方案1】:在 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 或内核扫描阵列。
【讨论】:
docs.oracle.com/javase/8/docs/api/java/util/stream/… 还说 allMatch() 可能会短路,这意味着如果找到不匹配的元素,它将不会评估所有元素。【参考方案2】:此算法是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;
当数组非常大时这是最好的
【讨论】:
装腔作势? “并发”是如何变成这样的?【参考方案3】:check = times[a]==n && check;
可以
check = times[a]==n;
因为除非check
是真的,否则你永远不会到达那条线。
【讨论】:
【参考方案4】:简单干净的方式:
public static boolean allEqual(E[] array, E element)
for(E e : array)
if(e != element)
return false;
return true;
【讨论】:
【参考方案5】:你可以用更短的方式来写:
for(int a = 0; a < len && (check = times[a]==n); a++);
【讨论】:
您必须反转条件的两侧,以便以上是关于检查数组中所有元素是不是相等的最快方法的主要内容,如果未能解决你的问题,请参考以下文章