Algorithmique fondamentale (I) Anne Bouillard David Cachera Préparation Agrégation Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 1 / 89 Bibliographie (1/2) D. Beauquier, J. Berstel, and Ph. Chrétienne. Éléments d’algorithmique. Masson, 1992. http ://www-igm.univ-mlv.fr/˜berstel/Elements/Elements.html. T. Cormen, C. Leiserson, R. Rivest, and C. Stein. Introduction to algorithms. MIT Press, 2nd edition, 2001. C. Froidevaux, M.-C. Gaudel, and M. Soria. Types de données et algorithmes. Ediscience international, 1997. R. Sedgewick, and Ph. Flajolet. Introduction à l’analyse des algorithmes. International Thomson publishing, 1996. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 2 / 89 Bibliographie (2/2) Fournier Graphes et algorithmes. éditions X. Garey-Johson Computers and intractability 1979. Papadimitriou Algorithms 2008. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 3 / 89 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 4 / 89 Analyse d’un algorithme 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 5 / 89 Analyse d’un algorithme Trois grands aspects Terminaison Prouver que l’algorithme termine en un temps fini. Correction (partielle) Prouver que l’algorithme renvoie le résultat attendu. Correction totale = correction partielle + terminaison. Complexité Calculer le nombre d’opérations élémentaires nécessaires pour effectuer l’algorithme. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 6 / 89 Analyse d’un algorithme Correction d’un algorithme Terminaison d’un algorithme Points délicats : les boucles et les appels récursifs. Définition (Ordre bien fondé) Soit (A, ≤) un ensemble muni d’une relation d’ordre (partiel). Cet ordre est bien fondé s’il n’existe pas de suite infinie sur A strictement décroissante. Exhiber une quantité dans un ensemble muni d’un ordre bien fondé qui diminue strictement à chaque passage dans la boucle ou à chaque appel récursif. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 7 / 89 Analyse d’un algorithme Correction d’un algorithme Correction partielle G. Winskell. The formal semantics of programming languages. MIT Press, 1993. Pré-conditions et post-conditions : propriétés que l’on a avant / après une instruction. Invariants de boucle : propriété qui reste vraie à chaque passage dans une boucle. cf. logique de Hoare. pgcd m ← a; n ← b; tantque m 6= n faire si m > n alors m ← m −n; si m < n alors n ← n −m; Retourner m. Anne Bouillard David Cachera () {a, b ∈ N} {a = m et a, b, m ∈ N} {a = m et b = n et a, b, m, n ∈ N} {a = m et b = n et a, b, m, n ∈ N} Invariant : {a ∧ b = m ∧ n et a, b, m, n ∈ N} En sortie de la boucle : {a ∧ b = m ∧ n et n = m et a, b, m, n ∈ N} {m = a ∧ b et a, b ∈ N} Algorithmique fondamentale (I) Préparation Agrégation 8 / 89 Analyse d’un algorithme Complexité d’un algorithme Notations de Landau O, Ω, Θ En temps et en espace. Majoration f = O(g ) ∃a, k > 0, ∀x > a, |f (x)| ≤ k|g (x)| Minoration f = Ω(g ) ∃a, k > 0, ∀x > a, |f (x)| ≥ k|g (x)| Ordre de grandeur f = Θ(g ) f = O(g ) et f = Ω(g ). Majoration forte f = o(g ) ∀k > 0, ∃a, ∀x > a, |f (x)| ≤ k|g (x)| Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 9 / 89 Analyse d’un algorithme Complexité d’un algorithme Calcul de complexité Plusieurs calculs 1 Calcul dans le pire des cas 2 Calcul en moyenne 3 Coût amorti Méthodes de calcul 1 Récurrences 2 Séries génératrices Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 10 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 11 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 12 / 89 Structures de données Types abstraits Types de données Types prédéfinis : bool, int, float,... Structures de données : des constructeurs de types permettent de définir des types plus complexes à partir des types prédéfinis. Cette structure comprend : l’implémentation explicite d’un ensemble organisé d’objets ; la réalisation des opérations d’accès, de construction et de modification. Exemples : a’ array, a’ list,..., avec des opérations d’insertion, suppression, lecture d’un élément... Les implémentations (et la complexité des opérations) des types structurés dépendent du langage de programmation. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 13 / 89 Structures de données Types abstraits Types abstraits Définition (Types de donnée abstrait) C’est la description d’un ensemble organisé d’objets ; des opérations de manipulation sur cet ensemble. Un type de donnée abstrait ne dépend donc pas du langage de programmation utilisé. Écrire des algorithmes indépendamment d’une implémentation particulière. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 14 / 89 Structures de données Types abstraits Écrire un programme Démarche ascendante : on part d’une représentation concrète d’un type abstrait et de son implémentation, puis on écrit un algorithme en utilisant les opérations de ce type. Démarche descendante : On se donne d’abord un type abstrait et ses opérations élémentaires, puis on écrit un algorithme à partir de celles-ci avant de coder ce type abstrait (qu’on peut aussi d’abord se donner en fonction d’autres types abstraits). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 15 / 89 Structures de données Types abstraits Écrire un programme Démarche ascendante : on part d’une représentation concrète d’un type abstrait et de son implémentation, puis on écrit un algorithme en utilisant les opérations de ce type. Démarche descendante : On se donne d’abord un type abstrait et ses opérations élémentaires, puis on écrit un algorithme à partir de celles-ci avant de coder ce type abstrait (qu’on peut aussi d’abord se donner en fonction d’autres types abstraits). Avantages de la deuxième méthode conception plus simple (les détails de la programmation viennent en fin de conception) ; on se laisse le choix de l’implémentation du type abstrait pour le dernier moment ; le type doit être défini de manière très précise. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 15 / 89 Structures de données Types abstraits Description d’un type abstrait Signature : donne les noms (sortes) des ensembles de valeurs (qui ont un type) et des opérations. Il manque à cette description la sémantique des opérations. Description des propriétés des opérations sous forme d’axiomes (se pose alors le problème de la consistance et de la complétude de cet ensemble d’axiomes) type abstrait algébrique. Éventuellement, une opération peut être définie sur un ensemble de définition à préciser (pré-conditions). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 16 / 89 Structures de données Types abstraits Types linéaires Liste linéaire sur un ensemble E (type élément) : suite finie (e1 , . . . , en ) d’éléments de E . La liste est vide si n = 0. Accessibilité des éléments : direct par l’indice (∼ tableau) ou indirectement (liste chaînée) p e1 e2 ep en Il faut distinguer la place p du contenu ep (ou appelé clé). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 17 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Piles et files Algorithmique fondamentale (I) Préparation Agrégation 18 / 89 Structures de données Piles et files Piles : Définition Opérations : PILEVIDE(); Crée une pile vide. SOMMET(p:pile):élément; (si la pile est non vide) Renvoie l’élément au sommet de la pile. EMPILER(x:élément, p:pile); Insère x au sommet de la pile. DÉPILER(p:pile); Supprime le sommet de la pile (si la pile est non vide). TEST_VIDE(p:pile):bool; Teste si la pile est vide. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 19 / 89 Structures de données Piles et files Piles : Description Signature Sorte pile Utilise bool, élément Opérations PILEVIDE : → pile SOMMET : pile → élément EMPILER : élément × pile → pile DÉPILER : pile → pile TEST_VIDE : pile → bool Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 20 / 89 Structures de données Piles et files Piles : Description Signature PILEVIDE : → pile SOMMET : pile → élément EMPILER : élément × pile → pile DÉPILER : pile → pile TEST_VIDE : pile → bool Axiomes Pré-conditions : DÉPILER(p) et SOMMET(p) sont définies ssi TEST_VIDE(p) = faux. DÉPILER(EMPILER(p,e))=p ; SOMMET(EMPILER(p,e))=e ; TEST_VIDE(PILEVIDE)=vrai ; TEST_VIDE(EMPILER(p,e)) = faux. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 20 / 89 Structures de données Piles et files Application : tri par insertion Tri d’une suite (x1 , . . . , xn ) dans une pile selon le procédé suivant : si n = 0, la suite est triée ; sinon, on trie (x1 , . . . , xn−1 ) en une suite croissante, puis on insère xn dans cette suite en le comparant aux éléments successifs de la pile. Exercice Écrire un algorithme triant une suite dans une pile. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 21 / 89 Structures de données Piles et files Implémentation par un tableau Les éléments sont rangés dans un tableau, et on conserve l’indice indiquant le nombre d’éléments. Avantage : facilité d’écriture. Inconvénient : il faut savoir borner a priori le nombre d’éléments. np e1 e2 e3 X Anne Bouillard David Cachera () X X Algorithmique fondamentale (I) Préparation Agrégation 22 / 89 Structures de données Piles et files Implémentation par une liste chaînée Méthode plus souple (ne nécessite pas de connaître le nombre maximum d’éléments dans la pile). e1 e2 en Exercice Écrire (en Caml par exemple) ces deux implémentations. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 23 / 89 Structures de données Piles et files Files : Définition Opérations : FILEVIDE(); Crée une file vide. TÊTE(f:file):élément; (Si la file est non vide) Renvoie l’élément en tête de la file. ENFILER(x:élément, f:file); Insère x en fin de la file. DÉFILER(f:file); Supprime l’élément en tête de la file (si la file est non vide). TEST_VIDE(f:file):bool; Teste si la file est vide. Exercice Écrire la signature et les axiomes pour une file. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 24 / 89 Structures de données Piles et files Implémentations par un tableau Si on sait borner le nombre d’insertions : ns X ni e1 e2 e3 e4 X Si on sait borner le nombre d’éléments : ni e2 e3 X Anne Bouillard David Cachera () ns X X Algorithmique fondamentale (I) e1 Préparation Agrégation 25 / 89 Structures de données Piles et files Implémentations par une liste chaînée Avec deux pointeurs (l’un, tête, le prochain élément à supprimer et l’autre, dernier, sur le dernier élément inséré). tête e1 e2 en dernier Un seul pointeur peut suffire en utilisant une liste chaînée circulaire. dernier e1 Anne Bouillard David Cachera () e2 Algorithmique fondamentale (I) en Préparation Agrégation 26 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Listes et ensembles Algorithmique fondamentale (I) Préparation Agrégation 27 / 89 Structures de données Listes et ensembles Listes Les suppressions et insertions peuvent se faire à l’intérieur de la liste. On peut parcourir les listes sans les détruire. Bien distinguer place et élément (une place n’appartient qu’à une liste et y apparaît une seule fois, tandis que le contenu (élément) peut apparaître en des places arbitraires). Les opérations élémentaires sont : LISTEVIDE(l:liste) : Crée une liste vide ; TEST_VIDE(l:liste):bool teste si la liste est vide ; CONTENU(p:place, l:liste):élément donne le contenu de la place ; INSÉRER(x:élément,p:place,l:liste) insère un élément après la place ; SUPPRIMER(p:place, l:liste) supprime l’élément de la place. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 28 / 89 Structures de données Listes et ensembles Implémentation Par un tableau : mêmes remarques que précédemment. Par une liste chaînée Par une liste doublement chaînée. Exercice Implémenter le type liste par une liste doublement chaînée. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 29 / 89 Structures de données Listes et ensembles Ensembles Les opérations élémentaires sont : ENSEMBLEVIDE() : Crée un ensemble vide ; AJOUTER(x:élément,e:ensemble) ajoute un élément à l’ensemble e ; SUPPRIMER(x:élément, e:ensemble) supprime l’élément de l’ensemble ; _ ∈ _ : texte l’appartenance d’un élément à un ensemble ; TEST_VIDE(e:ensemble) : teste si l’ensemble est vide. Afin d’énumérer les éléments d’un ensemble, on a aussi la fonction CHOISIR(e: ensemble) qui rend un élément quelconque de l’ensemble. tantque TEST_VIDE(e) faux faire x ← CHOISIR(e) ; traiter(x) ; e ← SUPPRIMER(x, e) ; (Ne pas oublier de faire une copie de e si on veut le conserver.) Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 30 / 89 Structures de données Listes et ensembles Implémentation Par un tableau de booléens : implémentation facile, efficace pour l’ajout, la suppression, mais en la taille du tableau pour initialisation vide, calcul du nombre d’éléments, ou parcours des éléments (même si très peu d’éléments dans l’ensemble). Gourmand en espace. Par une liste : test vide facile, opérations en le nombre d’éléments dans la liste. Ajout « paresseux » : on ne teste pas si l’élément est déjà dans le tableau, en temps constant. Mais complique les autres opérations (en particulier la suppression), et peut faire construire de grandes listes par rapport au cardinal de l’ensemble. Par un tableau : mêmes remarques que pour l’ajout paresseux et mêmes inconvénients que pour les autres types. Les opérations s’effectuent donc en un temps proportionnel au cardinal de l’ensemble ou à la taille de la structure. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 31 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Arbres et graphes Algorithmique fondamentale (I) Préparation Agrégation 32 / 89 Structures de données Arbres et graphes Graphes et arbres Définition Un graphe est un couple (V , E ) où : V est un ensemble de sommets E est un ensemble d’ arêtes, E ⊂ V × V . Définition (Arbre enraciné) Un arbre enraciné est un graphe connexe sans cycle dont un sommet (la racine) est distingué. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 33 / 89 Structures de données Arbres et graphes Quelques définitions et propriétés sur les arbres branche racine père frères fils feuille La taille d’un arbre est égale au nombre de sommets. La hauteur (ou profondeur ou niveau) d’un sommet est la distance à la racine (h(x) = 0 si x est la racine, et sinon h(x) = h(y ) + 1 si y est le père de x). La hauteur d’un arbre est h(V ) = maxx∈V h(x). Propriété : |V | = |E | + 1. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 34 / 89 Structures de données Arbres et graphes Arbres binaires Définition inductive Un arbre binaire est soit vide (noté ∅), soit de la forme B = ho, B1 , B2 i, où B1 et B2 sont des arbres binaires disjoints et o est un sommet appelé racine. Arbres binaires remarquables [Froidevaux] Arbres dégénérés Arbres complets Arbres parfaits Arbres localement complets Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 35 / 89 Structures de données Arbres et graphes Arbres binaires Définition inductive Un arbre binaire est soit vide (noté ∅), soit de la forme B = ho, B1 , B2 i, où B1 et B2 sont des arbres binaires disjoints et o est un sommet appelé racine. Arbres binaires remarquables [Froidevaux] Arbres dégénérés Arbres complets Arbres parfaits Arbres localement complets Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 35 / 89 Structures de données Arbres et graphes Arbres binaires Définition inductive Un arbre binaire est soit vide (noté ∅), soit de la forme B = ho, B1 , B2 i, où B1 et B2 sont des arbres binaires disjoints et o est un sommet appelé racine. Arbres binaires remarquables [Froidevaux] Arbres dégénérés Arbres complets Arbres parfaits Arbres localement complets Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 35 / 89 Structures de données Arbres et graphes Arbres binaires Définition inductive Un arbre binaire est soit vide (noté ∅), soit de la forme B = ho, B1 , B2 i, où B1 et B2 sont des arbres binaires disjoints et o est un sommet appelé racine. Arbres binaires remarquables [Froidevaux] Arbres dégénérés Arbres complets Arbres parfaits Arbres localement complets Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 35 / 89 Structures de données Arbres et graphes Arbres binaires Définition inductive Un arbre binaire est soit vide (noté ∅), soit de la forme B = ho, B1 , B2 i, où B1 et B2 sont des arbres binaires disjoints et o est un sommet appelé racine. Arbres binaires remarquables [Froidevaux] Arbres dégénérés Arbres complets Arbres parfaits Arbres localement complets Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 35 / 89 Structures de données Arbres et graphes Propriétés des arbres binaires Proposition Hauteur d’un arbre binaire : ⌊log2 |V |⌋ ≤ h ≤ |V | − 1. Le nombre de feuilles est borné par : |f | ≤ |V 2|+1 d’où h ≥ ⌈log2 |f |⌉. Si un arbre localement complet a n sommets internes, il a n + 1 feuilles. Dénombrement des arbres binaires - Nombre de Catalan Bn = 1 Cn . n + 1 2n AB = ∅ | ho, P AB, ABi. de l’arbre. Soit B(z) = n∈N Bn z n la série génératrice √ On a B(z) = 1 + zB 2 (z), d’où B(z) = Anne Bouillard David Cachera () 1− 1−4z . 2z Algorithmique fondamentale (I) Préparation Agrégation 36 / 89 Structures de données Arbres et graphes Le type abstrait arbre binaire Signature Sorte : arbre, utilise sommet, élément Opérations : ARBRE_VIDE : → arbre ; h−, −, −i : sommet × arbre× arbre → arbre ; RACINE : arbre → sommet ; G : arbre → arbre ; D : arbre → arbre ; CONTENU : sommet → élément. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 37 / 89 Structures de données Arbres et graphes Le type abstrait arbre binaire Signature ARBRE_VIDE : → arbre ; h−, −, −i : sommet × arbre× arbre → arbre ; RACINE : arbre → sommet ; G : arbre → arbre ; D : arbre → arbre ; CONTENU : sommet → élément. Axiomes RACINE(ho, B1 , B2 i) = o ; G(ho, B1 , B2 i) = B1 ; RACINE(B), G(B) et D(B) sont définies ssi B est non vide. D(ho, B1 , B2 i) = B2 ; Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 37 / 89 Structures de données Arbres et graphes Implémentation Pointeurs : le père pointe sur chacun de ses fils. Tableau : à chaque sommet, désigné par une place du tableau, on associe la place du père. Exercice Définir en Caml le type arbre binaire et implanter l’opération hauteur. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 38 / 89 Structures de données Arbres et graphes Les arbres généraux Chaque sommet a un nombre arbitraire de fils. Quelques exemples d’implémentation : Chaque sommet est dans un tableau qui pointe vers la liste de ses fils ; Chaque sommet contient un pointeur vers chacun de ses fils Sous forme d’un arbre binaire (fils aîné - frère cadet). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 39 / 89 Structures de données Arbres et graphes Le type abstrait graphe Signature Sorte : graphe, utilise sommet, élément Opérations : GRAPHE_VIDE : → graphe ; AJOUT_SOMMET : sommet × graphe → graphe ; AJOUT_ARETE : sommet × sommet × graphe → graphe ; EST_SOMMET : sommet × graphe → bool ; EST_ARETE : sommet × sommet × graphe → bool ; RETIRER_SOMMET : sommet × graphe → graphe ; RETIRER_ARETE : sommet × sommet × graphe → graphe ; Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 40 / 89 Structures de données Arbres et graphes Implémentation Considérons un graphe à n sommets, G = (V , E ). Matrice d’adjacence : un tableau bi-dimensionnel. ( 1 si (i, j) ∈ E Aij = 0 sinon. Matrice d’incidence : pour les graphes orientés 1 si ∃j ∈ V , e = (i, j) Mie = −1 si ∃j ∈ V , (j, i) ∈ E 0 sinon. Liste des successeurs : un tableau de taille n de pointeurs : chaque élément du tableau est une liste chaînée contenant les voisins. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 41 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Arbres de recherche Algorithmique fondamentale (I) Préparation Agrégation 42 / 89 Structures de données Arbres de recherche Dictionnaire C’est un type abstrait qui contient les trois opérations suivantes : Recherche ; Insertion ; Suppression. et de créer un élément vide et de tester le vide. Le problème de de trouver des structures qui font ces trois opérations avec une complexité minimale. Les éléments sont des clés qui sont dans un ensemble totalement ordonné. Exercice Quelle serait la complexité de ces opérations avec une pile ou une file (triée ou non) ? avec un tableau ? Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 43 / 89 Structures de données Arbres de recherche Implémentation par un tableau ou une liste chaînée Recherche séquentielle(T , x) n ← 0; tantque (n < |T |) et (T [n] 6= x) faire n ← n + 1; si T [n] = x alors Return n sinon Return −1. Recherche possible avec une liste non triée. L’opération de recherche se fait en O(|T |). L’opération d’insertion peut se faire en temps constant et celle de suppression est aussi en O(|T |). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 44 / 89 Structures de données Arbres de recherche Tableau trié : recherche dichotomique Recherche_dicho(T , x, g , d ) si g = d alors si T [g ] = x alors return g sinon Return −1 ; m ← ⌊(g + d )/2⌋ ; si T [m] ≥ x alors Recherche_dicho(T , x, g , m) sinon Recherche_dicho(T , x, m, d ). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 45 / 89 Structures de données Arbres de recherche Tableau trié : recherche dichotomique Recherche_dicho(T , x, g , d ) si g = d alors si T [g ] = x alors return g sinon Return −1 ; m ← ⌊(g + d )/2⌋ ; si T [m] ≥ x alors Recherche_dicho(T , x, g , m) sinon Recherche_dicho(T , x, m, d ). Invariant de boucle : l’élément recherché, s’il existe dans le tableau, se trouve dans la partie du tableau entre g et d . Terminaison : d − g décroît strictement à chaque appel de Recherche_dicho. Complexité : O(log |T |) : « Diviser pour régner » Insertion et suppression en O(|T |). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 45 / 89 Structures de données Arbres de recherche Arbres de recherche Une solution plus efficace est d’utiliser un arbre de recherche. Définition (Arbre (binaire) de recherche) C’est un arbre A = (V , E ) dont chaque sommet x ∈ V est muni d’une clé c(x) telle que ∀y ∈ SG (x), c(y ) < c(x) et ∀y ∈ SD(x), c(y ) > c(x) , où SG (x) (resp. SD(x)) est le sous-arbre gauche (resp. droit) de x. Lorsque les arbres sont équilibrés, toutes les opérations se font en O(log |A|) Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 46 / 89 Structures de données Arbres de recherche CHERCHER (x:clé, a:arbre):bool Entrées: x une clé et a un arbre binaire de recherche Sorties: vrai si x est une clé de a, faux sinon si TEST_VIDE(a) alors Retourner faux sinon si x =CLÉ(a) alors Retourner vrai sinon si x <CLÉ(a) alors Retourner CHERCHER(x, G (a)) sinon Retourner CHERCHER(x, D(a)). La complexité est au pire la hauteur de l’arbre a. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 47 / 89 Structures de données Arbres de recherche INSÉRER (x:clé, a:arbre) Entrées: une clé x à insérer dans un arbre a Sorties: L’arbre a modifié est toujours un arbre de recherche si TEST_VIDE(a) alors a ← FAIRE_FEUILLE(x) sinon si x <CLÉ(a) alors INSÉRER(x, G (a)) sinon INSÉRER(x, D(a)). La complexité est au pire la hauteur de l’arbre a. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 48 / 89 Structures de données Arbres de recherche SUPPRIMER (x:clé, a:arbre) Entrées: une clé x à supprimer dans un arbre a Sorties: L’arbre a modifié est toujours un arbre de recherche si x <CLÉ(a) alors SUPPRIMER(x, G (a)) sinon si x >CLÉ(a) alors SUPPRIMER(x, D(a)) sinon si TEST_VIDE(G (a)) alors a ← D(a) sinon si TEST_VIDE(D(a)) alors a ← G (a) sinon FIXER_CLÉ(SUPPRIMER_MAX(G(a)),a). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 49 / 89 Structures de données Arbres de recherche SUPPRIMER_MAX (a: arbre):clé Entrées: un arbre a Sorties: La clé maximum de a est supprimée et on renvoie sa valeur si TEST_VIDE(D(a)) alors SUPPRIMER_MAX ← CLÉ(a) ; a ← G (a) sinon SUPPRIMER_MAX ← SUPPRIMER_MAX (D(a)) La suppression d’une clé se fait aussi avec une complexité au pire la hauteur de l’arbre. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 50 / 89 Structures de données Arbres de recherche Avantages et inconvénients des arbres binaires de recherche Toutes les opérations s’effectuent dans le pire des cas en temps linéaire (si l’arbre obtenu est dégénéré). Si l’arbre était équilibré (parfait), les opérations s’effectueraient en temps logarithmique ! En moyenne, les opérations s’effectuent en temps logarithmique. Question Peut-on faire mieux ? On peut aussi choisir une nouvelle structure en accord avec l’opération dont on a le plus besoin ; Équilibrage des arbres ; Tables de hachages : bonnes performances en moyenne. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 51 / 89 Structures de données Arbres de recherche Files de priorités : type abstrait filep FILEPVIDE (); crée une file de priorité vide ; TEST_VIDE (f:filep):bool; teste si la file est vide ; MINIMUM (f:filep): clé; donne la plus petite clé contenue dans la file ; SUPPRIMER_MIN (f: filep); supprime la plus petite clé ; INSÉRER (x:clé, f:filep); insère un élément dans la file ; EXTRAIRE_MIN (f: filep): clé; combinaison de SUPPRIMER_MIN et MINIMUM. On peut utiliser un arbre binaire de recherche. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 52 / 89 Structures de données Arbres de recherche Tas Définition (Arbre tournoi) Un arbre tournoi est un arbre binaire dont les sommets sont munis de clés telles que pour tout sommet autre que la racine, sa clé est supérieure à celle de son père. Définition (Tas) Un tas est un arbre tournois parfait. Avec cette structure, MINIMUM se fait en temps constant. Les autres opérations se font en temps logarithmique en la taille du tas. Les opérations spécifiques élémentaires d’un tas sont : EST_FEUILLE, DERNIÈRE_FEUILLE, CRÉER_FEUILLE, SUPPRIMER_FEUILLE et CLÉ. On utilise la fonction annexe ÉCHANGER_CLÉ pour conserver le caractère tournoi. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 53 / 89 Structures de données Arbres de recherche INSÉRER_TAS (x:clé, a:tas) Entrées: une clé x et un tas a Sorties: le tas a dans lequel x a été insérée q ←CRÉER_FEUILLE(x, a) ; tantque q 6=RACINE(a) et CLÉ(PÈRE(q)) > CLÉ(q) faire ÉCHANGER_CLÉ(q,PÈRE(q)) ; q ← PÈRE(q). 1 3 4 8 5 6 10 Anne Bouillard David Cachera () 7 11 9 Algorithmique fondamentale (I) Préparation Agrégation 54 / 89 Structures de données Arbres de recherche INSÉRER_TAS (x:clé, a:tas) Entrées: une clé x et un tas a Sorties: le tas a dans lequel x a été insérée q ←CRÉER_FEUILLE(x, a) ; tantque q 6=RACINE(a) et CLÉ(PÈRE(q)) > CLÉ(q) faire ÉCHANGER_CLÉ(q,PÈRE(q)) ; q ← PÈRE(q). 1 3 4 8 5 6 10 Anne Bouillard David Cachera () 9 7 11 2 Algorithmique fondamentale (I) Préparation Agrégation 54 / 89 Structures de données Arbres de recherche INSÉRER_TAS (x:clé, a:tas) Entrées: une clé x et un tas a Sorties: le tas a dans lequel x a été insérée q ←CRÉER_FEUILLE(x, a) ; tantque q 6=RACINE(a) et CLÉ(PÈRE(q)) > CLÉ(q) faire ÉCHANGER_CLÉ(q,PÈRE(q)) ; q ← PÈRE(q). 1 3 4 2 5 6 10 Anne Bouillard David Cachera () 9 7 11 8 Algorithmique fondamentale (I) Préparation Agrégation 54 / 89 Structures de données Arbres de recherche INSÉRER_TAS (x:clé, a:tas) Entrées: une clé x et un tas a Sorties: le tas a dans lequel x a été insérée q ←CRÉER_FEUILLE(x, a) ; tantque q 6=RACINE(a) et CLÉ(PÈRE(q)) > CLÉ(q) faire ÉCHANGER_CLÉ(q,PÈRE(q)) ; q ← PÈRE(q). 1 3 2 4 5 6 10 Anne Bouillard David Cachera () 9 7 11 8 Algorithmique fondamentale (I) Préparation Agrégation 54 / 89 Structures de données Arbres de recherche EXTRAIRE_MIN(a:tas):clé Entrées: Un tas a Sorties: Supprime la clé minimum du tas de a qui conserve sa structure de tas. EXTRAIRE_MIN← CLÉ(RACINE(a)) ; ÉCHANGER_CLÉ(RACINE(a), DERNIÈRE_FEUILLE(a)) ; SUPPRIMER_FEUILLE(a) ; si TEST_VIDE(a) = faux alors p ← RACINE(a) ; tantque EST_FEUILLE(p) = faux faire f ← FILS_MIN(p,a) ; si CLÉ(f ) < CLÉ(p) alors ÉCHANGER_CLÉ(f , p) sinon exit p ←f. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 55 / 89 Structures de données Arbres de recherche EXTRAIRE_MIN(a:tas):clé 1 3 2 4 5 6 10 Anne Bouillard David Cachera () 9 7 11 8 Algorithmique fondamentale (I) Préparation Agrégation 56 / 89 Structures de données Arbres de recherche EXTRAIRE_MIN(a:tas):clé 8 3 2 4 5 6 10 Anne Bouillard David Cachera () 9 7 11 1 Algorithmique fondamentale (I) Préparation Agrégation 56 / 89 Structures de données Arbres de recherche EXTRAIRE_MIN(a:tas):clé 8 3 2 4 5 6 10 Anne Bouillard David Cachera () 7 11 9 Algorithmique fondamentale (I) Préparation Agrégation 56 / 89 Structures de données Arbres de recherche EXTRAIRE_MIN(a:tas):clé 2 3 8 4 5 6 10 Anne Bouillard David Cachera () 7 11 9 Algorithmique fondamentale (I) Préparation Agrégation 56 / 89 Structures de données Arbres de recherche EXTRAIRE_MIN(a:tas):clé 2 3 4 8 5 6 10 Anne Bouillard David Cachera () 7 11 9 Algorithmique fondamentale (I) Préparation Agrégation 56 / 89 Structures de données Arbres de recherche Implémentation Par un tableau T indicé de 1 à n : Racine : indice 1, de clé T [1] ; Feuilles : sommets k tels que 2k > n ; Un sommet k a un seul fils (gauche) si n = 2k ; Le sommet k a deux fils : 2k (gauche) et 2k + 1 (droit) si n ≥ 2k + 1 ; Le père d’un sommet k (k 6= 1) est ⌊k/2⌋. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 57 / 89 Structures de données Arbres de recherche Équilibrage des arbres de recherche On veut pouvoir effectuer les opérations de recherche/insertion/suppression en un temps logarithmique en la taille de l’arbre. Pour ce faire, on aimerait que la hauteur de l’arbre soit aussi logarithmique en la taille de l’arbre, et donc à équilibrer les arbres. Équilibrage parfait : construire un arbre binaire de recherche parfait. Il faut un coût linéaire pour construire un tel équilibrage. Il faut donc trouver des compromis entre équilibrage et coût de cet équilibrage. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 58 / 89 Structures de données Arbres de recherche Rotations Faire basculer vers la gauche ou vers la droite un sous-arbre déséquilibré. rot. droite q W p U rot. gauche V p U q V W RD(hq, hp, U, V i, W i) = hp, U, hq, V , W ii RG(hp, U, hq, V , W ii) = hq, hp, U, V i, W i Ces opérations se font en temps constant. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 59 / 89 Structures de données Arbres de recherche Rotations Faire basculer vers la gauche ou vers la droite un sous-arbre déséquilibré. rot. droite p<q q p U p W rot. gauche p<V <q U q>p q q>V >p V V W RD(hq, hp, U, V i, W i) = hp, U, hq, V , W ii RG(hp, U, hq, V , W ii) = hq, hp, U, V i, W i Ces opérations se font en temps constant. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 59 / 89 Structures de données Arbres de recherche Rotations doubles RGD (A)= RG(G (A)) ; RD(A) RDG (A)= RD(D(A)) ; RG(A) r p W q T U V Ces opérations se font en temps constant. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 60 / 89 Structures de données Arbres de recherche Rotations doubles RGD (A)= RG(G (A)) ; RD(A) RDG (A)= RD(D(A)) ; RG(A) r q p W p → rgd (A) = r q T T U U V W V Ces opérations se font en temps constant. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 60 / 89 Structures de données Arbres de recherche Arbres AVL (Adelson-Velskii et Landis) Définition (Arbre AVL) δ(A) = h(G (A)) − h(D(A)) : déséquilibre de l’arbre A. Soit A(x) le sous-arbre de A de racine x. Un arbre AVL est un arbre binaire de recherche tel que pour tout sommet x, δ(x) = δ(A(x)) ∈ {−1, 0, 1}. Proposition Soit A un arbre AVL ayant n sommets et de hauteur h. Alors, log2 (n + 1) ≤ h + 1 ≤ 1, 44 log2 (n + 2). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 61 / 89 Structures de données Arbres de recherche Arbres déséquilibrés Les arbres AVL les « plus déséquilibrés ». Un arbre qui a le moins de sommets pour une hauteur donnée : N(−1) = 0 (arbre vide) ; N(0) = 1 (racine) ; N(h) = 1 + N(h − 1) + N(h − 2). 0 Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 62 / 89 Structures de données Arbres de recherche Arbres déséquilibrés Les arbres AVL les « plus déséquilibrés ». Un arbre qui a le moins de sommets pour une hauteur donnée : N(−1) = 0 (arbre vide) ; N(0) = 1 (racine) ; 1 N(h) = 1 + N(h − 1) + N(h − 2). 0 Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 62 / 89 Structures de données Arbres de recherche Arbres déséquilibrés Les arbres AVL les « plus déséquilibrés ». Un arbre qui a le moins de sommets pour une hauteur donnée : N(−1) = 0 (arbre vide) ; 1 N(0) = 1 (racine) ; 1 N(h) = 1 + N(h − 1) + N(h − 2). 0 0 Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 62 / 89 Structures de données Arbres de recherche Arbres déséquilibrés Les arbres AVL les « plus déséquilibrés ». Un arbre qui a le moins de sommets pour une hauteur donnée : 1 N(−1) = 0 (arbre vide) ; 1 1 N(0) = 1 (racine) ; 1 N(h) = 1 + N(h − 1) + N(h − 2). 0 0 0 Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 62 / 89 Structures de données Arbres de recherche Arbres déséquilibrés Les arbres AVL les « plus déséquilibrés ». Un arbre qui a le moins de sommets pour une hauteur donnée : 1 N(−1) = 0 (arbre vide) ; 1 1 N(0) = 1 (racine) ; 1 N(h) = 1 + N(h − 1) + N(h − 2). 0 0 0 En posant F (h) = N(h) + 1, on retrouve l’égalité F (h) = F (h − 1) + F (h − 2). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 62 / 89 Structures de données Arbres de recherche Arbres de Fibonacci Les arbres AVL les « plus déséquilibrés ». Un arbre qui a le moins de sommets pour une hauteur donnée : 1 N(−1) = 0 (arbre vide) ; 1 1 N(0) = 1 (racine) ; 1 N(h) = 1 + N(h − 1) + N(h − 2). 0 0 0 En posant F (h) = N(h) + 1, on retrouve l’égalité F (h) = F (h − 1) + F (h − 2). h+3 On a alors n + 1 ≥ F (h), et F (h) = √15 (φh+3 − φ ) avec φ = Anne Bouillard David Cachera () Algorithmique fondamentale (I) √ 1+ 5 2 . Préparation Agrégation 62 / 89 Structures de données Arbres de recherche Insertion L’insertion se fait en deux phases. 1 2 Insertion dans un arbre binaire de recherche déjà décrite avant (création d’une feuille). Équilibrage le cas échéant. Le déséquilibre ne peut venir que de la branche modifiée. Soient s la feuille insérée et x le premier sommet de s à r (racine) présentant un déséquilibre ∈ {−2, 2}. x AVL δ(x) = 1 → 2 AVL h h+1 s Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 63 / 89 Structures de données Arbres de recherche Insertion : configuration 1 Après insertion Avant insertion h+1 h h+2 δ=1 x W h h−1 h−1 U 1 h + 1 δ = 1 h −W y δ =0 h−1 y δ=2 x V U h−1 V s Rotation droite h+1 δ=1 y h U s Le déséquilibre des autres sommets n’est pas modifié par l’insertion. δ=0 h x h−1 V Anne Bouillard David Cachera () h−1 W Algorithmique fondamentale (I) Préparation Agrégation 64 / 89 Structures de données Arbres de recherche Insertion : configuration 2 h h−1 p U h+1 h q r δ=2 δ=1 p δ=0 h−2 T r δ=0 V Anne Bouillard David Cachera () δ = −1 h−1 W T q U 1 Algorithmique fondamentale (I) δ = ±1 W V 2 Préparation Agrégation 65 / 89 Structures de données Arbres de recherche Insertion : configuration 2 h h−1 p h+1 h q p δ=2 T V h+1 h p T Anne Bouillard David Cachera () q q U 1 δ = ±1 W V 2 δ=0 δ = 0..1h U V 1 2 δ = −1 h−1 W δ=0 U → rgd (A) = r δ=1 δ=0 h−2 T r r δ = 0.. − 1 W Algorithmique fondamentale (I) Préparation Agrégation 65 / 89 Structures de données Arbres de recherche Suppression La suppression se fait en deux phases. 1 2 Suppression dans un arbre binaire de recherche déjà décrite avant (revient à supprimer une feuille s). Équilibrage : on remonte de s vers r . La suppression et l’insertion se font en O(log n) : dans le cas de l’insertion, on a au plus une rotation double, et pour la suppression, il y a au plus O(log(n)) rééquilibrages. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 66 / 89 Structures de données Arbres de recherche Arbres rouge-noir (Guibas et Sedgewick) Définition Arbre binaire localement complet (A, c) avec une coloration c sur les sommets, tel que toute feuille est noire ; la racine est noire ; le père d’un sommet rouge est noir ; les chemins issus d’un même sommet et se terminant en une feuille ont le même nombre de sommets noirs. Seuls les sommets internes contiennent des clés. On peut donc ne pas représenter les feuilles. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 67 / 89 Structures de données Arbres de recherche Fonction rang et hauteur de l’arbre Définition Fonction rang Si x est une feuille, alors rg (x) = 0 et si x a un père, alors rg (p(x)) = 1. rg (x) ≤ rg (p(x)) ≤ rg (x) + 1 rg (x) < rg (p(p(x))). La coloration de l’arbre donne son rang : rg (x) = nombre de sommets noirs allant de x (exclus) à une feuille. Hauteur d’un arbre rouge-noir Soit x un sommet de rang k et de hauteur h. Alors, h ≤ 2k, n ≥ 2k et si x est rouge alors l’inégalité est stricte. ⌊log n⌋ ≤ h ≤ 2⌊log n⌋. La recherche dans un ARN se fait en O(log n). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 68 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Tables de hachage Algorithmique fondamentale (I) Préparation Agrégation 69 / 89 Structures de données Tables de hachage But et idée But Trouver une structure qui permet les opérations de dictionnaire (insertion, recherche, suppression) en un temps moyen constant. Idée Un tableau, pour avoir un adressage direct. On a un univers U de clés, U = {1, . . . , m}. On stocke les données correspondant à la clé k dans un tableau T de taille m. Pour une clé k donnée, T [k] est NIL si l’ensemble ne contient pas d’élément de clé k ou pointe vers la clé et la donnée si l’ensemble contient un élément de clé k. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 70 / 89 Structures de données Tables de hachage Implémentation triviale rechercheAD(T , k) : retourner T [k] ; insertionAD(T , k) : T [clé[x]] ← x ; suppressionAD(T , k) : T [clé[x]] ← NIL ; Inconvénient Si U est grand, on ne peut conserver un tableau T de taille |U|. Soit K ⊆ U l’ensemble des clés réellement conservées. Cet ensemble peut être petit par rapport à U. Alors, le besoin en espace n’est que en θ(|K |). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 71 / 89 Structures de données Tables de hachage Tables de hachage On représente une table de hachage par un tableau de taille m. La fonction de hachage h : U ← {1, . . . , m} établit une correspondance entre l’univers des clés U et les alvéoles de la table de hachage. On dit que la clé k est hachée par l’alvéole h(k). U h(k1 ) K k5 k1 k6 k2 h(k5 ) h(k6 ) k4 h(k2 ) = h(k3 ) h(k4 ) k3 collision Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 72 / 89 Structures de données Tables de hachage Hachage indirect par chaînage Résolution des collisions par chaînage. k1 k5 k6 k3 k2 k4 On choisit h « aléatoire » pour éviter les collisions. insertionHC(T , x) : insérer x en tête de T [h[clé[x]] ; rechercheHC(T , k) : rechercher un élément de clé k dans la liste T [h[k]] ; suppressionHC(T , x) : supprimer x dans la listeT [h[clé[x]]. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 73 / 89 Structures de données Tables de hachage Analyse du hachage par chaînage(1) Soit m = |T | le nombre d’alvéoles et n le nombre de clés à insérer. On note α = n/m le facteur de remplissage. Dans le pire des cas, la complexité de la recherche et de la suppression est en O(n) : tous les éléments sont insérés dans le même alvéole. Hachage uniforme simple (HUS) Chaque élément a la même chance d’être haché dans un alvéole, indépendamment des autres. On suppose que h(k) peut être calculée en O(1). La recherche d’un élément se fait donc en O(T [h[k]]). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 74 / 89 Structures de données Tables de hachage Analyse du hachage par chaînage(2) Théorème Sous l’hypothèse HUS, une recherche qui échoue prend en moyenne un temps Θ(1 + α). La longueur moyenne d’une liste est α. Théorème Sous l’hypothèse HUS, une recherche qui réussit prend en moyenne un temps Θ(1 + α). Il y a i − 1 clés insérées après le n − i-ème élément, chacune ayant une probabilité 1/m d’être insérée dans le même alvéole que le n − i-ème (insertion en fin de liste). n 1X n(n − 1) α 1 i −1 )=1+ =1+ − = Θ(1 + α). (1 + n m 2mn 2 2m i=1 Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 75 / 89 Structures de données Tables de hachage Exemples de fonctions de hachage Soit P(k) la probabilité qu’une P clé k soit tirée dans U. Une bonne fonction de hachage h est telle que k | h(k)=j P(k) = m1 pour tout j. Si l’on suppose que les clés sont des réels uniformément répartis sur [0, 1], alors, on peut choisir h(k) = ⌊km⌋. Si U = N, division : h(k) = k mod m ; Si U = N, multiplication : h(k) = ⌊m(kA mod 1)⌋ 0<A<1 utile pour m = 2p hachage universel : on choisit aléatoirement la fonction de hachage parmi une classe de fonctions déterminée Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 76 / 89 Structures de données Tables de hachage Résolution des collisions par calcul (méthode directe, ou adressage ouvert) En cas de collision, on recalcule un alvéole jusqu’à en trouver un vide (il faut donc que n < m). h : U × {0, 1, . . . , m − 1} → {0, 1, . . . , m − 1}. On essaie la suite hh(k, 0), h(k, 1), . . . , h(k, m − 1)i. Attention : pour la suppression, il faut laisser un indicateur pour la recherche (si NIL, la recherche s’arrête). Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 77 / 89 Structures de données Tables de hachage Résolution des collisions par calcul (méthode directe, ou adressage ouvert) En cas de collision, on recalcule un alvéole jusqu’à en trouver un vide (il faut donc que n < m). h : U × {0, 1, . . . , m − 1} → {0, 1, . . . , m − 1}. On essaie la suite hh(k, 0), h(k, 1), . . . , h(k, m − 1)i. Attention : pour la suppression, il faut laisser un indicateur pour la recherche (si NIL, la recherche s’arrête). Exemples Hachage linéaire : h(k, i) = (h′ (k) + i) mod m. Gros regroupements de cases remplies, rend la recherche plus longue (même suite d’essais si h′ (k) = h′ (k ′ )). hachage quadratique : h(k, i) = (h′ (k) + ci + c ′ i 2 ) mod m. Double hachage : h(k, i) = (h1 (k) + ih2 (k)) mod m n’a pas cet inconvénient. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 77 / 89 Structures de données Tables de hachage Analyse de la méthode directe On suppose que les suites des fonctions de hachage sont toutes équiprobables (cas parfait et uniforme) Théorème Une recherche infructueuse se fait en moyenne en au plus α = 0.5 → 2 1 1−α . α = 0.9 → 10 Théorème Une recherche fructueuse se fait en moyenne en au plus α = 0.5 → 1, 387 Anne Bouillard David Cachera () 1 α 1 ln 1−α . α = 0.9 → 2.559 Algorithmique fondamentale (I) Préparation Agrégation 78 / 89 Structures de données 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Tables de hachage Algorithmique fondamentale (I) Préparation Agrégation 79 / 89 Structures de données Tables de hachage Graphes non orientés Définition (Graphe non-orienté) G = (S, A) est un graphe non orienté fini (simple) si S est un ensemble fini de sommets ; A ⊆ P2 (S) est un ensemble fini d’arêtes simple : sans boucle ni arête multiple. Voisins : v voisin de u si {u, v } ∈ A. Degré : d (u) = |{v ∈ S | v voisin de u}|. Chemin : suite finie de sommets u1 , . . . , un tels que {ui , ui+1 } ∈ A ∀i ∈ {1, . . . , n − 1}. Chemin simple (élémentaire) : sans répétition de sommet. Cycle : un chemin u1 , . . . , un tel que u1 = un . sans cycle = acyclique = arbre (non enraciné) Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 80 / 89 Structures de données Tables de hachage Quelques exemples de graphes particuliers graphe connexe : il existe un chemin dans le graphe entre toute paire de points. graphe complet : A = P2 (S). clique : sous-graphe complet. graphe biparti : S = S1 ∪ S2 , S1 ∩ S2 = ∅ et A ⊆ S1 × S2 . graphe k-régulier : tous les sommets sont de degré k. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 81 / 89 Structures de données Tables de hachage Graphes orientés Définition (Graphe orienté) G = (S, A) est un graphe orienté fini si S est un ensemble fini de sommets ; A ⊆ S 2 est un ensemble fini d’arcs. Adjacence : v adjacent à u si (u, v ) ∈ A. Degré entrant : d− (u) = |{v ∈ S | (v , u) ∈ A}|. Degré sortant : d+ (u) = |{v ∈ S | (u, v ) ∈ A}|. Chemin : suite finie de sommets u1 , . . . , un tels que (ui , ui+1 ) ∈ A ∀i ∈ {1, . . . , n − 1}. Chemin simple (élémentaire) : sans répétition de sommet. Circuit : un chemin u1 , . . . , un tel que u1 = un . graphe connexe : ∀u, v ∈ S, il existe un chemin de u à v ou de v à u. graphe fortement connexe : ∀u, v ∈ S, il existe un chemin de u à v . Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 82 / 89 Parcours de graphes 1 Analyse d’un algorithme Correction d’un algorithme Complexité d’un algorithme 2 Structures de données Types abstraits Piles et files Listes et ensembles Arbres et graphes Arbres de recherche Tables de hachage 3 Parcours de graphes Parcours en largeur Parcours en profondeur Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 83 / 89 Parcours de graphes Objectif Parcourir tous les sommets d’un graphe. Deux principaux types de parcours : parcours en largeur parcours en profondeur On construit en même temps un « arbre couvrant » (sous-graphe qui est un arbre et qui contient tous les sommets) qui contient les arêtes qui ont permis de découvrir les sommets. Les algorithmes présentés sont valables pour les graphes orientés et les graphes non orientés. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 84 / 89 Parcours de graphes Parcours en largeur Parcours en largeur On stocke les sommets rencontrés dans une file : on traite la tête de la file et on enfile ses voisins on encore visités. BFS(G = (S, A), s) File_vide(F) ; pour tout u ∈ S faire c[u] ← blanc ; d [u] ← ∞ ; π[u] ← NIL ; Enfiler(F , s) c[s] ← gris ; d [s] ← 0 ; π[s] ← NIL ; tantque F 6= ∅ faire u ← Défiler(F) ; pour tout v voisin de u faire si c[v ] = blanc alors Enfiler(F , v ) ; c[v ] ← gris ; d [v ] ← d [u] + 1 ; π[v ] ← u ; c[u] ← noir ; Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 85 / 89 Parcours de graphes Parcours en largeur Analyse du parcours en largeur et plus court chemin Chaque sommet accessible à partir de s est inséré une et une seule fois dans la file. Pour chaque sommet, on parcourt sa liste d’adjacence une fois. La somme des longueurs des listes d’adjacence est 2|A| (graphes non orientés) ou |A| (graphes orientés). Donc la complexité est en O(|S| + |A|). Lemme À chaque instant dans l’exécution de l’algorithme, la file F contient u1 , . . . , uk et d [uk ] ≤ d [u1 ] + 1 et pour tout i ∈ {1, . . . , k − 1}, d [ui ] ≤ d [ui+1 ]. Après exécution de l’algorithme, d [u] est égal à la distance de s à u et π[v ] = u si v est découvert à partir de u. Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 86 / 89 Parcours de graphes Parcours en profondeur Parcours en profondeur DFS(G = (S, A), s) Pile_vide(P) ; pour tout u ∈ S faire c[u] ← blanc ; π[u] ← NIL ; Empiler(P, s) c[s] ← gris ; π[s] ← NIL ; tantque F 6= ∅ faire u ← Dépiler(F) ; si il existe v voisin de u tel que c[v ] = blanc alors c[v ] ← gris ; π[v ] ← u ; Empiler(F , v ) ; sinon c[u] ← noir ; Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 87 / 89 Parcours de graphes Parcours en profondeur Parcours en profondeur récursif DFS(G) pour tout chaque sommet u ∈ S faire c[u] ← blanc ; π ← NIL ; t ← 0; pour tout chaque sommet u ∈ S faire si c[u] = blanc alors Visiter-DFS(u) ; Visiter-DFS(u) c[u] ← gris ; d [u] ← t ← t + 1 ; pour tout v ∈ Adj[u] faire si c[v ] = blanc alors π[v ] ← u ; Visiter-DFS(v ) ; c[u] ← noir ; f [u] ← t ← t + 1 ; Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 88 / 89 Parcours de graphes Parcours en profondeur Analyse Le premier algorithme de DFS ressemble au BFS, la structure de file est changée en pile. Le deuxième prend en compte les dates de début et de fin de traitement des sommets visités. Structure parenthésée des d [u] et f [u]. Classification des arcs : liaison, retour, avant, couvrant Détection de cycles Anne Bouillard David Cachera () Algorithmique fondamentale (I) Préparation Agrégation 89 / 89