web-dev-qa-db-fra.com

Arbre suffixe et essais. Quelle est la différence?

Je lis à propos de Tries communément appelé arbres de préfixe et Suffix Trees.
Bien que j'ai trouvé le code pour une Trie je ne peux pas trouver un exemple pour un Suffix Tree. J'ai aussi l'impression que le code qui construit une Trie est le même que celui d'un Suffix Tree avec la seule différence que dans le premier cas, nous stockons des préfixes mais dans le second des suffixes.
Est-ce vrai? Quelqu'un peut-il m'aider à effacer cela dans ma tête? Un exemple de code serait d'une grande aide!

55
Cratylus

Une arborescence de suffixes peut être vue comme une structure de données construite au-dessus d'un tri. Au lieu de simplement ajouter la chaîne elle-même au trie, vous ajoutez également tous les suffixes possibles de cette chaîne. Par exemple, si vous souhaitez indexer la chaîne banana dans une arborescence de suffixes, vous devez créer un tri avec les chaînes suivantes:

banana
anana
nana
ana
na
a

Une fois que cela est fait, vous pouvez rechercher n'importe quel n-gram et voir s'il est présent dans votre chaîne indexée. En d'autres termes, la recherche n-gramme est une recherche par préfixe de tous les suffixes possibles de votre chaîne.

C'est le moyen le plus simple et le plus lent de créer un arbre de suffixes. Il s'avère que de nombreuses variantes plus sophistiquées de cette structure de données améliorent l’espace et le temps de construction, ou les deux. Je ne suis pas assez au courant dans ce domaine pour donner un aperçu, mais vous pouvez commencer par regarder dans les tableaux de suffixes ou cette classe les structures de données avancées (cours 16 et 18).

Cette réponse fait également un travail remarquable en expliquant une variante de cette structure de données.

44
Ze Blob

Si vous imaginez un Trie dans lequel vous mettez des suffixes de Word, vous pourrez l'interroger très facilement pour connaître les sous-chaînes de la chaîne. C’est l’idée principale derrière l’arbre de suffixe, c’est fondamentalement un "suffixe trie".

Mais en utilisant cette approche naïve, la construction de cet arbre pour une chaîne de taille n serait O (n ^ 2) et nécessiterait beaucoup de mémoire.

Comme toutes les entrées de cette arborescence sont des suffixes de la même chaîne, elles partagent beaucoup d'informations. Il existe donc des algorithmes optimisés vous permettant de les créer plus efficacement. L'algorithme d'Ukkonen, par exemple, vous permet de créer une arborescence de suffixes en ligne avec une complexité temporelle O(n).

5
Juan Lopes

La différence est très simple. Un arbre de suffixe a moins de nœuds "factices" que le suffixe trie. Ces nœuds factices sont des caractères uniques qui augmentent l'opération de recherche dans l'arborescence.

0
curious