2014-11-05 157 views
3

java最好的方法是檢查一個數組的所有元素是否等於一個值,最快的方法是什麼? (這裏表示由N)檢查數組中的所有元素是否相等的最快方法

到目前爲止,我有:

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

所以,如果每一個元素都是相等的值,檢查設置爲true,否則設置爲false。

編輯:這會更快嗎?

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

好了,在這裏回答後,看我理解的代碼是小公司會得到,所以我不得不考慮線程和並行處理,感謝大家的幫助和聯繫

回答

4

這種算法是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; 

這是最好的時候,數組是非常大的

+0

真的? 「同時」如何變成這個? – kaqqao 2016-03-28 13:10:50

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

可以

check = times[a]==n; 

,因爲你永遠不會已經得到了這條線,除非check是真實的。

+0

OK,這是有道理的,並給了我一個while循環 – spyr03 2014-11-05 00:07:05

14

在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或核心掃描陣列。

+0

想法http://docs.oracle .com/javase/8/docs/api/java/util/stream/Stream.html#allMatch-java.util.function.Predicate-還表示allMatch()可能會短路,這意味着它不會事件評估所有元素如果發現不匹配的元素。 – 2014-11-05 23:10:10

1

您可以在更短的方式把它寫:

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

你必須扭轉條件的雙方,所以一個 spyr03 2014-11-05 00:16:21

+0

好點,謝謝 – ToYonos 2014-11-05 00:20:44

2

一個簡單而乾淨的方式:

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