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


10

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

F(k)={bif k=0aif k=1F(k1)F(k2)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()n4(n)=|F(n1)|(4)=3

NnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)|

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN)logNO(NlogN).

FnΩ(|Fn|log|Fn|)NΘ(NlogN)

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