Fonction de hachage

publicité
Algorithmes et
structures de données
12ème cours
Patrick Reuter
http://www.labri.fr/~preuter
Motivation
• Niklaus Wirth, ETH Zuerich, 1976
« Algorithms + Data Structures = Programs »
Motivation
Structure de donnée:
p.ex. fantôme
- couleur
- position
- direction
- aggressif ou pas ?
Algorithmes:
p.ex. mettre a jour le
meilleur score
Motivation
Structure de donnée:
- tableau a 2 dimension
Algorithmes:
- surtout I.A.
Motivation
Structure de donnée :
Pile
LIFO
(Last In First Out)
Motivation
Structure de donnée :
File
FIFO
(First In First Out)
Aussi: File à priorité
Motivation
8.168.684.336 pages
(le 12/9/2005)
Comment ça marche ?
Motivation
Structure de donnée :
Arbre
(pour l’élimination
des parties cachées)
Motivation
Structure de donnée :
Graphe
(pour plannifier des
trajets)
Structure de données
Définition Wikipedia (12/9/2005)
• une structure logique destinée à contenir des données afin de leur
donner une organisation permettant de simplifier leur traitement.
• Exemple : On peut présenter des numéros de téléphone
*
- par département,
- par nom
- par profession (pages jaunes),
- par numéro téléphonique (annuaires destinés au télémarketing),
- par rue et/ou
- une combinaison quelconque de ces classements.
À chaque usage correspondra une structure d'annuaire
appropriée.
Ingrédients d’algorithmes
•
•
•
•
Affectation
Condition/Comparaison
Appel de fonction
Structure de contrôle
– Branchements conditionnels (multiples)
– Boucles
• Bloc d’instruction
Sondage …
• Recherche linéaire dans un tableau non- triée
– O(n)
• Recherche linéaire dans une liste non- triée
– O(n)
• Recherche dans un tableau trié
– O(log n) (par dichotomie)
• Recherche dans une liste triée
– O(n)
• Comment faire mieux ?
– Table de hachage : Au mieux O(1), au pire O(n)
Recherche d’un élément
• Le mieux pour l’instant
Type tableaux
d’enregistrements
• Exercice
type t_chanson = RECORD
titre
:
string[100];
artiste
:
string[100];
album
:
string[100];
longueur
:
integer;
date
:
t_date;
END;
type t_tableau_chansons = array[1..n] of t_chanson;
var collection : t_tableau_chansons;
• Trouver l’artiste d’une chanson donnée ‘kaya’ (Tableau non-trié)
trouve := FAUX;
i := 1;
tant que (i<=n AND trouve = FAUX)
si collection[i].title = ‘kaya’ alors
afficher collection[i].artiste;
trouve := VRAI;
i := i + 1;
fin tant que
Type tableaux
d’enregistrements
• Exercice
type t_chanson = RECORD
titre
:
string[100];
artiste
:
string[100];
album
:
string[100];
longueur
:
integer;
date
:
t_date;
END;
type t_tableau_chansons = array[1..n] of t_chanson;
var collection : t_tableau_chansons;
• Trouver l’artiste d’une chanson donnée ‘kaya’ (Tableau non-trié)
trouve := FAUX;
i := 1;
tant que (i<=n AND trouve = FAUX)
si collection[i].title = ‘kaya’ alors
afficher collection[i].artiste;
trouve := VRAI;
i := i + 1;
fin tant que
type t_tableau_chansons = array[1..n] of t_chanson;
var collection : t_tableau_chansons;
var inf, sup, milieu : integer;
var trouve : boolean;
inf := 1;
sup := n;
trouve := FAUX;
tant que (sup >=inf ET trouve = FAUX) faire
milieu := (inf + sup) DIV 2;
si (collection[milieu].title = ‘kaya’) alors
trouve := VRAI;
afficher collection[milieu].album;
sinon
si (collection[milieu].title > ‘kaya’) alors
sup := milieu -1;
sinon
inf := milieu + 1;
fin si
fin si
fin tant que
Table de hachage
•
C’est une structure de données qui permet une association clé-élément
•
Une table de hachage est un tableau contenant les enregistrements.
•
Nous la dénoterons par HT.
•
HT possède M cases indexées de 0 à m-1, appelé les adresses A = {0,1, ..,
m-1}
•
On accède à chaque élément de la table via sa clé c  C .
•
Fonction de hachage h
h:C→A
Fonction de hachage
• Injective
• Surjective
• Bijective
Fonction de hachage
• Injective
(chaque élément de l’ensemble d’arrivée et pris une
seule fois comme valeur de fonction) ou alors (il n’y
a pas 2 éléments de l’ensemble de définition qui
donne le même élément de l’ensemble d’arrivée)
• Surjective
(chaque élément est au moins une fois valeur de la
fonction)
• Bijective
Ensemble
de
définition
Ensemble
de
arrivée
•
Fonction de hachage
Fonction de hachage H
h:C→A
(Lire : L’application de la fonction de hachage H à une clé c  C donne une
adresse a є A)
Adressage direct :
ai = h(ci)
– H doit être injective,
– H n'est pas nécessairement surjective.
– Problème : ne marche que pour des ensembles de clés « denses »
– Pour nc clefs possibles,
nc <= m
- Souvent utilisé lorsqu’on fait une recherche par ID (numéro de compte, numéro de
facture, …)
Fonction de hachage
• P.ex. h(c) = 1000 + c
1000+m-1
…
1001
1000
m-1
h
…
1
0
C
A
nc <= m, c-à-d il n’y a pas plus de clés que d’adresses dans la table
Adressage indirect
•
•
marche pour des grands ensembles de clés
La fonction de hachage h n’est pas forcément injective
nc >> m
•
Lorsque la fonction de hachage h n’est pas injective, il peut y avoir une
collision :
2 clés ci et cj sont en collision par rapport a h
ci, cj є C, ci ≠cj ↔ h(ci) = h(cj)
•
ci et cj sont appelées synonymes par rapport à l’adresse a=h(ci) = h(cj)
Fonction de hachage
• Adressage indirect
• P.ex. la clé est un string avec s caractères
• P.ex. h(c) = (ord(c[0]) + ord(c[1]) + .. +
ord(c[s-1])) mod m;
SAM
…
ASM
JOE
m-1
h
…
1
0
C
A
nc >> m, c-à-d il y a beaucoup plus de clés possibles que d’adresses dans la table
Octet - Code ASCII
Fonction de hachage
• Exigences à h: C → A
– Facile et efficace à calculer (en O(1))
– Doit éviter les collisions
– Doit occuper HT d’une manière équilibrée
Résolution des collisions
• Résolution des collisions par adressage
ouvert
– Quand il y a collision, on examine les positions
suivantes et on met la clé dans la 1ère position libre.
• Résolution des collisions par chaînage
externe
– Ce mécanisme de résolution de collisions utilise une
liste (ou un arbre de recherche). Pour chaque
hachage, on stocke dans une liste dédiée tous les
éléments qui correspondent à ce hachage.
Résolution des collisions
•
Résolution des
collisions par adressage
ouvert
Clé
Index
Enregsitrements
–
Quand il y a collision, on
examine les positions
suivantes et on met la clé
dans la 1ère position libre.
1. sondage linéaire
hi(c) = (h(c) + i) mod m
2. Sondage quadratique
hi(c) = (h(c) + a*i + b*i2) mod m
h: C → A
hi(c) = (h(c) + i) mod m;
Résolution des collisions
• Résolution des
collisions par chaînage
externe
– Ce mécanisme de
résolution de collisions
utilise une liste (ou un
arbre de recherche). Pour
chaque hachage, on stocke
dans une liste dédiée tous
les éléments qui
correspondent à ce
hachage.
Résolution des collisions
• Résolution des
collisions par chaînage
externe
– Ce mécanisme de
résolution de collisions
utilise une liste (ou un
arbre de recherche). Pour
chaque hachage, on stocke
dans une liste dédiée tous
les éléments qui
correspondent à ce
hachage.
Résolution des collisions
• Résolution des collisions par chaînage externe
type
p_t_entree = ^t_entree;
t_entree = RECORD
suivant : p_t_entree;
key : string;
telephone : string;
END;
var HT : array[0..m-1] of p_t_entree;
Récapitulatif
Fonction de hachage
Adressage direct
h(c) injective
Adressage indirect
h(c) pas forcément injective
Résolution des collisions
par adressage ouvert
sondage linéaire
hi(c) = (h(c) + i) mod m
Résolution des collisions
par chaînage externe
Sondage quadratique
hi(c) = (h(c) + a*i + b*i2) mod m
Téléchargement