Знайдіть найдовший візерунок у рядку


9

Я шукаю ефективний алгоритм, щоб знайти найдовший повторюваний візерунок у рядку.

Наприклад, розглянемо наступний рядок чисел:

5431428571428571428571428571427623874534.

Як бачите, 142857142857це найдовший візерунок, який повторюється пару разів (принаймні двічі) у цьому рядку.

Повторний рядок не повинен містити жодної ідеї, а не грубої сили?


3
Ви не визначали, що означає "пару разів", але якщо "двічі" вважається "пару разів", то 142857це не найдовше, тому що 142857142857довше. Я думаю, що вам слід відредагувати питання, щоб уточнити, що ви маєте на увазі під «повторним шаблоном».
Цуйосі Іто

дуже хороший момент. Я оновлю питання.

8
Ви вимагаєте, щоб випадки дії шаблону були невід'ємними один від одного? Бо як ні, то 142857142857 все ще не найдовше повторення; 142857142857142857142 трапляється двічі. У будь-якому випадку, звичайна відповідь на такі питання як "дерева суфіксів".

Відповіді:


15

Проблема напрочуд нетривіальна. По-перше, два алгоритми грубої сили. Квадрат ("повторний візерунок") задається його довжиною і положення p, і потребує часу O()перевірити. Якщо ми перейдемо над усім і p, ми отримуємо O(n3)алгоритм. Ми можемо покращити це, спочатку перебравшись, а потім сканувати рядок двома запущеними покажчиками на відстані від . Таким чином можна перевірити, чи квадрат довжини2 існує в лінійному часі, даючи загальний час роботи O(n2).

Колпаков і Кучеров розробили алгоритм пошуку всіх максимальних повторів у слові в часіO(n) [1], і їх алгоритм можна використовувати для знаходження всіх максимальних квадратів у часі O(n). Повтор подсловом видуwkx, де k2 і x є правильним префіксом w. Найбільший квадрат, що міститься в цьому повторі, - це(wk/2)2. Використовуючи цю формулу, даються всі максимальні повтори в слові (з яких є тількиO(n) багато), можна знайти найбільшу площу.


[1] Колпаков Р., Кучеров Г. (1999). Пошук максимальних повторів у слові за лінійним часом . In Foundations of Computer Science, 1999. 40-й щорічний симпозіум про (с. 596-604). IEEE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.