Теория A: Если в последовательности длины N есть K вхождений буквы X, то существует как минимум два вхождения X, так что расстояние между ними меньше N/K.
Найдите минимальную букву и укажите указатели на все ее вхождения в отсортированном списке. Позвоните по этому адресу.
Для данного г найдите минимум букв в A [i] + r и отфильтруйте все указатели, для которых элемент в точке A [i] + r не равен min. Также отфильтруйте все указатели A [j] такие, что A [j] = A [i] + r для некоторого i.
Вам нужно будет выполнить вышеуказанное утверждение не более N/K раз, и каждый прогон будет стоить не более O (K). Поэтому сложность этого алгоритма O (N).
Подробный алгоритм: Предположим, что Z - это круговой список, с которым мы имеем дело.
def filter(A,Z,r):
t = min(Z[A[i]+r]) forall i
remove A[i] if Z[A[i]+r]!=t forall i
rmflag = [false if A[i]==A[j]+r else false for i in range(len(A)] //NOTE: This step can be done in O(len(A)) time since A is sorted
remove A[i] if rmflag[i]
Вы можете легко найти его: сгенерировать все возможные строки (там будет 'n', где' n' - длина исходной строки), а затем просто найти первый, используя линейный поиск/выбор. Обе операции принимают значение «O (n)». –
@ H2CO3: сложность будет очень большой. Я ищу O (n) алгоритм. Ваш подход O (n^2). – jairaj
@jairaj "Очень большой"? Почему? Для генерации подстрок требуется 'O (n)', затем 'O (n)' для поиска минимума. (И вообще, теперь yoyu ищет решение «O (n)» или «O (1)»? Ваш комментарий не соответствует критерию в заголовке.) –