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