Algorithmique fondamentale (I)

publicité
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
Téléchargement