Complexidade de um algoritmo ingênuo para encontrar o substring de Fibonacci mais longo

10

Dado dois símbolos e b , vamos definir o k -ésimo seqüência de Fibonacci da seguinte forma:abk

F(k)={bif k=0aif k=1F(k1)F(k2)else

com denotando concatenação de strings.

Assim, teremos:

  • 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
  • ...

Dada uma sequência formada por n símbolos, definimos uma substring de Fibonacci como qualquer substring de S, que também é uma sequência de Fibonacci para uma escolha adequada de a e b .SnSab

O problema

Dado , queremos encontrar o substring Fibonacci mais longo.S

Um algoritmo trivial

Para cada posição da string S , suponha que F ( 2 ) comece aí (basta verificar se os símbolos i -ésimo e ( i + 1 ) -ésimo são distintos). Se for esse o caso, verifique se pode ser estendido para F ( 3 ) , depois F ( 4 ) e assim por diante. Depois disso, comece novamente a partir da posição i + 1 . Repita até chegar à posição n .iSF(2)i(i+1)F(3)F(4)i+1n

Devemos olhar para cada símbolo pelo menos uma vez, então é . Existem apenas dois para loops envolvidos, então podemos dizer que é O ( n 2 ) .Ω(n)O(n2)

No entanto (de maneira não surpreendente), esse algoritmo ingênuo tem desempenho quadrático muito melhor que o usual (se fizer muito trabalho na ésima posição, não fará muito trabalho nas próximas posições).i

Como posso usar as propriedades de Fibonacci para encontrar limites mais apertados para o tempo de execução desse algoritmo?

wil93
fonte

Respostas:

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)

Yuval Filmus
fonte