Comment la durée d'exécution de l'algorithme d'Ukkonen dépend-elle de la taille de l'alphabet?


19

Je m'intéresse à la question du temps d'exécution asymptotique de l'algorithme d'Ukkonen , peut-être l'algorithme le plus populaire pour construire des arbres de suffixes en temps linéaire (?).

Voici une citation du livre "Algorithmes sur les chaînes, les arbres et les séquences" de Dan Gusfield (section 6.5.1):

"... les algorithmes Aho-Corasick, Weiner, Ukkonen et McCreight nécessitent tous deux un espace de , ou la limite de temps doit être remplacée par le minimum de et ".Θ(m|Σ|)O(m)O(mJournalm)O(mJournal|Σ|)

[ est la longueur de la chaîne et est la taille de l'alphabet]mΣ

Je ne comprends pas pourquoi c'est vrai.

  • Espace: eh bien, dans le cas où nous représentons des branches hors des nœuds en utilisant des tableaux de taille , alors, en fait, nous nous retrouvons avec l' utilisation de l'espace . Cependant, pour autant que je puisse voir, il est également possible de stocker les branches à l'aide de tables de hachage (par exemple, des dictionnaires en Python). Nous n'aurions alors que des pointeurs stockés dans toutes les tables de hachage (car il y a des bords dans l'arborescence), tout en étant en mesure d'accéder aux nœuds enfants en temps , aussi rapidement comme lors de l'utilisation de tableaux.Θ(|Σ|)Θ(m|Σ|)Θ(m)Θ(m)O(1)
  • Temps : comme mentionné ci-dessus, l'utilisation de tables de hachage nous permet d'accéder aux branches sortantes de n'importe quel nœud en temps . Étant donné que l'algorithme d'Ukkonen nécessite des opérations (y compris l'accès aux nœuds enfants), le temps d'exécution global serait alors également .O(1)O(m)O(m)

Je vous serais très reconnaissant de savoir pourquoi je me trompe dans mes conclusions et pourquoi Gusfield a raison sur la dépendance de l'algorithme d'Ukkonen vis-à-vis de l'alphabet.


3
Je ne pense pas qu'il y ait de preuve selon laquelle une limite temporelle / spatiale indépendante de la taille de l'alphabet est impossible. Je crois que Gusfield a fait cette déclaration parce qu'il n'y a pas de méthode connue pour se débarrasser complètement du temps limité. Pour en établir une, vous devez développer plus en détail vos fonctions de hachage. Un vrai pire cas O (1) lié à la recherche de hachage nécessite un hachage parfait. Je ne sais pas comment faire cela pendant l'algorithme (car les entrées de hachage ne sont pas statiques à ce stade).
jogojapan

(suite) Vous pouvez le faire une fois l'arborescence terminée, mais la limite de temps pour l'algorithme lui-même reste inchangée. (+1 pour la question cependant.)
jogojapan

Réponses:


2

Comme @jogojapan le mentionne dans les commentaires, le hachage n'est généralement amorti que , donc vous n'obtiendrez que des limites amorties pour l'algorithme. Cependant, je pense que vous ne les obtenez même pas: pour obtenir un hachage O ( 1 ) amorti , les tables de hachage doivent être de taille Ω ( Σ ) , vous avez donc encore un espace Θ ( m Σ ) (et en même temps condition d'initialisation).O(1)O(1)Ω(Σ)Θ(mΣ)

De plus, en pratique, le temps de configuration de toutes ces tables de hachage sera beaucoup plus long que le temps de configuration des tableaux.

Vous pourriez vous en sortir mieux avec une table de hachage globale indexée avec des paires (nœud, caractère), mais au moins l'argument "uniquement amorti" restera.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.