Самый быстрый способ проверить логический массив в Java

Итак, у меня есть массив логических значений, и я пытаюсь найти, есть ли там хотя бы одно «истинное». Каков самый быстрый способ вычислить это? Поможет ли каким-либо образом изменение логического массива на массив байтов (или какой-либо другой тип)?


person RIFAT Rafael Birmizrahi    schedule 23.04.2020    source источник
comment
Поможет ли каким-либо образом изменение логического массива на массив байтов (или какой-либо другой тип)? Как это поможет? Вы имеете в виду во время проверки, тогда точно не будет быстрее. Вы спрашиваете, есть ли лучшая структура данных?   -  person matt    schedule 23.04.2020
comment
@matt Если вы используете 1 бит на логическое значение в другом типе, вы можете проверить 8 (байт) или до 64 (длинных) битов за одно сравнение, например. есть хотя бы один истинный бит, когда значение другого типа не равно 0.   -  person Lucero    schedule 23.04.2020
comment
@Lucero, но если вы создали длинное значение из набора логических значений, вам нужно просмотреть каждое логическое значение и установить бит. В Java нет фактической функции приведения. Поэтому, если вы все равно просматриваете все логические значения, вы будете медленнее, чем просто проверять логическое значение.   -  person matt    schedule 23.04.2020
comment
@matt Мое понимание OP Поможет ли изменение логического массива на массив байтов (или какой-либо другой тип)? заключается в том, что он будет использовать другой массив для хранения логических значений, а не преобразовывать их перед проверкой.   -  person Lucero    schedule 23.04.2020
comment
@Lucero, в чем был смысл моего вопроса. использование long[] вместо boolean[] может дать незначительное увеличение, но использование чего-то вроде BitSet может быть намного быстрее в зависимости от характера данных.   -  person matt    schedule 23.04.2020
comment
На самом деле, я обнаружил, что Arrays.mismatch работает немного быстрее, чем цикл. Спуск по кроличьей норе исходного кода приводит к vectorizedMismatch, который использует unsafe для приведения данных к типу long и оценки.   -  person matt    schedule 23.04.2020
comment
@matt да, это именно то, что я имел в виду, извините за путаницу.   -  person RIFAT Rafael Birmizrahi    schedule 25.04.2020


Ответы (1)


Самый быстрый способ - перебрать массив:

for (boolean element : array){
  if (element) { 
    return true; 
  }
}
return false;

Конечно, это O(n).

person I.R.    schedule 23.04.2020