hash - Algo - Programmation
Marsh Posté le 19-09-2003 à 10:40:10
Tout dépend de la taille de la table... Si tu as un tableau de 100 et que tu dois y mettres 10 données, les collisions seront plutôt rares..
à l'inverse, 1000 infos dans un tableau de 100 généreront beaucoup de collisions.
Voici quelques trucs que j'avais noté à ce sujet :
HACAHGE OUVERT (avec file)
==============
Type de hachage ouvert, cas d'école (données RAM et pas sur HD
|0 ---> Nicolas ---> Marc
|1
|2 ---> Igor
Les collisions sont simplement enfilées à la suite les une des autres.
HACHAGE OUVERT
==============
Dans la pratique, on utilise des index de taille au minimum 20% plus grande
que le taille des enregistrement, pour empêcher les collisions. il n'y a alors
plus de files. lorsque qu'une case est prise, on la place dans la suivante,
jusqu'à qu'on trouve un "blanc" (voilà pourquoi les 20% supplémentaire)
HACHAGE FERME (avec réserve)
============================
le tableau contient l'information, + un pointeur (mémoire ou physique)
En cas de collision (Fanfan --> Lea) on mets Fanfan dans la réserve et on pointe
Jean vers cet endroit de la réserve. En cas de double collision (Lea) on continue
de pointer
=============
|0 Jean(0) | xx
| |
|2 Zoe(2) | NULL
| |
|¬¬¬¬¬¬¬¬¬¬¬¬¬¬|
|xx Fanfan(0) | xy
|xy Lea(0) | NULL
|xz |
Marsh Posté le 19-09-2003 à 10:41:46
tout dépend surtout de si tu veux avoir la possibilité de faire des suppressions
Marsh Posté le 19-09-2003 à 10:44:54
C'est clair qu'avec les files les suppressions deviennent lourdes à gérer. quoique
Marsh Posté le 19-09-2003 à 10:48:33
JagStang a écrit : C'est clair qu'avec les files les suppressions deviennent lourdes à gérer. quoique |
euh par rapport un truc sans file, je dis non
Marsh Posté le 19-09-2003 à 10:58:02
os2 a écrit : salut |
hachage ouvert, avec une taille étant un nombre premier suffisament grand pour le nombre d'éléments à stoquer, avec une fonction de hachage qui a une bonne répartition pour le type d'éléments stoqués
Marsh Posté le 19-09-2003 à 11:48:12
Taz a écrit : euh par rapport un truc sans file, je dis non |
Oui c'est vrai. Les files c'est pas plus mal pour les suppressions tout compte fait
Marsh Posté le 26-09-2003 à 04:59:08
SchnapsMann a écrit : |
tu as un algo de cette technique?
Marsh Posté le 13-02-2004 à 02:37:04
Hello @ tous,
J'ai un tableau qui doit gérer 1000 clients (Nom,Prénom:STRING(30 char. max))
est-il possible de faire une table hash sans collision ?
si oui, connaissez-vous la formule coresspondante ?
svp, Merci
Marsh Posté le 13-02-2004 à 03:02:38
os2 a écrit : tu as un algo de cette technique? |
Knuth, "The art of computer programming" tu as dedans les critères pour choisir la taille du tableau et comment calculer cette taille.
Marsh Posté le 13-02-2004 à 14:43:52
K-Surf a écrit : |
Marsh Posté le 13-02-2004 à 14:49:30
pour toute serie de données connues à l'avance, il existe une fonction de hachage parfaite, c'est un théorème.
Marsh Posté le 13-02-2004 à 14:54:05
nraynaud a écrit : pour toute serie de données connues à l'avance, il existe une fonction de hachage parfaite, c'est un théorème. |
huh
théorème de qui ? de quoi ?
Désolé, je suis un newb'
Marsh Posté le 13-02-2004 à 14:56:18
K-Surf a écrit : |
qui dit que la réponse est oui. Par contre, j'ai pas l'algo sous la main.
De qui, j'ai ai aucune idée. Il est aussi dans le Knuth.
Marsh Posté le 20-02-2004 à 02:46:27
nraynaud a écrit : qui dit que la réponse est oui. Par contre, j'ai pas l'algo sous la main. |
tu penses que tu arrivais à le retrouver svp ?
pour les autres, on s'est jamais....
Marsh Posté le 20-02-2004 à 12:36:28
K-Surf a écrit : tu penses que tu arrivais à le retrouver svp ? |
non
1) je suis dans le trou-du-cul de l'Allemagne
2) j'ai pas de bibliothèque sous la main
Marsh Posté le 18-07-2004 à 03:42:44
je passais dans la section comme ça:
enfaite chuis aller jeter un coup d'oeil dans le Knuth, la section HASH se trouve dans le 2ème volume, si je me rappelle bien,
bref j'ai rien capter à ce livre pour matheux anglophone, y'a de ces formules de ouf
Marsh Posté le 20-07-2004 à 12:20:27
beaucoup de choses tres interessantes sur le sujet sur le site de Bob Jenkins:
http://burtleburtle.net/bob/
(mais le site à l'air out en ce moment)
Marsh Posté le 20-07-2004 à 15:26:11
K-Surf a écrit :
|
C'est simple, pour cela tu associes un integer i pour le client i...un integer i+1 pour le client i+1. Tu alloues un tableau de taille 1000. L'integer associe au client correspond a la case du tableau.
PS : si tu veux etre SUR de ne pas avoir de collision dans une table de hash, il te faut au MINIMUM un tableau de taille egal au nombre de donnees que tu veux y mettre...cela va de soi
Marsh Posté le 20-07-2004 à 15:42:25
Giz a écrit : C'est simple, pour cela tu associes un integer i pour le client i...un integer i+1 pour le client i+1. Tu alloues un tableau de taille 1000. L'integer associe au client correspond a la case du tableau. |
pas nécessairement. car deux éléments peuvent avoir le même hash...
Marsh Posté le 20-07-2004 à 15:52:16
ça fait longtemps que je ne me suis pas remis sur le programme( donc j'ai pas encore tout ma tête, excusez-moi si je dis des bêtises
)
donc ta solution Griz: serait exemple lors du recherche d'un client dans le tableau que je le recherche par son numéro integer i ?
paske l'avantage du hash, c'est de pouvoir définir un clé *si possible* unique qui coressponderait à une case(index) du tableau(bon bien sur en ayant une taille de tableau assez "modéré"...) donc si je veux faire une recherche par nom sans vouloir parcourir tous le tableau je fais comment avec l'histoire du integer i ???
Marsh Posté le 20-07-2004 à 15:59:45
unique non. la plus unique possible oui. relis ma première intervention
Marsh Posté le 20-07-2004 à 16:00:12
K-Surf a écrit : ça fait longtemps que je ne me suis pas remis sur le programme( |
c tout con, la personne est stockee a l'indice i du tableau. Indice associe a la personne (en plus de son nom, prenom,etc..)
Marsh Posté le 20-07-2004 à 16:01:34
JagStang a écrit : pas nécessairement. car deux éléments peuvent avoir le même hash... |
ma solution ne fait intervenir AUCUN hashcode hein !!!
Marsh Posté le 20-07-2004 à 16:04:41
JagStang a écrit : unique non. la plus unique possible oui. relis ma première intervention |
selon Knuth ou nraynaud, il parait que oui c'est possible (ça m'étonne aussi, m'enfin les math c'est puissant lol)
Marsh Posté le 20-07-2004 à 16:05:42
Giz a écrit : c tout con, la personne est stockee a l'indice i du tableau. Indice associe a la personne (en plus de son nom, prenom,etc..) |
et pour faire une recherche d'une personne tu fais comment ?
Marsh Posté le 20-07-2004 à 16:06:14
et pourtant, c'est bien le titre du topic... --> HS
Marsh Posté le 20-07-2004 à 16:06:45
K-Surf a écrit : et pour faire une recherche d'une personne tu fais comment ? |
bonne question
Marsh Posté le 20-07-2004 à 16:08:06
K-Surf a écrit : et pour faire une recherche d'une personne tu fais comment ? |
et ben tu as son integer associe. On te donnes le pointeur sur la personne et voila
Marsh Posté le 20-07-2004 à 16:08:26
K-Surf a écrit : selon Knuth ou nraynaud, il parait que oui c'est possible (ça m'étonne aussi, m'enfin les math c'est puissant lol) |
je suis pas d'accord. moi place ces éléments dans un tableau de hash de longueur n (n =10)
"Marc"
"Nicolas"
"Marc"
en tout logique les marc vont se trouver ensemble... (sinon ton algo de hash est inutilisable pour les retrouver) et pourtant tu as encore le triple de l'espace et déjà des collisions
Marsh Posté le 20-07-2004 à 16:09:05
Giz a écrit : et ben tu as son integer associe. On te donnes le pointeur sur la personne et voila |
et... le pointeur associé tu l'obtiens comment ? je crois que tu n'as pas vraiment compris à quoi sert une table de hachage toi
Marsh Posté le 20-07-2004 à 16:09:14
JagStang a écrit : et pourtant, c'est bien le titre du topic... --> HS |
Les tableaux et les tables de hach c tres proche hein
Marsh Posté le 20-07-2004 à 16:12:05
JagStang a écrit : je suis pas d'accord. moi place ces éléments dans un tableau de hash de longueur n (n =10) |
oui c'est sur que si tu tombes 2 fois sur le meme prénom...
m'enfin avec le nom ET le prénom, c'est faisable ??? (bien sur il faut absolument que dans le monde il y'aurait qu'une seul personne ayant le meme nom de famille et le meme prénom)
Marsh Posté le 20-07-2004 à 16:13:35
JagStang a écrit : et... le pointeur associé tu l'obtiens comment ? je crois que tu n'as pas vraiment compris à quoi sert une table de hachage toi |
ben je sais pas, moi j'imagine une structure de donnee (bon jse pas si c exactement pareil en bdd) :
struct personne i
{
int placedsletableau
char *nom
char *prenom
}
fonction personne chercherpersonne (int placedsletableau)
{
retourner tableau[placedsletableau]
}
void main ()
{
personne pers = {0, "Jean", "Dupond"};
chercherpersonne (pers.placedsletableau)
}
un truc comme ca koi...ca me pareil un peu facile, kkchose m'echappe sinon dans ce que tu ve faire exactement
}
Marsh Posté le 20-07-2004 à 16:14:59
Giz a écrit : et ben tu as son integer associe. On te donnes le pointeur sur la personne et voila |
je ne sais pas si tu as saisi l'avantage du hash ou si c'est moi qui capte vraiment pas ce que tu essaie de m'expliquer...
exemple concret: je veux faire une recherche par NOM uniquement, en tappant uniquement le nom comment je peux faire pour retrouver ton integer i sans à avoir parcourir tous le tableau ????
EDIT: GRILLED
Marsh Posté le 20-07-2004 à 16:19:57
K-Surf a écrit : je ne sais pas si tu as saisi l'avantage du hash ou si c'est moi qui capte vraiment pas ce que tu essaie de m'expliquer... |
Ha tres bien, ca s'eclairci pour moi ...donc du coup effectivement, tu es oblige de passer par du hashCode
Suffit d'appliquer une formule magique de hashCode sur les strings...mais evidemment la, tu n'est plus sur de ne pas avoir de collisions
Passer un integer t'aurais garanti l'unicite au lieu de passer par le nom
EDIT : ou alors, tu alloues un TRES TRES grand tableau, et la tu as plus de chances de ne pas avoir de collisions
Marsh Posté le 22-07-2004 à 15:29:20
pospos a écrit : beaucoup de choses tres interessantes sur le sujet sur le site de Bob Jenkins: |
ca yest le lien remarche
je vous conseil vraiment d'aller le voir!
Marsh Posté le 25-07-2004 à 05:49:00
pospos a écrit : ca yest le lien remarche |
Merci beaucoup
http://burtleburtle.net/bob/hash/perfect.html
mais pour te dire la vérité: je capte vraiment Q U E D A L
si qqun aurait la bonté de nous expliqué un tout ptit peu svp
Marsh Posté le 19-09-2003 à 00:17:01
salut
quel est la meilleur méthode pour la gestion des collisions dans un hash table, il me faut la plus performante... (j'utilise des tableau)
merci
---------------
Borland rulez: http://pages.infinit.net/borland