2010-07-07 6 views
3

TRIE est la structure de données la plus recommandée lors de la conception de quelque chose comme un dictionnaire pour stocker des mots? Toutes les autres alternatives qui améliorent la performance de temps ou de mémoire? Je pense qu'un hachage peut être bon s'il n'y a pas de collision, mais les exigences de mémoire commencent à être mauvaises pour les mots qui se chevauchent: over, overlap, overlaps, overlapped, overlapping occupent tous un espace de stockage exclusif.structure de données recommandée lors de la conception de quelque chose comme un dictionnaire?

EDIT: Merci @Moron et à vous tous pour les réponses très utiles. Je suis d'accord - la génération de la clé de hachage est O (n) et il en est de même pour la recherche TRIE. Cependant, pour les choses de hachage peut être pire avec enchaînement ajoutant à l'heure tandis que pour TRIE cela ne se produira pas. Mon souci reste que pour chaque noeud dans un TRIE je dois garder un pointeur qui peut être des choses de soufflage si la taille du dictionnaire est petite.

+2

Comment est le hachage O (log n)? –

+0

@Moron Au lieu d'utiliser la liste chaînée pour le chaînage, démarrez un arbre BST ou AVL à la position du nœud racine. Pour les données randomisées, la BST typique devrait être O (log n) même si nous n'optons pas pour AVL. – Fanatic23

+1

Utilisez ce que vous voulez à la place de la liste liée, en calculant la valeur de la clé de hachage est toujours O (n). O (logn) n'a aucun sens. C'est O (n + nlog K) où K est le nombre de clés avec le même hachage. n pour calculer le hachage, nlogK pour la chaîne logK compare (dans l'arbre de K nœuds) de longueur n chacun (pourrait être moindre si les chaînes plus petites ont la même valeur, mais le cas le plus défavorable est n). –

Répondre

2

Vous pouvez considérer Directed Acyclic Word graph qui est essentiellement une structure arborescente, mais a une meilleure utilisation de la mémoire, et selon le wiki, pour l'anglais, la consommation de mémoire est beaucoup plus faible qu'une structure arborescente.

Dans le temps, c'est comme un trie et c'est probablement mieux que le hachage.Vous ne savez pas où vous avez obtenu l'heure O (logn) pour le hachage. Il devrait être O (n) pour des hachages raisonnables, où n est la longueur du mot recherché.

+0

Vous voulez dire O (1) pour des hashes raisonnables? –

+1

@Justin: Non, je veux dire O (n), où n = longueur du mot à rechercher. n n'est pas la taille du dictionnaire. –

+0

@Moron: le hachage de la clé et la recherche dans la table de hachage à l'aide du hachage résultant sont considérés comme deux opérations distinctes (puisque la recherche ne peut pas réellement démarrer tant que le hachage est disponible), la recherche de hachage est considérée comme O (1) (pour les hashs raisonnables). – TMN

5

A Trie présente les avantages suivants sur une table de hachage:

  1. recherche de données dans une structure arborescente est plus rapide dans le pire des cas, O(m) temps, par rapport à une table de hachage imparfaite. Une table de hachage imparfaite peut avoir des collisions de clé. Une collision de clé est le mappage de fonction de hachage de différentes clés à la même position dans une table de hachage. La vitesse de recherche dans le cas le plus défavorable dans une table de hachage imparfaite est O(N) temps, mais beaucoup plus généralement est O(1), avec O(m) temps passé à évaluer le hachage.
  2. Il n'y a aucune collision de différentes clés dans un trie.
  3. Les compartiments d'une série qui sont analogues aux compartiments de table de hachage qui stockent des collisions de clés ne sont nécessaires que si une seule touche est associée à plusieurs valeurs.
  4. Il n'est pas nécessaire de fournir une fonction de hachage ou de modifier les fonctions de hachage car plus de clés sont ajoutées à un trie.
  5. Un trie peut fournir un ordre alphabétique des entrées par clé.

Tries présentent les inconvénients suivants:

  1. Tries peuvent être plus lents dans certains cas que les tables de hachage pour rechercher des données, en particulier si les données sont directement accessibles sur un disque dur ou un autre stockage secondaire dispositif où le temps d'accès aléatoire est élevé par rapport à la mémoire principale.
  2. Il n'est pas facile de représenter toutes les clés comme des chaînes, comme les nombres à virgule flottante. Un codage simple utilisant la chaîne binaire de leur codage conduit à des chaînes longues et des préfixes peu significatifs.

Si les inconvénients sont quelque chose que vous pouvez vivre avec, je suggère d'aller avec le trie.

Source: Wikipedia: Trie#As a replacement of other data structures

+0

+1. Je ne pense pas que l'inconvénient # 2 s'applique bien, l'OP mentionne clairement qu'il en a besoin pour stocker des mots comme dans un dictionnaire. – MAK

+0

Je classerais une table de hachage avec un temps de recherche dans le pire des cas de O (N) comme "pathologique" et non "imparfait"! Même si chaque entrée est hachée dans le même compartiment, vous devez normalement trier la chaîne de débordement et effectuer une recherche binaire sur celle-ci. – TMN

+0

@MAK c'est vrai # 2 ne s'applique pas à son cas. –

Questions connexes