]Voilà: je conçois actuellement un set pour internaliser des chaînes. Mais mes questions pourraient s'appliquer à toute table de hachage, utilisée en tant que set ou table associative, et quel que soit le type d'élément ou de clé.
1°) Cela vaut-il le coup de stocker les valeurs de hachage pour éviter de les recalculer lorsqu'on doit replacer les noeuds (après chaque agrandissement de la table, donc) ? J'imagine que ça dépend du coût du hachage, donc du type d'élément ou clé, et que pour des strings ça peut valoir le coup. Mais qu'en pensez-vous ?
J'en profite pour explorer la conception de tables ordonnées qui (contrairement aux tables de hachage ordinaires) conservent l'ordre d'insertion des éléments ou paires. Je fais ça d'une façon toute bête: les nouveaux noeuds sont placés dans un tableau dynamique avant d'être liés dans les listes (buckets, qui assurent l'accès direct par clé via le hachage). (*)
2°) Du coup, seconde question: est-ce que je dois placer dans le tableau (d'ordre d'iinsertion) les noeuds eux-mêmes, où des pointeurs vers ces noeuds ? Dans le premier cas, je gagne:
* en espace, un pointeur par noeud,
* en temps, une "colocalisation" des noeuds qui augmente les chances d'usage du cache.
Dans le second cas, je gagne:
* en temps, lors de l'agrandissement de la table, pas de copie des noeuds mais seulement de pointeurs, et pas de libération desdits noeuds.
Le poids des noeuds est:
1- 1 pointeur de liste,
2- un élément ou clé (typiquement taille de mot, vu que c'est souvent un pointeur, un premier caractère de chaîne, ou un entier),
3- éventuellement une donnée associée à une clé, si c'est une table associative (ditto),
4- éventuellement la mémorisation de la valeur de hachage (32 ou 64 bits).
A vous de réfléchir ;-)
(*) Les tables associatives de Ruby sont aussi ordonnées depuis qq années. Mais ils font ça en liant les noeuds en // à une seconde liste, en l'occurrence une liste d'ordre d'insertion. Les noeuds ont donc deux paires de pointeurs (car en plus ils utilisent des listes doubles dans les deux cas; je comprends pas pourquoi, d'ailleurs, si qq'un peut m'expliquer...).
Partager