Complexité d'un algorithme naïf pour trouver la plus longue sous-chaîne de Fibonacci

10

Étant donné deux symboles et , nous allons définir les -ème chaîne de Fibonacci comme suit:abk

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

avec dénotant la concaténation de chaînes.

Ainsi nous aurons:

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

Étant donné une chaîne formée de symboles, nous définissons une sous-chaîne de Fibonacci comme toute sous - chaîne de qui est également une chaîne de Fibonacci pour un choix approprié de et .SnSab

Le problème

Étant donné , nous voulons trouver sa plus longue sous-chaîne de Fibonacci.S

Un algorithme trivial

Pour chaque position de la chaîne , supposons que commence là (il suffit de vérifier que les symboles -th et -th sont distincts). Si tel est le cas, vérifiez s'il peut être étendu à , puis à , et ainsi de suite. Après cela, recommencez à partir de la position . Répétez jusqu'à ce que vous atteigniez la position .iSF(2)i(i+1)F(3)F(4)i+1n

Nous devons regarder chaque symbole au moins une fois, c'est donc . Il n'y en a que deux pour les boucles impliquées, nous pouvons donc dire en plus que c'est .Ω(n)O(n2)

Cependant (sans surprise) cet algorithme naïf fonctionne bien mieux que les algorithmes quadratiques habituels (s'il fait beaucoup de travail sur la ème position, il ne fera pas beaucoup de travail dans les positions suivantes).i

Comment puis-je utiliser les propriétés de Fibonacci pour trouver des limites plus strictes pour le temps d'exécution de cet algorithme?

wil93
la source

Réponses:

5

Disons que se produit à une certaine position si la sous-chaîne commençant à cette position est compatible avec ou sa complémentation. Quelle est la proximité des occurrences de ? Prenons comme exemple . Si se produit à la position il ne peut pas se produire à la position ou , mais il peut apparaître à la position . Soit le plus petit nombre tel que deux occurrences de puissent se produire à la distance de . Vous pouvez prouver par induction que pour nous avonsF(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2p+3(n)F()n4(n)=|F(n1)|(par exemple, ).(4)=3

Étant donné une chaîne de longueur , pour chaque soit soit l'ensemble des positions où se produit. Nous pouvons la durée d'exécution de votre procédure à peu près par, où la somme parcourt tout tel que (disons). Puisque les occurrences de sont séparées d'au moins, nous voyons que le temps d'exécution est limité par l'ordre de Puisque les longueurs des mots de Fibonacci augmentent de façon exponentielle, . Le terme restant estNnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)|

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN), puisque la somme contient nombreux termes. Nous concluons que le temps d'exécution est .logNO(NlogN)

Inversement, le temps d'exécution sur est , comme le démontre l'induction. Nous concluons que le pire temps d'exécution sur des chaînes de longueur est .FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Yuval Filmus
la source