Слова Фібоначчі


11

Наступну проблему я зіткнувся у своєму старому підручнику з алгоритму чеського алгоритму, на жаль, не маючи натяків і рішень.

"Ми визначаємо слова Фібоначчі як , F 1 = b , F n + 2 = F n F n + 1 , де a і b - загальні літери. Як у заданому рядку (над потенційно великим алфавітом) ви можете знайти найдовше підслово Фібоначчі у лінійному часі? "F0=aF1=bFn+2=FnFn+1ab

Я знаю рішення в квадратичному часі, але не можу звести його до лінійного. Хтось може вказати мені на правильний напрямок?


3
Як називається цей старий підручник з алгоритму чеського ;-)
Саїд

Потрібно, щоб підручні слова були суміжними (тобто чинниками) у цій книзі?
Клаус Драгер

Відповіді:


12

Очевидним шляхом є динамічне програмування: нехай зберігає дві літери, для яких словопорядку Фібоначчі i починається з позиції j , і обчислює це, дивлячись на F ( i - 2 , j ) і F ( i - 1 , j + fib ( i ) ) . Це займає максимум часу O ( n log n ) , оскільки існує лише логарифмічно багато можливих значень iЖ(i,j)ijЖ(i-2,j)Ж(i-1,j+фіб(i))О(нжурналн)i.

Але я підозрюю, що можуть бути лише позиції для яких F ( i - 2 , j ) не порожній (тобто, коли два слова однакової довжини Фібоначчі мають однакове перекриття, вони можуть перекриватися лише до постійна частка їх довжини, а не більша частина їх довжини). Непорожні позиції F ( i - 2 , j ) - єдині, для яких потрібно зробити розрахунок (постійний час) для F ( i , j )О(н/фіб(i))Ж(i-2,j)Ж(i-2,j)Ж(i,j). Отже, якщо моя підозра є правдивою, ви можете пришвидшити її до , відстежуючи список непорожніх позицій для кожного значення i та використовуючи список для i - 2, щоб прискорити обчислення списку для i .О(н)ii-2i

Якщо ви зберігаєте в масиві, простір все одно буде O ( n log n ) навіть після прискорення, але це може бути покращено, використовуючи хешблет. Або ж ви можете зберігати F у розфасованому масиві з O ( n ) log n- бітними словами (використовуючи спостереження, що вам потрібно лише знати, порожній він чи ні; ви можете знайти два символи для кожної підрядки, переглянувши перші два його положення у вхідному рядку).ЖО(нжурналн)ЖО(н) журналн


Чи можете ви сказати мені, чому ви думали, що динамічне програмування буде найкращим вибором для цієї проблеми? Де ми зіткнемося з проблемою, якщо використовуватимемо будь-яке статичне програмування на зразок C ?
tarit goswami

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