Université Abou Bakr Belkaid Faculté des Sciences Département d’informatique Algorithmique Avancée et Complexité Chap4: Structures de données élémentaires RSD –GL 1 2015-2016
Pile Définition(pile): Une pile est une structure de données mettant en œuvre le principe «dernier entré premier sorti» LIFO:Last In First Out
Pile Une pile P peut être implémentée par un tableau, et elle est caractérisée par: Un sommet noté sommet(P) indiquant l’indice de l’élément le plus récemment inséré dans la pile. Un caractère spécial, comme $, initialisant la pile Une procédure EMPILER(P,x) Une fonction DEPILER(P) Une fonction booléenne PILE-VIDE(P) retournant VRAI si et seulement si P est vide PILE-VIDE(P){ Empiler Dépiler Si sommet(P)=$ Alors retourner VRAI Sommet Sinon retourner FAUX } 10 14 12
Pile Procedure EMPILER(P,x){ Si sommet(P)=longueur(P) Alors écrire (« Pile pleine ») sinon { Sommet(P)=sommet(P)+1 P[sommet(P)]=x } Fonction DEPILER(P) { Si PILE-VIDE(P) Alors écrire (« Pile Vide ») Sommet(P)=sommet(P)-1 Retourner P[sommet(P)+1]
File Définition(file): Une file est une structure de données mettant en œuvre le principe«premier entré premier sorti» FIFO:First In First Out
File Une file F peut être implémentée par un tableau, et elle est caractérisée par: Un pointeur début(F) qui pointe vers la tête de la file(l’élément le plus anciennement inséré) Un pointeur fin(F) qui pointe vers la première place libre, où se fera la prochaine insertion d’un élément Initialement:debut(F)=fin(F)
Listes chaînées Définition:Une liste chaînée : une structure de données représentant une collection ordonnée , de taille arbitraire d'éléments de même type et L'accès aux éléments se fait de manière séquentielle. Permet une grande souplesse pour modifier la liste: Modification de l’ordre d’un élément; Ajout d’un élément ou d’une liste à une position quelconque; Suppression d’un élément ou plusieurs éléments consécutifs dans une liste
Recherche d'un élément complexité =θ(n) Table de Hachage Liste Chainée Recherche d'un élément complexité =θ(n)
Table de Hachage un tableau Utilisation des indices numérotés. Tableau["Luc Doncieux"] c’est pas possible
Table de Hachage Pour Trouver la position d’un élément e dans la table de hachage de n élément: Calcul de la position de e. Accès direct à e Recherche en θ(1) n La place d’un élément dans la table est calculée à partir de sa propre valeur. calcul réalisé par une fonction de hachage
Table de Hachage Pour Trouver la position d’un élément e dans la table de hachage de n élément: Calcul de la position de e. Accès direct à e Recherche en θ(1) n La place d’un élément dans la table est calculée à partir de sa propre valeur. calcul réalisé par une fonction de hachage
Fonction de Hachage Une table de hachage: Utilisation d’une fonction de hachage L’indice d’un élément est donné par la fonction de hachage h . Pour une Table T et un élément e . T[h(e)]=e(si e T)
Fonction de Hachage Exemple: E =Ensemble des éléments à stocker ={ahmed, mourad, ali,selma, mohammed, said, amine, khaled, omar, yacine} T = Table de hachage de taille N=15. H fonction de hachage. = associer à chaque élément e une position h(e)[0..9]
Fonction de Hachage Exemple d’algorithme de fonction h: Attribuer aux lettres a,b,…,z les valeurs de 1,2,…,26 N ( vals des lettres de e +nbre des lettres de e)mod (15) La position de l’élément ahmed est donnée par: h(ahmed)=(31+5)mod 15 =6 De mème: h(mourad)=(72+6)mod(15)=3 h(ali)=(22+3)mod(15)=10; ………..
Fonction de Hachage Ali? h(Ali) Nom Date Naiss Adresse N° Tel 1 2 3 1 2 3 Mourad 4 5 6 Ahmed 7 8 9 10 Ali 11 12 13 14 h(Ali) Nom Date Naiss Adresse N° Tel
Méthodes de hachage une méthode de hachage Transforme la valeur d’un élément en position Doit étre deterministe (pour une valeur donnée on a une et une seule position) Doit étre facilement calculable
Méthodes de hachage Il existe 4 méthode: Méthode par extraction Méthode par Compression Méthode par Division Méthode par Multiplication
Méthodes de hachage par extraction Cette méthode consiste à extraire un certains nombre de bits. Si l'on extrait p bits, l'intervalle se ramène à :[0,2p − 1]. l'extraction des bits 2, 7, 12 et 17 en commençant à gauche et en complétant par des zéros. NAT 011100000110100 1000 8 CARO 00011000011001001111 0001 1 REDA 10010001010010000001 0000 KRIS 01011100100100110011 1010 10
Méthodes de hachage par extraction Facile à mettre en œuvre Utilisation partielle de la clé Ne donne pas de bons résultats. bien adaptée que dans le cas où l'on connaît les données à l'avance ou bien lorsque certains bits de la codification sont non significatifs.
Méthodes de hachage par compression L’utilisation de ET – OU, rendent systématiquement des nombres qui leur sont plus petits (ET) ou plus grand (OU). Pour cette raison—> Utilisation de OU exclusif h(NAT) 01110 xor 00001 xor 10100 11011 27 h(CARO) 00011 xor 00001 xor 10010 xor 01111 11111 31 h(REDA) 10010 xor 00101 xor 00100 xor 00001 10010 18 h(KRIS) 01011 xor 10010 xor 01001 xor 10011 00011 3
Méthodes de hachage par compression Le problème de cette méthode est de "hacher" de la même manière tous les anagrammes d'une clé, par exemple : h(REDA) = 10010 xor 00101 xor 00100 xor 00001 = 10010 = 18 h(READ) = 10010 xor 00101 xor 00001 xor 00100 = 10010 = 18 Solution: Decalage circulaire des bits: Le premier caractère de 1 bit , le deuxième de 2, etc. Ce qui donne : h(REDA) = 01001 xor 01001 xor 10000 xor 00010 = 10010 = 18 h(READ) = 01001 xor 01001 xor 00100 xor 01000 = 01100 = 12
Méthodes de hachage par division Supposons que m = 23 La fonction de division est : NAT = 011100000110100 h(NAT) = 14388 mod 23 = 13 CARO = 00011000011001001111 h(CARO) = 99919 mod 23 = 7 REDA = 10010001010010000001 h(REDA) = 595073 mod 23 = 17 KRIS = 01011100100100110011 h(KRIS) = 379187 mod 23 = 9
Méthodes de hachage par multiplication il faut éviter de prendre des valeurs de θ trop près de 0 ou de 1 h(NAT) ((27 *0.5987526325)mod 1)*27 4 h(CARO) ((31 *0.5987526325)mod 1)*27 15 h(REDA) ((18 *0.5987526325)mod 1)*27 20 h(KRIS) ((3 *0.5987526325)mod 1)*27 21
Taux de remplissage But: Taux de remplissage=nbr positions occupées/nbr total des positions But: Avoir un taux de remplissage proche de 1(toutes les positions de sont remplies). Avoir moins de collision(1 élément par position) .
Limite de la fonction de hachage pas de fonction de hachage universelle une "bonne" fonction doit être rapide a calculer repartir uniformément les éléments dans T But de la fonction h : attribuer 1 élément a chaque position de T pas toujours possible. il peut y avoir des positions de T qui ne sont pas utilisées pb de de gaspillage de mémoire pb de taux de remplissage trop bas il y peut y avoir une place de T qui est attribuée à plusieurs Eléments pb des collisions
Résolution des collision Plusieurs éléments dans la même position!! La qualité de la fonction de hachage collision 2 méthode de résolution: Par chainage Par hachage avec chainage séparé Par hachage coalescent Par calcul Par hachage linéaire Par double hachage
Résolution des collisions Par hachage avec chainage séparé Chainage à l’extérieur de la table de hachage
Résolution des collisions Par Hachage coalescent Le principe est de séparer le tableau de hachage (de taille m) en deux zones : une zone de hachage primaire de p éléments, une zone de réserve de r éléments permettant de gérer les collisions Exemple: m=9, p=6, r=3 éléments X1 X2 X3 X4 X5 X6 X7 X8 Valeurs hachage 1 3 2 4 6
Résolution des collisions Méthode directe(par calcul) La résolution se fait à l'aide de calcul à l'intérieur du tableau. 2 types de gestion des collisions directes: Par hachage linéaire Par double hachage
Résolution des collisions Hachage linéaire éléments X1 X2 X3 X4 X5 X6 X7 X8 X9 valeurs de hachage 10 3 5 11 4 1 2 Si collision à la position i on essaie i+1 mod N Algorithme d’ajout d’un élément: i h(e) SI i occupée alors j1 i(h(e)+j) mod N Tanque((i occupé)et (j<N-1))faire jj+1 Fin tanque Fsi
Résolution des collisions Hachage linéaire Algorithme de recherche d’un élément e dans T ih(e) J1 Tant que (T[i]!=e)et(T[i]!=vide) et(j<N-1) faire i(h(e)+j)mod N Fin tantque Si (T[i]==e) alors retourner l’élément Sinon écrire l’élément e n’existe pas dans T Finsi
Résolution des collisions Double Hachage Algorithme ih(e) Si i occupé alors j1 i(h(e)+h’(e)*j) mod N Tant que ((i occupée)et (j<T-1)) faire jj+1 Fin tantque Fsi