17.04.2015 Views

Algorithmique Avancée - Master informatique

Algorithmique Avancée - Master informatique

Algorithmique Avancée - Master informatique

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!