80 votes

Où puis-je trouver une implémentation standard de carte basée sur Trie en Java ?

J'ai un programme Java qui stocke un grand nombre de mappings de chaînes de caractères vers divers objets.

Pour l'instant, j'ai le choix entre le hachage (via HashMap) et les recherches binaires (via TreeMap). Je me demande s'il existe une implémentation efficace et standard de la carte à base de trie dans une bibliothèque de collections populaire et de qualité ?

J'ai écrit mes propres textes dans le passé, mais je préfère utiliser quelque chose de standard, si possible.

Clarification rapide : Bien que ma question soit d'ordre général, dans le projet actuel, je traite beaucoup de données qui sont indexées par nom de classe ou signature de méthode entièrement qualifiés. Ainsi, il y a beaucoup de préfixes partagés.

0 votes

Les cordes sont-elles connues à l'avance ? Doit-on y accéder uniquement par chaîne ?

34voto

David Schlosnagle Points 2113

Vous pouvez consulter le La mise en œuvre de Trie à laquelle Limewire contribue au Google Guava.

8 votes

Il semble que Google-Collections ait été remplacé par Guava. code.google.com/p/guava-libraries et malheureusement, je n'y vois pas de classe Trie. Le Trie Patricia semble avoir sa propre page de projet maintenant : code.google.com/p/patricia-trie

1 votes

Les liens Limewire/Google sont un peu en désordre maintenant, aussi. Bien que j'aie réussi à trouver code.google.com/archive/p/google-collections/issues/5 avec les fichiers actuels, notez que Collections Apache Commons est livré avec un certain nombre d'essais (dont une patricia trie). C'est celui que je recommanderais pour le moment.

0 votes

De même, l'implémentation d'Apache Commons semble provenir du même endroit que la contribution de Limewire, car les commentaires sommaires dans les docs Commons pour PatriciaTrie sont identiques aux commentaires sommaires dans l'implémentation de la contribution de Limewire.

10voto

erickson Points 127945

Il n'existe pas de structure de données trie dans les bibliothèques Java de base.

Cela peut s'expliquer par le fait que les essais sont généralement conçus pour stocker des chaînes de caractères, alors que les structures de données Java sont plus générales, et contiennent généralement n'importe quelle Object (définissant l'égalité et une opération de hachage), bien qu'ils soient parfois limités à Comparable des objets (définition d'un ordre). Il n'y a pas d'abstraction commune pour "une séquence de symboles", bien que CharSequence est adapté aux chaînes de caractères, et je suppose que vous pourriez faire quelque chose avec Iterable pour d'autres types de symboles.

Voici un autre point à prendre en compte : lorsque vous essayez d'implémenter un tableau conventionnel en Java, vous êtes rapidement confronté au fait que Java supporte l'Unicode. Pour obtenir une certaine efficacité en termes d'espace, vous devez restreindre les chaînes de votre trie à un sous-ensemble de symboles ou abandonner l'approche conventionnelle consistant à stocker les nœuds enfants dans un tableau indexé par symbole. C'est peut-être une autre raison pour laquelle les tries ne sont pas considérées comme suffisamment polyvalentes pour être incluses dans la bibliothèque de base, et un élément à surveiller si vous implémentez votre propre bibliothèque ou si vous utilisez une bibliothèque tierce.

0 votes

Cette réponse suppose que je veux implémenter un tri pour les chaînes de caractères. Un trie est un général structure de données, capable de contenir des séquences arbitraires et de fournir des recherches rapides de préfixes.

1 votes

@PaulDraper Cette réponse ne présume rien de ce que vous voulez, puisque vous vous êtes présenté des années après que la question ait été posée. Et comme la question porte spécifiquement sur les chaînes de caractères, c'est l'objet de cette réponse. Bien que je passe beaucoup de temps à souligner qu'un tableau Java devrait être généralisé à n'importe quel type de chaîne de caractères. Comparable .

7voto

Alex Beardsley Points 4983

Consultez également arbres concurrents . Ils prennent en charge les arbres Radix et Suffix et sont conçus pour les environnements à forte concurrence.

3 votes

À partir de 2014, cela devrait être la réponse acceptée. Cela ressemble à une implémentation simultanée des essais, bien maintenue et bien testée.

3voto

Melinda Green Points 1033

J'ai écrit et publié une implémentation simple et rapide aquí .

0 votes

J'aimerais aimer ça, mais chacun de vos noeuds nécessite 1024 octets, et ne représente qu'un seul caractère. De plus, l'insertion prend maintenant un temps O(n^2) à cause du changement de sémantique de substring() dans Java. Cette implémentation n'est vraiment pas très pratique.

0 votes

@Stefan Reich, Cet espace de tableau ne concerne que les nœuds internes, ce qui est infiniment petit étant donné la vitesse à laquelle les arbres Trie se déploient.

0 votes

Merci pour votre réponse, mais je ne suis pas convaincu. Les essais ne se ramifient pas toujours rapidement, en fait, ils ne le feront probablement pas avec des données réelles. Vos tableaux sont également lents à rechercher du contenu. Nous devrions vraiment utiliser Patricia Tries pour avoir des choses compactes et efficaces. J'ai fait ma propre implémentation que je vais probablement poster ici sous peu. Sans rancune, j'essaie juste d'optimiser :) Salutations

1voto

Andrew Dashin Points 3147

Ce dont vous avez besoin, c'est org.apache.commons.collections.FastTreeMap Je pense.

0 votes

Cela ne semble pas être une implémentation de trie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X