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(k−1)⋆F(k−2)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(ℓ)ℓn≥4ℓ(n)=|F(n−1)|ℓ(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(n−1)|≤N sono separati da almeno | F ( n - 1 ) | , vediamo che il tempo di esecuzione è limitato dall'ordine di ∑ n | F ( n ) | ( NF(n)|F(n−1)| 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(n−1)|+1).
∑n|F(n)|=O(N)∑nO(N)=O(Nlog⁡N)log⁡N .O(Nlog⁡N)

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Θ(Nlog⁡N)

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.