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