Dado dois símbolos e b , vamos definir o k -ésimo seqüência de Fibonacci da seguinte forma:
com denotando concatenação de strings.
Assim, teremos:
- ...
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 .
O problema
Dado , queremos encontrar o substring Fibonacci mais longo.
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 .
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 ) .
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).
Como posso usar as propriedades de Fibonacci para encontrar limites mais apertados para o tempo de execução desse algoritmo?