Algorithmique Avancée - Master informatique
Algorithmique Avancée - Master informatique
Algorithmique Avancée - Master informatique
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Présentation<br />
Organisation<br />
Contenu<br />
Organisation<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Master</strong> Informatique M1-STL<br />
Enseignants de cours :<br />
Maryse Pelletier, Maryse.Pelletier@lip6.fr<br />
Olivier Bodini, Olivier.Bodini@lip6.fr<br />
Supports de cours : Michèle Soria<br />
Année 2007-2008<br />
Le site : http ://www-master.ufr-info-p6.jussieu.fr/2007<br />
L’équipe pédagogique :<br />
Cours : Maryse Pelletier et Olivier Bodini<br />
TD-TME : G1 : Maryse Pelletier ; G2 : Olivier Bodini ;<br />
G3 : Guénaël Renault et Safia Kedad ;<br />
G4 : Phliippe Trébuchet<br />
Les séances :<br />
10 semaines (TDs décalés d’une semaine vs cours)<br />
des séances de TME<br />
partiel semaine du 29 octobre<br />
fin des enseignements le 7 décembre<br />
examen session 1 semaine du 17 décembre<br />
examen session 2 semaine du 21 janvier<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée<br />
Présentation<br />
Organisation<br />
Contenu<br />
Présentation<br />
Organisation<br />
Contenu<br />
Organisation<br />
Plan du cours<br />
La note :<br />
0.4 CC + 0.6 Exam<br />
CC = 0.25 TME1 + 0.25 TME2 + 0.5 Partiel<br />
L’évaluation des TME :<br />
un rapport écrit<br />
une soutenance orale (semaine du 5 novembre pour TME1)<br />
Structures de données avancées<br />
Files Binomiales et Fibonacci<br />
Arbres-B et Hachage<br />
<strong>Algorithmique</strong> géométrique<br />
Enveloppe convexe<br />
triangulations de Delaunay<br />
Algorithmes sur les graphes<br />
Composantes fortement connexes<br />
Chemins minimaux et flots maximaux<br />
NP-complétude et réduction entre problèmes<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée
Bibliographie<br />
Présentation<br />
Organisation<br />
Contenu<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Plan du Cours 1<br />
T. Cormen, C. Leiserson, R. Rivest, C. Stein<br />
Introduction à l’algorithmique,<br />
C. Froidevaux, M-C. Gaudel, M. Soria<br />
Types de données et algorithmes<br />
D. Beauquier, J. Berstel, P. Chrétienne<br />
Eléments d’algorithmique<br />
CHAPITRE 1 : Union de Files de Priorités<br />
Files Binomiales et Files de Fibonacci (TD)<br />
Opérations sur les files de priorités<br />
Arbres binomiaux : définition et propriétés<br />
Files binomiales : définition et propriétés<br />
Union de 2 files binomiales : algorithme, complexité<br />
logarithmique<br />
Autres opérations sur les files binomiales (complexité<br />
logarithmique)<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Définition<br />
Applications<br />
Opérations sur les files de priorités<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Représentations et Efficacité<br />
Définition<br />
Applications<br />
Ensemble d’éléments<br />
Chaque élément a une clé<br />
Ordre total sur les clés<br />
Opérations<br />
Ajouter un élément<br />
Supprimer l’élément de clé minimale<br />
Union de 2 files de priorités<br />
Construction<br />
Modification d’une clé<br />
Nombre de comparaisons dans le pire des cas<br />
Liste triée Tas (Heap) File Binomiale<br />
Supp Min (n) O(1) O(log n) O(log n)<br />
Ajout (n) O(n) O(log n) O(log n)<br />
Construction (n) O(n 2 ) O(n) O(n)<br />
Union (n, m) O(n + m) O(n + m) O(log(n + m))<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Définition<br />
Applications<br />
Applications des Files de priorité<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Arbre binomial- Définition<br />
Définition – Propriétes<br />
Tri heapsort<br />
Sur les graphes<br />
plus court chemin à partir d’une source (Dijkstra)<br />
plus court chemin entre tous les couples de sommets<br />
(Johnson)<br />
arbre couvrant minimal (Prim)<br />
Interclassement de listes triées<br />
Code de Huffmann (compression)<br />
Un arbre binomial pour chaque entier positif.<br />
Définition par récurrence<br />
B 0 est l’arbre réduit à un seul nœud,<br />
Étant donnés 2 arbres binomiaux B k , on obtient B k+1 en<br />
faisant de l’un des B k le premier fils à la racine de l’autre<br />
B k .<br />
Exemples : dessiner B 0 , B 1 , B 2 , B 3 , B 4<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Arbre binomial - Propriétés<br />
Définition – Propriétes<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Arbre binomial - Preuves<br />
Définition – Propriétes<br />
Propriétés de B k , (k ≥ 0)<br />
1 B k a 2 k nœuds<br />
2 B k a 2 k − 1 arêtes<br />
3 B k a hauteur k<br />
4 Le degré à la racine est k<br />
5 Le nombre de nœuds à profondeur i est ( )<br />
k<br />
6 La forêt à la racine de B k est < B k−1 , B k−2 , . . . , B 1 , B 0 ><br />
i<br />
1 n 0 = 1 et n k = 2n k−1<br />
2 arbre : x nœuds ⇒ x − 1 arêtes<br />
3 h 0 = 0 et h k = 1 + h k−1<br />
4 d 0 = 0 et d k = 1 + d k−1<br />
5 n k,0 = 1, n k,l = 0 pour l > k, et n k,i = n k−1,i + n k−1,i−1 ,<br />
pour i = 1, . . . , k<br />
6 propriété de décomposition, par récurrence sur k<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée
File Binomiale<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Définition<br />
Propriétes<br />
Principe de l’union<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Définition<br />
Propriétes<br />
Principe de l’union<br />
Représentation d’une file de priorité<br />
Tournoi Binomial<br />
Un tournoi binomial est un arbre binomial étiqueté croissant<br />
(croissance sur tout chemin de la racine aux feuilles)<br />
File Binomiale<br />
Une file binomiale est une suite de tournois binomiaux de<br />
tailles strictement décroissantes<br />
Exemples :<br />
FB 12 =< TB 3 , TB 2 >,<br />
FB 7 =< TB 2 , TB 1 , TB 0 ><br />
Représentation d’une file de priorité P de n éléments<br />
si n = 2 k , P tournoi binomial<br />
sinon P file binomiale, suite de tournois correspondants<br />
aux bits égaux à 1 dans la représentation binaire de n.<br />
Représentation binaire de n<br />
n =<br />
⌊log 2 n⌋<br />
∑<br />
i=0<br />
b i 2 i , avec b i ∈ {0, 1}, b ⌊log2 n⌋ = 1<br />
ν(n) = ∑ i b i : # bits à 1 dans représentation binaire de n.<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
File binomiale - Propriétes<br />
Définition<br />
Propriétes<br />
Principe de l’union<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Union de files binomiales<br />
Définition<br />
Propriétes<br />
Principe de l’union<br />
Propriétés de FB n<br />
1 FB n a n nœuds<br />
2 FB n a n − ν(n) arêtes<br />
3 Le plus grand arbre de la file est B ⌊log2 n⌋<br />
(hauteur ⌊log 2 n⌋ et nombre de nœuds 2 ⌊log 2 n⌋ )<br />
4 Le nombre d’arbres de la file est ν(n) (avec<br />
ν(n) ≤ 1 + ⌊log 2 n⌋)<br />
5 Le minimum de la file est à la racine de l’un des arbres<br />
1 n = ∑ b i 2 i ,<br />
2 n − ν(n) = ∑ b i (2 i − 1),<br />
1 Union de 2 tournois de tailles différentes :<br />
TB k1 ∪ TB k2 −→ F 2 k1 +2 k2 =< TB k1, TB k2 ><br />
Exemple : TB 1 ∪ TB 2<br />
2 Union de 2 tournois de même taille :<br />
TB k ∪ TB k ′ −→ TB k+1 ,<br />
avec rac(TB k+1 ) = min(rac(TB k ), (rac(TB k ′)))<br />
Exemple : TB 2 ∪ TB ′ 2<br />
3 Union de 2 files binomiales ≡≡ addition binaire<br />
Exemple : FB 5 ∪ FB 7<br />
3 ν(n) = ∑ i b i<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée
Union de deux files<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Définition<br />
Propriétes<br />
Principe de l’union<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Primitives<br />
Algorithme<br />
Complexité<br />
Primitives sur les tournois binomiaux<br />
1 interclasser les 2 files en partant des tournois de poids<br />
minimum<br />
2 lorsque 2 tournois de taille k on engendre un tournoi de<br />
taille k + 1<br />
3 à chaque étape au plus 3 tournois de même taille à<br />
fusionner (1 dans chacune des files + 1 retenue de la<br />
fusion à l’étape précédente)<br />
4 lorsque 3 tournois de taille k on en retient 2 pour<br />
engendrer un tournoi de taille k + 1, et l’on garde le<br />
troisième comme tournoi de taille k.<br />
EstVide : TournoiB → booleen<br />
renvoie vrai ssi le tournoi est vide<br />
Degre : TournoiB → entier<br />
renvoie le dégré du tournoi<br />
UTid : TournoiB * TournoiB → TournoiB<br />
renvoie l’union de 2 tournois de même taille T k ∗ T k ↦→ T k+1<br />
Decapite : TournoiB → FileB<br />
renvoie la file binomiale obtenue en enlèvant la racine du<br />
tournoi T k ↦→< T k−1 , T k−2 , ..., T 1 , T 0 ><br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Primitives<br />
Algorithme<br />
Complexité<br />
Primitives sur les files binomiales<br />
Algorithme d’Union<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Primitives<br />
Algorithme<br />
Complexité<br />
EstVide : FileB → booleen<br />
renvoie vrai ssi la file est vide<br />
Min : FileB → TournoiB<br />
renvoie le tournoi de poids minimal de la file<br />
Reste : FileB → FileB<br />
renvoie la file privée de son tournoi de poids minimal<br />
AjoutMin : TournoiB * FileB → FileB<br />
hypothèse : le tournoi est de poids inférieur au Min de la file<br />
renvoie la file obtenue en ajoutant le tournoi comme<br />
tournoi de poids minimal de la file initiale<br />
UnionFile : FileB * FileB −→ FileB<br />
renvoie la file binomiale union des deux files F1 et F2<br />
Fonction UnionFile(F1, F2)<br />
Retourne UFret(F1, F2, Ø)<br />
FinFonction UnionFile<br />
UFret : FileB * FileB * TournoiB −→ FileB<br />
renvoie la file binomiale union de deux files et d’un tournoi<br />
Fonction UFret(F1, F2, T)<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Primitives<br />
Algorithme<br />
Complexité<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Primitives<br />
Algorithme<br />
Complexité<br />
Fonction UFret(F1, F2, T)<br />
Si EstVide(T) ; pas de tournoi en retenue<br />
Si EstVide(F1) Retourne F2<br />
Si EstVide(F2) Retourne F1<br />
Soient T1=Min(F1) et T2=Min(F2) ;tournois poids min<br />
Si Degre(T1)
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Ajout d’un élément x à une file FB n<br />
Construction<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Algorithme :<br />
Créer une file binomiale FB 1 contenant uniquement x.<br />
Puis faire l’union de FB 1 et FB n<br />
Complexité : ν(n) + 1 − ν(n + 1) −→ entre 0 et ν(n)<br />
Exemples :<br />
FB 1 ∪ FB 8<br />
FB 1 ∪ FB 7<br />
<strong>Algorithmique</strong> Avancée<br />
Complexité de la construction d’une file binomiale par<br />
adjonctions successives de ses n éléments.<br />
#cp(FB n ) = ν(n − 1) + 1 − ν(n)<br />
+ ν(n − 2) + 1 − ν(n − 1)<br />
+ . . .<br />
+ ν(1) + 1 − ν(2)<br />
= n − ν(n)<br />
Donc le nombre moyen de comparaisons pour 1 ajout est<br />
1 − ν(n)/n < 1.<br />
Coût amorti d’une opération dans une série d’opérations :<br />
couttotal/nbreop<br />
<strong>Algorithmique</strong> Avancée<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Suppression du minimum de FB n<br />
Diminuer une clé<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Recherche du minimum<br />
Le minimum de la file est à la racine d’un des tournois la<br />
composant<br />
−→ ν(n) − 1 comparaisons = O(log n)<br />
Suppression du minimum<br />
Déterminer l’arbre B k de racine minimale<br />
Supprimer la racine de B k −→ File < B k−1 , . . . , B 0 ><br />
Faire l’union des files FB n − B k et < B k−1 , . . . , B 0 ><br />
N.B. Accès direct au nœud dont il faut diminuer la clé<br />
modifier la clé<br />
échanger le nœud avec son père jusqu’à vérifier<br />
l’hypothèse de croissance (≡ tas)<br />
Le nombre maximum de comparaisons est la hauteur de l’arbre<br />
( O(log n))<br />
Complexité : O(log n)<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée
Coût amorti<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Coût amorti<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Files Binomiales :<br />
ajout d’un élément et recherche du minimum en O(1)<br />
suppression du minimum et union de 2 files en O(log n)<br />
Files de Fibonacci :<br />
ajout d’un élément et union de 2 files en O(1)<br />
suppression du minimum en O(log n)<br />
Remarque : on ne peut pas espérer avoir O(1) pour ajout et<br />
suppression du minimum, car alors on serait en contradiction<br />
avec les résultats de borne inférieure en O(n log n) pour le tri<br />
par comparaisons.<br />
<strong>Algorithmique</strong> Avancée<br />
Définition<br />
Coût amorti d’une opération dans une suite d’opérations<br />
= coût moyen d’une opération dans le pire cas.<br />
coût amorti = coût total / nombre d’opérations<br />
Méthodes<br />
méthode par agrégat<br />
méthode du potentiel<br />
autres...<br />
<strong>Algorithmique</strong> Avancée<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Coût amorti : méthode par agrégat<br />
Files de Priorités<br />
Arbres binômiaux<br />
Files binomiales<br />
Algorithme d’union<br />
Autres opérations<br />
Ajout<br />
Construction<br />
Suppression min<br />
Diminution<br />
Coût amorti<br />
Coût amorti : méthode du potentiel<br />
Principe : majorer le coût total d’une suite de n opérations<br />
et diviser par n.<br />
Exemple : opérations sur les piles<br />
empiler(S,x)<br />
dépiler(S)<br />
multidépiler(S,k)<br />
Coût amorti de chaque opération en O(1).<br />
Principe :<br />
structure de données D i ,<br />
fonction potentiel Φ vérifiant Φ(D i ) ≥ Φ(D 0 )<br />
coût amorti de la i-ème opération :<br />
ĉ i = c i + Φ(D i ) − Φ(D i−1 )<br />
(c i coût réel de la i-ème opération)<br />
n∑<br />
coût amorti = ĉ i /n<br />
i=1<br />
Exemple : opérations sur les piles<br />
Φ(D i ) = nombre d’objets de D i<br />
coût amorti de chaque opération en O(1)<br />
<strong>Algorithmique</strong> Avancée<br />
<strong>Algorithmique</strong> Avancée