Как быстро найти индекс начала подпоследовательности из n нулей в массиве целых чисел?

Как можно эффективнее найти позицию последовательности из n нулевых битов длиной 65536 бит, хранящихся в виде массива int[]?
  • 1 мая 2024 г. 19:10
Ответы на вопрос 2
Для поиска индекса начала подпоследовательности из n нулей в массиве целых чисел можно использовать следующий алгоритм:

1. Пройти по массиву от начала до конца, поддерживая счетчик нулей.
2. Если текущий элемент равен нулю, увеличивать счетчик на 1.
3. Если текущий элемент не равен нулю, сбрасывать счетчик в ноль.
4. Если счетчик достигает значения n, значит найдена подпоследовательность из n нулей. Возвращать индекс начала этой подпоследовательности.

Для поиска позиции последовательности из n нулевых битов длиной 65536 бит, хранящихся в виде массива int[], можно использовать аналогичный алгоритм, только в данном случае нужно обрабатывать элементы массива как битовые последовательности.

1. Пройти по массиву от начала до конца, поддерживая счетчик нулей.
2. При каждой итерации выполнить побитовую проверку на ноль для каждого бита в текущем элементе массива (используя битовые операции).
3. Если найдена последовательность из n нулевых битов, возвращать позицию текущего элемента и позицию бита внутри элемента.

Этот подход позволяет эффективно находить позицию длинных последовательностей из нулей в больших массивах без необходимости обработки каждого бита по-отдельности.
Зависит от длины n. Если n маленькое то можно прикладывать маску. Байт x содержит 3 ноля в последних битах, если ~x &0x7 == 0x7 . Аналогично, сдвигая маску из трех единиц (0x7) можно приложить ко всем позициям. 

Если n большое, то надо чтобы было много нулевых байт в массиве подряд. Тут можно использовать SSE инструкции для массового сравнения байт с нулями.

Потом, можно еще распараллелить поиск в несколько потоков. Каждый поток ищет последовательность, начинающаюся в отдельном куске массива.
Похожие вопросы