2014-11-05 3 views
3

Каким будет самый быстрый способ, например, родной для java, чтобы проверить, равны ли все элементы массива значению? (Обозначается здесь п)Самый быстрый способ проверить, равны ли все элементы в массиве

До сих пор у меня есть:

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

Таким образом, если каждый элемент равен значению, проверка устанавливается истина, в противном случае он устанавливается в ложь.

EDIT: Будет ли это быстрее?

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

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

может быть

check = times[a]==n; 

, так как вы никогда бы не дошли до этой линии, если check не было правдой.

+0

нормально, это имеет смысл, и дает мне идею для цикла в то время как – spyr03

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); 

Параллельный поток позволяет сканирование массива, который будет поделено на несколько потоков, сканирование массива с использованием параллельных процессоров или ядер.

+0

http://docs.oracle .com/javase/8/docs/api/java/util/stream/Stream.html # allMatch-java.util.function.Predicate- также говорит, что allMatch() может быть короткозамкнутым, что означает, что событие не будет оценивать все элементов, если он находит несоответствие. –

1

Вы можете написать его в более короткий путь:

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

вам придется перевернуть две стороны условия, чтобы spyr03

+0

Хорошая точка, спасибо – ToYonos

2

Простой и чистый путь:

public static boolean allEqual(E[] array, E element) { 
    for(E e : array) { 
     if(e != element) { 
      return false; 
     } 
    } 
    return true; 
} 
Смежные вопросы