Очевидним шляхом є динамічне програмування: нехай зберігає дві літери, для яких словопорядку Фібоначчі 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 + fib( i ) )O ( n журналn )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 .O ( n )ii - 2i
Якщо ви зберігаєте в масиві, простір все одно буде O ( n log n ) навіть після прискорення, але це може бути покращено, використовуючи хешблет. Або ж ви можете зберігати F у розфасованому масиві з O ( n ) log n- бітними словами (використовуючи спостереження, що вам потрібно лише знати, порожній він чи ні; ви можете знайти два символи для кожної підрядки, переглянувши перші два його положення у вхідному рядку).ЖO ( n журналn )ЖО ( н.)) журналн