Leçon
La théorie — Trie : l’arbre préfixe, pas à pas
Un trie, ou arbre préfixe, représente un ensemble de mots par un arbre dont chaque nœud correspond à un préfixe distinct. La racine représente le préfixe vide. Chaque arête porte une lettre : les lettres du chemin allant de la racine à un nœud forment le préfixe de ce nœud. Celui-ci est marqué lorsque son préfixe constitue un mot stocké. Les mots qui ont un début commun partagent ainsi une partie du chemin. Une recherche suit les lettres du mot à partir de la racine ; une recherche par préfixe rejoint le nœud du préfixe, puis recense les nœuds marqués de son sous-arbre. Edward Fredkin a nommé cette structure en 1960, à partir du mot anglais retrieval. Il souhaitait que trie se prononce comme l’anglais tree.
Ce que signifie chaque symbole
W- le nombre de mots dans la liste
L- le nombre total de lettres de ces mots
N- le nombre de nœuds, un par préfixe distinct, sans compter la racine
- Suppose
- Lettres minuscules de a à z, un octet par lettre, pointeurs de 64 bits. Aucune des deux structures ne comporte d’octets d’alignement ni de surcoût lié à l’allocateur de mémoire. Pour la recherche dichotomique, chaque paire de lettres comparées est comptée ; la comparaison s’arrête à la première différence. Atteindre la fin d’un mot ne coûte rien. La table de hachage est supposée n’avoir aucune collision : c’est son cas le plus favorable. Avec les nœuds de 18 octets, les fils sont rangés dans l’ordre alphabétique. Leur parcours s’arrête donc dès qu’il dépasse la lettre recherchée.
Problème entièrement résolu
-
Combien de lettres faudrait-il partager pour que le trie occupe moins de place ? 4 étapes
Cliquez sur Mots longs : 85 lettres tiennent dans 21 nœuds, les trois quarts sont partagées, et le trie à nœuds de 18 octets occupe encore 396 octets, contre 157 pour la liste. Parmi les listes dont tous les mots ont k lettres, celle qui contient tous les mots possibles est la plus favorable au trie. Avec les coûts en octets retenus ici, quelle est la plus petite valeur de k pour laquelle ce trie occupe moins de place que la simple liste ?
Ouvrez ce problème dans l'outil
-
Dans l’exemple : 21 nœuds et la racine, soit 22 × 18 = 396 octets. La liste stocke 85 lettres et, pour chacun de ses 8 mots, un octet de fin et un pointeur de 8 octets : 85 + 9 × 8 = 157.
-
L’ensemble des chaînes de k lettres compte 26k mots de k lettres chacun. La liste occupe donc (k + 9) × 26k octets.
-
Le trie a besoin d’un nœud pour chaque chaîne de 1 à k lettres : 26 + 26² + … + 26k, soit un peu moins de 26/25 × 26k. En ajoutant la racine et en multipliant par 18, on obtient un coût légèrement inférieur à 18,72 × 26k octets.
-
La liste occupe donc plus de place dès que k + 9 dépasse 18,72, ce qui se produit pour la première fois à k = 10. À k = 9, le trie occupe 4,0 % de plus que la liste ; à k = 10, il occupe 1,5 % de moins.
Réponse
Dix lettres, à condition que la liste contienne les 2610 mots possibles, soit environ 1,4 × 1014 mots. Avec des nœuds de 209 octets, le même calcul exige que k + 9 dépasse environ 217 : il faut des mots de 209 lettres.
-
Parcours
Ce qu’une structure de données rend peu coûteux
Références (3)
- The name, its origin in "retrieval", and Fredkin's intended pronunciation, quoted in the definition: Paul E. Black, "trie", in Dictionary of Algorithms and Data Structures [online], Paul E. Black, ed., NIST, entry modified 12 February 2019.
- The paper that named the structure: Edward Fredkin, "Trie memory," Communications of the ACM 3(9), September 1960, pp. 490–499.
- The earlier description of searching on letter-by-letter keys: René de la Briandais, "File searching using variable length keys," Papers presented at the Western Joint Computer Conference, San Francisco, 3–5 March 1959, pp. 295–298.