Complejidad de un algoritmo ingenuo para encontrar la subcadena de Fibonacci más larga

10

Dados dos símbolos y , definamos la -ésima cadena de Fibonacci de la siguiente manera:b kabk

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

con denotando concatenación de cadenas.

Así tendremos:

  • 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 una cadena formada por n símbolos, definimos una subcadena de Fibonacci como cualquier subcadena de S que también es una cadena de Fibonacci para una elección adecuada de a y b .SnSab

El problema

Dado , queremos encontrar su subcadena de Fibonacci más larga.S

Un algoritmo trivial

Para cada posición de la cadena S , suponga que F ( 2 ) comienza allí (es suficiente para verificar que los símbolos i -th e ( i + 1 ) -th son distintos). Si ese es el caso, verifique si se puede extender a F ( 3 ) , luego a F ( 4 ) , y así sucesivamente. Después de eso, comience nuevamente desde la posición i + 1 . Repita hasta llegar a la posición n .iSF(2)i(i+1)F(3)F(4)i+1n

Debemos mirar cada símbolo al menos una vez, por lo que es . Solo hay dos para los bucles involucrados, por lo que además podemos decir que es O ( n 2 ) .Ω(n)O(n2)

Sin embargo (como era de esperar), este ingenuo algoritmo funciona mucho mejor que los algoritmos cuadráticos habituales (si hace mucho trabajo en la posición -ésima, no hará mucho trabajo en las siguientes posiciones).i

¿Cómo puedo usar las propiedades de Fibonacci para encontrar límites más ajustados para el tiempo de ejecución de este algoritmo?

wil93
fuente

Respuestas:

5

Digamos que ocurre en alguna posición si la subcadena que comienza en esa posición es compatible con F ( n ) o su complementación. ¿Qué tan cerca pueden estar las ocurrencias de F ( n ) ? Tome como ejemplo F ( 4 ) = a b a a b . Si F ( 4 ) ocurre en la posición p, entonces no puede ocurrir en la posición p + 1 o p + 2F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2, pero puede aparecer en la posición . Dejamos que ( n ) sea ​​el número más pequeño, de modo que dos ocurrencias de F ( ) pueden ocurrir a una distancia de . Puede probar por inducción que para n 4 tenemos ( n ) = | F ( n - 1 ) | (por ejemplo, ( 4 ) = 3 ).p+3(n)F()n4(n)=|F(n1)|(4)=3

Dada una cadena de longitud , para cada n sea P ( n ) el conjunto de posiciones en las que se produce F ( n ) . Podemos limitar el tiempo de ejecución de su procedimiento aproximadamente por n | P ( n ) | El | F ( n ) | , donde la suma se ejecuta sobre todos n tal que | F ( n - 1 ) | N (decir). Como ocurrencias de F ( nNnP(n)F(n)n|P(n)||F(n)|n|F(n1)|N están separados por al menos | F ( n - 1 ) | , vemos que el tiempo de ejecución está limitado por el orden de n | F ( n ) | ( NF(n)|F(n1)| Como las longitudes de las palabras de Fibonacci aumentan exponencialmente,n| F(n)| =O(N). El término restante esnO(N)=O(NlogN), ya que la suma contienelogNmuchos términos. Concluimos que el tiempo de ejecución esO(NlogN

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

Por el contrario, el tiempo de ejecución en es Ω ( | F n | log | F n | ) , como puede probarse por inducción. Llegamos a la conclusión de que el peor tiempo de ejecución en cadenas de longitud N es Θ ( N log N ) .FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Yuval Filmus
fuente