Komplexität eines naiven Algorithmus zum Finden des längsten Fibonacci-Teilstrings

10

Wenn zwei Symbole und sind, definieren wir die te Fibonacci-Zeichenfolge wie folgt:b kabk

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

mit bezeichnet die Verkettung von Zeichenfolgen.

So haben wir:

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

Bei einer durch Symbole gebildeten Zeichenfolge definieren wir eine Fibonacci-Teilzeichenfolge als eine beliebige Teilzeichenfolge von die auch eine Fibonacci-Zeichenfolge für eine geeignete Auswahl von und .nSna bSab

Das Problem

Mit wollen wir den längsten Fibonacci-Teilstring finden.S

Ein trivialer Algorithmus

Angenommen, für jede Position der Zeichenfolge beginnt dort (es reicht aus, um zu überprüfen, ob das te und das -te Symbol unterschiedlich sind). Wenn dies der Fall ist, prüfen Sie, ob es auf , dann auf usw. erweitert werden kann. Beginnen Sie danach erneut an der Position . Wiederholen, bis Sie die Position .S F ( 2 ) i ( i + 1 ) F ( 3 ) F ( 4 ) i + 1 niSF(2)i(i+1)F(3)F(4)i+1n

Wir müssen jedes Symbol mindestens einmal betrachten, also ist es . Es sind nur zwei for-Schleifen beteiligt, daher können wir weiterhin sagen, dass es .O ( n 2 )Ω(n)O(n2)

(Etwas wenig überraschend) ist dieser naive Algorithmus jedoch viel besser als übliche quadratische Algorithmen (wenn er viel an der ten Position arbeitet, wird er an den nächsten Positionen nicht viel arbeiten).i

Wie kann ich Fibonacci-Eigenschaften verwenden, um engere Grenzen für die Ausführungszeit dieses Algorithmus zu finden?

wil93
quelle

Antworten:

5

Angenommen, tritt an einer Position auf, wenn der an dieser Position beginnende Teilstring entweder mit oder seiner Komplementation kompatibel ist . Wie nahe kann das Auftreten von sein? Nehmen Sie als Beispiel . Wenn an Position auftritt , kann es nicht an Position oder , aber es kann an Position . Wir lassen die kleinste Zahl sein, so dass zwei Vorkommen von in einem Abstand von . Sie können durch Induktion beweisen, dass wir für habenF ( n ) F ( n ) F ( 4 ) = aF(n) F(n)F(n)F ( 4 ) , p p + 1 p + 2 p + 3 l ( n ) F ( l ) l n 4 l ( n ) = | F ( n - 1 ) |F(4)=abaabF(4)pp+1p+2p+3(n)F()n4(n)=|F(n1)|(zum Beispiel ).(4)=3

Bei einer gegebenen Folge der Länge sei für jedes die Menge von Positionen, an denen auftritt. Wir können die Laufzeit Ihrer Prozedur grob durch begrenzen , wobei die Summe über alle läuft, so dass (sagen wir). Da Vorkommen von durch mindestenssehen wir, dass die Laufzeit in der Größenordnung von n | begrenzt ist F ( n ) | ( N.n P ( n ) F ( n ) n | P ( n ) | | F ( n ) | n | F ( n - 1 ) | N F ( n )NnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)| Da die Längen der Fibonacci-Wörter exponentiell zunehmen, istn| F(n)| =O(N). Der verbleibende Term istnO(N)=O(NlogN), da die Summelogenthält

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN) viele Terme enthält. Wir schließen daraus, dass die Laufzeit O ist ( N log N.logN .O(NlogN)

Umgekehrt kann die Laufzeit auf ist Ω ( | F n | log | F n | ) , wie sie durch Induktion nachgewiesen werden. Wir schließen daraus , dass der schlimmste Fall Zeit auf Strings der Länge läuft N ist Θ ( N log N ) .FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Yuval Filmus
quelle