Complessità di un algoritmo ingenuo per trovare la sottostringa di Fibonacci più lunga


10

Dati due simboli e B , definiamo il k -esimo stringa Fibonacci come segue:abk

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

con indica la concatenazione di stringhe.

Quindi avremo:

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

Data una stringa formata da n simboli, definiamo una sottostringa di Fibonacci come qualsiasi sottostringa di S che è anche una stringa di Fibonacci per una scelta adatta di a e b .SnSab

Il problema

Dato , vogliamo trovare la sua sottostringa Fibonacci più lunga.S

Un banale algoritmo

Per ogni posizione della stringa S , supponiamo che F ( 2 ) inizi lì (è sufficiente verificare che i simboli i -th e ( i + 1 ) -th siano distinti). In tal caso, controlla se può essere esteso a F ( 3 ) , quindi F ( 4 ) e così via. Successivamente, ricominciare dalla posizione i + 1 . Ripetere fino a raggiungere la posizione n .iSF(2)i(i+1)F(3)F(4)i+1n

Dobbiamo guardare ogni simbolo almeno una volta, quindi è . Ci sono solo due per i loop coinvolti, quindi possiamo anche dire che è O ( n 2 ) .Ω(n)O(n2)

Tuttavia (in qualche modo non sorprende) questo ingenuo algoritmo esegue molto meglio dei soliti algoritmi quadratici (se fa molto lavoro -esima posizione, non farà molto lavoro nelle posizioni successive).i

Come posso usare le proprietà di Fibonacci per trovare limiti più stretti per il tempo di esecuzione di questo algoritmo?

Risposte:


5

Supponiamo che verifichi in qualche posizione se la sottostringa che inizia in quella posizione è compatibile con F ( n ) o con la sua complementazione. Quanto possono essere ravvicinate le occorrenze di F ( n ) ? Prendi come esempio F ( 4 ) = a b a a b . Se F ( 4 ) si verifica nella posizione p, non può verificarsi nella posizione p + 1 o p + 2F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2, ma può apparire nella posizione . Lasciamo che ( n ) sia il numero più piccolo in modo tale che due occorrenze di F ( ) possano verificarsi alla distanza di . Puoi indurre per induzione che per n 4 abbiamo ( n ) = | F ( n - 1 ) | (ad esempio, ( 4 ) = 3 ).p+3(n)F()n4(n)=|F(n1)|(4)=3

Data una stringa di lunghezza , per ogni n sia P ( n ) l'insieme delle posizioni in cui si verifica F ( n ) . Possiamo limitare il tempo di esecuzione della procedura approssimativamente di n | P ( n ) | | F ( n ) | , in cui la somma si estende su tutto n tale che | F ( n - 1 ) | N (diciamo). Poiché occorrenze di F ( nNnP(n)F(n)n|P(n)||F(n)|n|F(n1)|N sono separati da almeno | F ( n - 1 ) | , vediamo che il tempo di esecuzione è limitato dall'ordine di n | F ( n ) | ( NF(n)|F(n1)| Poiché la lunghezza delle parole di Fibonacci aumenta in modo esponenziale,n| F(n)| =O(N). Il termine rimanente ènO(N)=O(NlogN), poiché la somma contiene illogNmolti termini. Concludiamo che il tempo di esecuzione èO(NlogN

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

Al contrario, il tempo di esecuzione su è Ω ( | F n | log | F n | ) , come può essere dimostrato dall'induzione. Concludiamo che il tempo di esecuzione del caso peggiore su stringhe di lunghezza N è Θ ( N log N ) .FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.