Найти индекс разделения в двоичной строке

#algorithm

#алгоритм

Вопрос:

Предположим, у нас есть двоичный массив A размера n , и все 1 находятся посередине, а все 0 — с обеих сторон 00011000 . Мы не знаем количество единиц, и массив может быть не симметричным, и нам гарантировано, что по крайней мере 1 позиция i, что A[i] = 1 и по крайней мере одна позиция j:j<i, A[j]=0 и по крайней мере одна позиция k:k>i, A[k]=0 .

Каким может быть эффективный алгоритм, возможно, со сложностью poly(log n) , чтобы найти индекс разделения между 0 и 1, т. Е. Индекс i такой, что (A[i]=1,A[i-1]=0) или (A[i]=1, A[i 1]=0) ? Есть ли у нас название для этой проблемы?

Комментарии:

1. Вопрос неясен. Каковы ограничения? Является ли массив симметричным? Есть ли хотя бы один 0 и один 1? Что вы подразумеваете под индексом разделения?

Ответ №1:

Тривиальное решение является оптимальным

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

Теперь рассмотрим ситуацию, в которой в массиве есть только один 1 . Все, что мы можем сделать, чтобы найти это 1 , это проверять каждую позицию, пока не найдем ее. Пока 1 не найден, мы найдем только 0 те, которые не дают нам никакой информации о местонахождении 1 . Конечно, нам не нужно проверять первый или последний элемент массива, поскольку они гарантированно будут 0 , но это существенно не помогает.

Вы можете добиться большего успеха на квантовом компьютере

На квантовом компьютере вы можете использовать алгоритм Гровера для поиска 1 в O(sqrt n) , после чего вы можете найти любой из индексов разделения с помощью простого двоичного поиска, в общей сложности O(sqrt(n) log(n)) = O(sqrt n) .