Складність наївного алгоритму пошуку найдовшого підрядка Фібоначчі


10

Давши два символи і b , давайте визначимо k - ту рядок Фібоначчі так:abk

F(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else

з позначає конкатенацію рядків.⋆

Таким чином у нас буде:

  • F(0)=b
  • F(1)=a
  • F(2)=F(1)⋆F(0)=ab
  • F(3)=F(2)⋆F(1)=aba
  • F(4)=F(3)⋆F(2)=abaab
  • ...

Дана рядок , утворений п символів, визначить Фібоначчі подстроки як будь-яка подстрока зSn , який також є рядок Фібоначчі для відповідного виборуі б .Sab

Проблема

Враховуючи , ми хочемо знайти його найдовшу підрядок Фібоначчі.S

Тривіальний алгоритм

Припустімо, для кожного положення рядка S , що F ( 2 ) починається там (достатньо перевірити, чи знаки i -й та ( i + 1 ) -th). Якщо це так, перевірте, чи можна його поширити на F ( 3 ) , потім F ( 4 ) тощо. Після цього почніть знову з положення i + 1 . Повторюйте, поки не досягнете позиції n .iSF(2)i(i+1)F(3)F(4)i+1n

Ми повинні принаймні раз поглянути на кожен символ, так що це . Існує лише дві петлі, тому ми можемо сказати, що цеΩ(n)O(n2)

i

Як я можу використовувати властивості Фібоначчі для пошуку більш чітких меж часу виконання цього алгоритму?

Відповіді:


5

F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2p+3ℓ(n)F(ℓ)ℓn≥4ℓ(n)=|F(n−1)|ℓ(4)=3

NnP(n)F(n)∑n|P(n)||F(n)|n|F(n−1)|≤NF(n)|F(n−1)|

∑n|F(n)|(N|F(n−1)|+1).
∑n|F(n)|=O(N)∑nO(N)=O(Nlog⁡N)log⁡NO(Nlog⁡N).

FnΩ(|Fn|log⁡|Fn|)NΘ(Nlog⁡N)

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