Bonsoir à tous les developpeurs ici présentsi,
SVp, est ce quil ya quelqun qui peut m'aider a developper une fonction qui permet de parcourir les liste chainées de chaque element de la table de hachage.*
merci :)
Version imprimable
Bonsoir à tous les developpeurs ici présentsi,
SVp, est ce quil ya quelqun qui peut m'aider a developper une fonction qui permet de parcourir les liste chainées de chaque element de la table de hachage.*
merci :)
Une fois que tu as trouvé la bonne entrée dans ta table de hachage, tu as donc un pointeur sur une liste chainée. Tu la parcours jusqu'à trouver l'elément, comme tu parcourerais n'importe qu'elle autre liste chainée.
Une table de hashage fonctionne avec une fonction de hashage
table de hashage : tableau de listes chainées
fonction de hashage : permet de choisir dans quelle liste on sotck la donnée ou que établie la recherche
Code:
1
2
3
4
5
6
7 struct table{ unsigned int taille; Liste* table; }; typedef struct table *TableH;
Plutôt que "tableau de listes chaînées", je préfère dire "tableau de conteneurs associatifs", car on peut y mettre autre chose que des listes chaînées.
Y compris des arbres binaires de recherche, ou même d'autres tables de hachage avec une fonction de hachage différente, et qui contiendraient elles-mêmes des tableaux de listes chaînées.
En effet, mais ceci n'était qu'un exemple.
Juste une remarque, on dit en anglais "hash table", en français "table de hachage", mais ..... pas "table de hashage" !
La remarque de Médinoc est fort judicieuse car il existe plein d'implémentations (dont certaines sont réellement très complexe) et la résolution des collisions peut prendre différentes formes.
:salut: à tous les developpeurs,
Comme débutant , jai fait un bon pas dans ce projet, mais la je suis tt à fait bloqué. et j'ai besoin de votre aide.
Là je possede une table de hachage qui contient des element.
chaque element est lié à une liste chainée.
le probleme là c'esi je que j'aime parcourir cette table elemnt par elemnt(2 compteurs) pour faire une jointure de chaque elment de la table.pour stocker l'elemnt joint il faut calculer sa clé de hacha_fonction deja developpé) afin de la stocker dans la table.
merci
jattends vos reponses
et en français ça donne quoi?
en recherchant sur internet tu aurais surement trouvé
Moi, lors d'un projet, sur une table de hashage avec liste simplement chaîné :
Code:
1
2
3
4
5
6
7
8
9 unsigned int hachageString(char *chaine,int max){ unsigned int hash = 0, i = 0; while( i < strlen(chaine) ){ hash = ((hash *26) + chaine[i])% max; ++i; } return hash; }
retourne dans quelle case du tableau effectuer la rechercher
A choisir un code, surtout pas celui la : appel à strlen() à chaque tour de boucle. Le meilleur moyen de tuer les perfs.
De plus , on ne prends pas une fonction de hachage au hasard, mais la plus adaptée à son utilisation.
Enfin le modulo peut être calculé une seule fois à la fin...
Si tu veux une fonction de hachage générique pour les chaines de caractères, tu peux utiliser celle que Kernighan montre dans son bouquin "The practice of programming" (que je te conseilles) :
NHASH étant la taille de la table..Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 enum { MULTIPLIER = 31 }; unsigned int hash(char *str) { unsigned int h; unsigned char *p; h = 0; for (p = (unsigned char *) str; *p != '\0' ; p++) h = MULTIPLIER * h + *p; return h % NHASH; }
Toujours selon Kernighan, le choix de 31 et 37 pour le multiplicateur sont empiriquement les meilleurs choix...
Ouh là...
Par construction, une table de hash à N entrées et la fonction de hash va retourner un nombre entre 0 et N-1...
C'est une surjection et impossible d'empêcher les collisions. Dans ce cas, il y aura plusieurs éléments "associés" à l'entrée correspondante qu'on met en général dans une liste simple ou doublement chainée (si on veut les placer dans "l'ordre" de la clé).
Si on ne peut pas empêcher les collisions, on peut essayer de trouver une fonction de hash qui répartissent de façon plus uniforme les éléments.
Ex: Si la clé est toujours une chaine de 10 caractères, utiliser la longueur de la chaine comme fonction de hash 'fonctionne' mais toutes les éléments seront associés à la meme entrée.
- W
Il n'est possible de garantir l'absence de collisions que dans le cs où l'ensemble des clés possibles est:
- fini
- connu à l'avance
Pour des cas comme ceux-là, il existe des utilitaires qui génèrent un hash parfait.
Dans tous les autres cas, c'est impossible.
Ça manque de const, ce code:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 enum { MULTIPLIER = 31 }; unsigned int hash(char const *str) { unsigned int h; unsigned char const *p; h = 0; for (p = (unsigned char const *) str; *p != '\0' ; p++) h = MULTIPLIER * h + *p; return h % NHASH; }
quel est l'avantage de mettre les const ?
Déjà, c'est plus clair que la fonction ne modifie pas la chaîne.
Et puis, il y a moins de risque qu'elle le fasse quand même à cause d'une erreur de programmation (encore qu'avec les casts C-Style, c'est assez fragile. C'est une des raisons qui me font préférer le C++...)
hum d'accord, donc en faite, si on voit que la chaine ne va pas etre modifié, alors tant qu'à faire la mettre en const