Algorithmes de Complexité et Problèmes NP
Algorithmes de Complexité et Problèmes NP
2 / 174
Question d’un entretien d’embauche chez Google
7
4
5
4 4
3
2 2
1
2 / 174
Question d’un entretien d’embauche chez Google
7
4
5
4 4
3
2 2
1
Soit un histogramme avec n barres sur lequel on a versé un volume d’eau infini.
2 / 174
Question d’un entretien d’embauche chez Google
7
4
5
4 4
3
2 2
1
Soit un histogramme avec n barres sur lequel on a versé un volume d’eau infini.
2 / 174
Question d’un entretien d’embauche chez Google
7
4
5
4 4
3
2 2
1
Soit un histogramme avec n barres sur lequel on a versé un volume d’eau infini.
2 / 174
Trois problèmes de pavage
3 / 174
Trois problèmes de pavage
Problème 1 : (Tetris)
Etant donné une position de Tetris et la liste des pièces à venir, est-ce qu’il
est possible de vider l’écran ?
3 / 174
Trois problèmes de pavage
Problème 1 : (Tetris)
Etant donné une position
Problème de Tetris et la listeendes
2 : (Portrait pièces à venir, est-ce qu’il
dominos)
est possible de vider l’écran ?
Etant donné n jeux de dominos et une image, quel est le pavage qui
reproduit l’image au mieux ?
3 / 174
Trois problèmes de pavage
Problème 1 : (Tetris)
Etant donné une position
Problème de Tetris et la listeendes
2 : (Portrait pièces à venir, est-ce qu’il
dominos)
est possible de vider l’écran ?
Etant donné n jeuxProblème
de dominos3 et une image,de
: (Dominos quel est le pavage qui
Wang)
reproduit l’image au mieux ?
Etant donné un ensemble fini de dominos de Wang, est-ce qu’il existe un
pavage du plan avec ces dominos ?
3 / 174
Trois problèmes de pavage
Problème 1 : (Tetris)
Etant donné une position
Problème de Tetris et la listeendes
2 : (Portrait pièces à venir, est-ce qu’il
dominos)
est possible de vider l’écran ?
Etant donné n jeuxProblème
de dominos3 et une image,de
: (Dominos quel est le pavage qui
Wang)
reproduit l’image au mieux ?
Etant donné un ensemble fini de dominos de Wang, est-ce qu’il existe un
pavage du plan avec ces dominos ?
3 / 174
Calculabilité et complexité des problèmes
4 / 174
Calculabilité et complexité des problèmes
4 / 174
Calculabilité et complexité des problèmes
4 / 174
Calculabilité et complexité des problèmes
4 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
5 / 174
Vaincre la Combinatoire : Algo. ou Matériel ?
6 / 174
Plan
2 Analyse Asymptotique
3 Algorithmes Récursifs
4 Programmation Dynamique
5 Algorithmes gloutons
7 Classes de Complexité
7 / 174
Informations Pratiques
Nos coordonnées :
I Emmanuel Hebrard Mohamed Siala
I Mail : [email protected] [email protected]
I Page du cours : http://homepages.laas.fr/ehebrard/teaching.html
I Volume (prévu) :
F CM : 8 séance d’1h15
F TD : 9 séance d’1h15 (3 groupes : Marie-José Huguet, Mohamed Siala)
Évaluation :
I 1 examen à la fin du cours
F Tous les documents autorisés
8 / 174
Supports de cours
9 / 174
Supports de cours
9 / 174
Supports de cours
9 / 174
Introduction à la Complexité
des Algorithmes
Problème : “Étant donné un ensemble de villes, quel est le plus court chemin passant
une fois par chaque ville ?”
Problème : “Étant donné un ensemble de villes, quel est le plus court chemin passant
une fois par chaque ville ?”
Problème : “Étant donné un ensemble de villes, quel est le plus court chemin passant
une fois par chaque ville ?”
Un algorithme est une méthode pour calculer la solution Q(x) d’un problème, pour
toute valeur de la donnée x
Un algorithme est une méthode pour calculer la solution Q(x) d’un problème, pour
toute valeur de la donnée x
Un algorithme est une méthode pour calculer la solution Q(x) d’un problème, pour
toute valeur de la donnée x
Invariant de boucle
Initialisation : L’invariant est vrai avant la première itération de la boucle.
Conservation : Si l’invariant est vrai avant une itération de la boucle, il le reste avant
l’itération suivante a .
Terminaison : Une fois la boucle terminée, l’invariant implique que la solution est
correcte.
a. Avant une itération veut dire avant de faire le test de la boucle
Invariant de boucle
Initialisation : L’invariant est vrai avant la première itération de la boucle.
Conservation : Si l’invariant est vrai avant une itération de la boucle, il le reste avant
l’itération suivante a .
Terminaison : Une fois la boucle terminée, l’invariant implique que la solution est
correcte.
a. Avant une itération veut dire avant de faire le test de la boucle
Algorithme : TriSélection
Données : tableau L de n éléments comparables
Résultat : le tableau trié
1 pour i allant de 1 à n faire
2 m ← i;
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Algorithme : TriSélection
Données : tableau L de n éléments comparables
Résultat : le tableau trié i =1 29 30 17 9 0 24
1 pour i allant de 1 à n faire
2 m ← i;
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Algorithme : TriSélection
Données : tableau L de n éléments comparables
Résultat : le tableau trié i =1 29 30 17 9 0 24
1 pour i allant de 1 à n faire
i =2 0 30 17 9 29 24
2 m ← i;
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Algorithme : TriSélection
Données : tableau L de n éléments comparables
Résultat : le tableau trié i =1 29 30 17 9 0 24
1 pour i allant de 1 à n faire
i =2 0 30 17 9 29 24
2 m ← i;
3 pour j allant de i + 1 à n faire i =3 0 9 17 30 29 24
4 si L[j] < L[m] alors
5 m ← j;
Algorithme : TriSélection
Données : tableau L de n éléments comparables
Résultat : le tableau trié i =1 29 30 17 9 0 24
1 pour i allant de 1 à n faire
i =2 0 30 17 9 29 24
2 m ← i;
3 pour j allant de i + 1 à n faire i =3 0 9 17 30 29 24
4 si L[j] < L[m] alors
5 m ← j; i =4 0 9 17 30 29 24
Algorithme : TriSélection
Données : tableau L de n éléments comparables
Résultat : le tableau trié i =1 29 30 17 9 0 24
1 pour i allant de 1 à n faire
i =2 0 30 17 9 29 24
2 m ← i;
3 pour j allant de i + 1 à n faire i =3 0 9 17 30 29 24
4 si L[j] < L[m] alors
5 m ← j; i =4 0 9 17 30 29 24
7 retourner L;
TriSélection termine ?
I 2ème boucle : n est constant, j est strictement croissant et la boucle se termine pour j > n
I 1ère boucle : n est constant, i est strictement croissant, la boucle se termine pour i > n,
et la 2ème boucle termine
I 2ème boucle : n est constant, j est strictement croissant et la boucle se termine pour j > n
I 1ère boucle : n est constant, i est strictement croissant, la boucle se termine pour i > n,
et la 2ème boucle termine
I 2ème boucle : n est constant, j est strictement croissant et la boucle se termine pour j > n
I 1ère boucle : n est constant, i est strictement croissant, la boucle se termine pour i > n,
et la 2ème boucle termine
Algorithme : TriSélection
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
1 pour i allant de 1 à n faire
2 m ← i;
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Invariants :
Algorithme : TriSélection
Au début de l’itération i :
Données : tableau L de n éléments
(a) i − 1 1ers éléments triés
comparables
Résultat : le tableau trié (b) i − 1 1ers éléments minimums
1 pour i allant de 1 à n faire
2 m ← i; i =1 29 30 17 9 0 24
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Invariants :
Algorithme : TriSélection
Au début de l’itération i :
Données : tableau L de n éléments
(a) i − 1 1ers éléments triés
comparables
Résultat : le tableau trié (b) i − 1 1ers éléments minimums
1 pour i allant de 1 à n faire
2 m ← i; i =1 29 30 17 9 0 24
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors i =2 0 30 17 9 29 24
|{z}
5 m ← j; trié
Invariants :
Algorithme : TriSélection
Au début de l’itération i :
Données : tableau L de n éléments
(a) i − 1 1ers éléments triés
comparables
Résultat : le tableau trié (b) i − 1 1ers éléments minimums
1 pour i allant de 1 à n faire
2 m ← i; i =1 29 30 17 9 0 24
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors i =2 0 30 17 9 29 24
|{z}
5 m ← j; trié
i =3 0 9 17 30 29 24
| {z }
6 échanger L[i] et L[m]; trié
7 retourner L;
Invariants :
Algorithme : TriSélection
Au début de l’itération i :
Données : tableau L de n éléments
(a) i − 1 1ers éléments triés
comparables
Résultat : le tableau trié (b) i − 1 1ers éléments minimums
1 pour i allant de 1 à n faire
2 m ← i; i =1 29 30 17 9 0 24
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors i =2 0 30 17 9 29 24
|{z}
5 m ← j; trié
i =3 0 9 17 30 29 24
| {z }
6 échanger L[i] et L[m]; trié
i =4 0 9 17 30 29 24
retourner L;
| {z }
7
trié
Invariants :
Algorithme : TriSélection
Au début de l’itération i :
Données : tableau L de n éléments
(a) i − 1 1ers éléments triés
comparables
Résultat : le tableau trié (b) i − 1 1ers éléments minimums
1 pour i allant de 1 à n faire
2 m ← i; i =1 29 30 17 9 0 24
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors i =2 0 30 17 9 29 24
|{z}
5 m ← j; trié
i =3 0 9 17 30 29 24
| {z }
6 échanger L[i] et L[m]; trié
i =4 0 9 17 30 29 24
retourner L;
| {z }
7
trié
i =5 0 9 17 24 29 30
| {z }
trié
Preuve
Initialisation : tri é(i) et mins(i) sont vrais lors de la première itération de la boucle
car pour i = 1 la liste des i − 1 premiers éléments est vide
Conservation : Supposons que les invariants soient vrais à l’itération i. On montre
qu’ils sont vrais à l’itération i + 1 :
I Les i − 1 premiers éléments du tableau L ne changent pas (le seul changement est à la
ligne 6 et m ≥ i). Donc tri é(i) et mins(i) impliquent tri é(i + 1).
I A la ligne 6, L[m] est le plus petit élément parmi L[i], . . . , L[n] a , et il et échangé avec L[i].
Donc mins(i) implique mins(i + 1).
XKCD https://xkcd.com/
XKCD https://xkcd.com/
XKCD https://xkcd.com/
XKCD https://xkcd.com/
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Le temps d’exécution
Le temps d’exécution est la durée (en secondes, minutes, etc.) nécessaire
au programme pour s’éxecuter.
Opération élémentaire
Une opération élementaire est une opération qui prend un temps constant
Même temps d’exécution quelque soit la donnée
Opération élémentaire
Une opération élementaire est une opération qui prend un temps constant
Même temps d’exécution quelque soit la donnée
Opération élémentaire
Une opération élementaire est une opération qui prend un temps constant
Même temps d’exécution quelque soit la donnée
Algorithme : Factorielle
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact ← 1;
2 pour i allant de 2 à n faire
3 fact ← fact ∗ i;
4 retourner fact;
Algorithme : Factorielle
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact ← 1; initialisation : 1× 1 op.
2 pour i allant de 2 à n faire
3 fact ← fact ∗ i;
4 retourner fact;
Algorithme : Factorielle
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact ← 1; initialisation : 1× 1 op.
2 pour i allant de 2 à n faire itérations : n× 1 op.
3 fact ← fact ∗ i;
4 retourner fact;
Algorithme : Factorielle
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact ← 1; initialisation : 1× 1 op.
2 pour i allant de 2 à n faire itérations : n× 1 op.
3 fact ← fact ∗ i; mult. + affect. : (n − 1)× 2 op.
4 retourner fact;
Algorithme : Factorielle
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact ← 1; initialisation : 1× 1 op.
2 pour i allant de 2 à n faire itérations : n× 1 op.
3 fact ← fact ∗ i; mult. + affect. : (n − 1)× 2 op.
4 retourner fact; retour fonction : 1× 1 op.
Algorithme : Factorielle
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact ← 1; initialisation : 1× 1 op.
2 pour i allant de 2 à n faire itérations : n× 1 op.
3 fact ← fact ∗ i; mult. + affect. : (n − 1)× 2 op.
4 retourner fact; retour fonction : 1× 1 op.
1 + n + (n − 1) ∗ 2 + 1 = 3n
Algorithme : TriSélection
nombre coût
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
1 pour i allant de 1 à n faire
2 m ← i;
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Algorithme : TriSélection
nombre coût
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
itérations : n× 1 op.
1 pour i allant de 1 à n faire
affectation : n× 1 op.
2 m ← i;
3 pour j allant de i + 1 à n faire
4 si L[j] < L[m] alors
5 m ← j;
Algorithme : TriSélection
nombre coût
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
itérations : n× 1 op.
1 pour i allant de 1 à n faire
affectation : n× 1 op.
2 m ← i; P n
3 pour j allant de i + 1 à n faire
itérations : Pni=1 (n−i −1)× 1 op.
4 si L[j] < L[m] alors
comparaison : i=1 (n−i −1)× 1 op.
5 m ← j;
Algorithme : TriSélection
nombre coût
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
itérations : n× 1 op.
1 pour i allant de 1 à n faire
affectation : n× 1 op.
2 m ← i; P n
3 pour j allant de i + 1 à n faire
itérations : Pni=1 (n−i −1)× 1 op.
4 si L[j] < L[m] alors
comparaison : i=1 (n−i −1)× 1 op.
affectation : n×?× 1 op.
5 m ← j;
Algorithme : TriSélection
nombre coût
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
itérations : n× 1 op.
1 pour i allant de 1 à n faire
affectation : n× 1 op.
2 m ← i; P n
3 pour j allant de i + 1 à n faire
itérations : Pni=1 (n−i −1)× 1 op.
4 si L[j] < L[m] alors
comparaison : i=1 (n−i −1)× 1 op.
affectation : n×?× 1 op.
5 m ← j;
Algorithme : TriSélection
nombre coût
Données : tableau L de n éléments
comparables
Résultat : le tableau trié
itérations : n× 1 op.
1 pour i allant de 1 à n faire
affectation : n× 1 op.
2 m ← i; P n
3 pour j allant de i + 1 à n faire
itérations : Pni=1 (n−i −1)× 1 op.
4 si L[j] < L[m] alors
comparaison : i=1 (n−i −1)× 1 op.
affectation : n×?× 1 op.
5 m ← j;
Quel paramètre choisir ? Est-il possible de comparer des algorithmes pour des
problèmes distincts ?
I On calcule la complexité en fonction de la taille de la donnée : |x| est le nombre de
bits de la représentation en mémoire de la donnée x
Quel paramètre choisir ? Est-il possible de comparer des algorithmes pour des
problèmes distincts ?
I On calcule la complexité en fonction de la taille de la donnée : |x| est le nombre de
bits de la représentation en mémoire de la donnée x
Complexité en moyenne
Besoin d’une probabilité P() pour toutes les données de tailles n
X
MoyA (|x|) = P(x) · CoûtA (x)
x de taille |x|
Algorithme : RechercheElmt
Données : un entier e et un tableau L
contenant e
Résultat : l’indice i t.q. L[i] = e
i ←0;
tant que L[i] 6= e faire
i ← i + 1;
retourner i;
Algorithme : RechercheElmt
Données : un entier e et un tableau L
contenant e
Résultat : l’indice i t.q. L[i] = e
i : entier;
début
i ←0;
tant que L[i] 6= e faire
i ← i + 1;
retourner i;
n+1
moyenne : 2
n+1
moyenne : 2
n+1
moyenne : 2
n+1
moyenne : 2
Impossible à quantifier !
Impossible à quantifier !
Impossible à quantifier !
InfTriSélection (n) ' MoyTriSélection (n) ' SupTriSélection (n) ' cn2
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Résultat : le tableau trié entre les indices s et e
1 Procedure TriRapide(L, s, e)
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i, j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i, j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 29 30 17 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 30 29 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 30 29 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 30 29 9 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 9 29 30 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 9 29 30 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 9 29 30 0 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 9 0 30 29 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1);
5 TriRapide(L, p + 1, e); 17 9 0 30 29 24 pivot
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1); pivot
5 TriRapide(L, p + 1, e); 17 9 0 24 29 30
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1); pivot
5 TriRapide(L, p + 1, e); 17 9 0 24 29 30
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s;
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; i j
13 échanger L[i] avec L[e];
14 retourner i;
Algorithme : TriRapide
Données : tableau L d’elts comparables, entiers s, e
Invariants
Résultat : le tableau trié entre les indices s et e I L[0], . . . , L[i − 1] < pivot
1 Procedure TriRapide(L, s, e) I L[i], . . . , L[j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(L, s, e);
4 TriRapide(L, s, p − 1); pivot
5 TriRapide(L, p + 1, e); 17 9 0 24 29 30
6 Procedure Partition(L, s, e)
7 pivot ← L[e];
8 i ← s; 17 9 0 29 30
9 pour j allant de s à e − 1 faire
10 si L[j] < pivot alors
11 échanger L[i] avec L[j];
12 i ← i + 1; 9 17 29
13 échanger L[i] avec L[e];
14 retourner i;
9
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors
p ← Partition(L, s, e);
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e);
Procedure Partition(L, s, e)
pivot ← L[e];
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e) Opération caractéristique
si s < e alors
p ← Partition(L, s, e); Ici on compte le nombre de
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e);
comparaisons, égal au nombre total
d’opérations, à une constante près.
Procedure Partition(L, s, e)
pivot ← L[e];
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e) Opération caractéristique
si s < e alors
p ← Partition(L, s, e); Ici on compte le nombre de
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e);
comparaisons, égal au nombre total
d’opérations, à une constante près.
Procedure Partition(L, s, e)
pivot ← L[e];
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j]; TriRapide fait un nombre constant (disons c1 )
i ← i + 1; d’opérations pour chaque comparaison
I Au plus un échange et entre 1 et 2
échanger L[i] avec L[e]; incrémentation(s)
retourner i;
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors
p ← Partition(L, s, e);
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e);
Procedure Partition(L, s, e)
pivot ← L[e];
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors Pire des cas : les éléments sont déja triés !
p ← Partition(L, s, e);
TriRapide(L, s, p − 1); Le pivot est comparé aux n − 1 éléments et
TriRapide(L, p + 1, e); reste en dernière position
Procedure Partition(L, s, e)
pivot ← L[e];
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors Pire des cas : les éléments sont déja triés !
p ← Partition(L, s, e);
TriRapide(L, s, p − 1); Le pivot est comparé aux n − 1 éléments et
TriRapide(L, p + 1, e); reste en dernière position
Partition retourne toujours e
Procedure Partition(L, s, e)
pivot ← L[e]; I Partition (L, 1, n),Partition (L, 1, n − 1),. . .
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors Pire des cas : les éléments sont déja triés !
p ← Partition(L, s, e);
TriRapide(L, s, p − 1); Le pivot est comparé aux n − 1 éléments et
TriRapide(L, p + 1, e); reste en dernière position
Partition retourne toujours e
Procedure Partition(L, s, e)
pivot ← L[e]; I Partition (L, 1, n),Partition (L, 1, n − 1),. . .
i ← s;
pour j allant de s à e − 1 faire Nombre total de comparaisons :
si L[j] < pivot alors n
X
échanger L[i] avec L[j]; (n − i)
i ← i + 1; i=1
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors Pire des cas : les éléments sont déja triés !
p ← Partition(L, s, e);
TriRapide(L, s, p − 1); Le pivot est comparé aux n − 1 éléments et
TriRapide(L, p + 1, e); reste en dernière position
Partition retourne toujours e
Procedure Partition(L, s, e)
pivot ← L[e]; I Partition (L, 1, n),Partition (L, 1, n − 1),. . .
i ← s;
pour j allant de s à e − 1 faire Nombre total de comparaisons :
si L[j] < pivot alors n
X n
X
échanger L[i] avec L[j]; (n − i) = n2 − i
i ← i + 1; i=1 i=1
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors Pire des cas : les éléments sont déja triés !
p ← Partition(L, s, e);
TriRapide(L, s, p − 1); Le pivot est comparé aux n − 1 éléments et
TriRapide(L, p + 1, e); reste en dernière position
Partition retourne toujours e
Procedure Partition(L, s, e)
pivot ← L[e]; I Partition (L, 1, n),Partition (L, 1, n − 1),. . .
i ← s;
pour j allant de s à e − 1 faire Nombre total de comparaisons :
si L[j] < pivot alors n
X n
X
échanger L[i] avec L[j]; (n − i) = n2 − i = n(n − 1)/2
i ← i + 1; i=1 i=1
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors
p ← Partition(L, s, e);
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e);
Procedure Partition(L, s, e)
pivot ← L[e];
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors
p ← Partition(L, s, e);
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e); Deux éléments sont comparés une fois au plus
Procedure Partition(L, s, e) I Si deux éléments sont comparés, un des deux est
pivot ← L[e]; un pivot, et ils seront séparés
i ← s;
pour j allant de s à e − 1 faire
si L[j] < pivot alors
échanger L[i] avec L[j];
i ← i + 1;
Algorithme : TriRapide
Procedure TriRapide(L, s, e)
si s < e alors
p ← Partition(L, s, e);
TriRapide(L, s, p − 1);
TriRapide(L, p + 1, e); Deux éléments sont comparés une fois au plus
Procedure Partition(L, s, e) I Si deux éléments sont comparés, un des deux est
pivot ← L[e]; un pivot, et ils seront séparés
i ← s;
pour j allant de s à e − 1 faire On calcule l’espérance E du nombre total de
si L[j] < pivot alors comparaisons
échanger L[i] avec L[j];
i ← i + 1;
z1 z2 z3 z4 z5 z6 z7 z8 z9
z1 z2 z3 z4 z5 z6 z7 z8 z9
z1 z2 z3 z4 z5 z6 z7 z8 z9
zi et zj sont comparés ssi un des deux est le premier pivot parmi zi , zi+1 , . . . , zj
I sinon, le pivot zk sépare zi < zk et zj > zk !
z1 z2 z3 z4 z5 z6 z7 z8 z9
zi et zj sont comparés ssi un des deux est le premier pivot parmi zi , zi+1 , . . . , zj
I sinon, le pivot zk sépare zi < zk et zj > zk !
z1 z2 z3 z4 z5 z6 z7 z8 z9
zi et zj sont comparés ssi un des deux est le premier pivot parmi zi , zi+1 , . . . , zj
I sinon, le pivot zk sépare zi < zk et zj > zk !
z1 z2 z3 z4 z5 z6 z7 z8 z9
zi et zj sont comparés ssi un des deux est le premier pivot parmi zi , zi+1 , . . . , zj
I sinon, le pivot zk sépare zi < zk et zj > zk !
z1 z2 z3 z4 z5 z6 z7 z8 z9
zi et zj sont comparés ssi un des deux est le premier pivot parmi zi , zi+1 , . . . , zj
I sinon, le pivot zk sépare zi < zk et zj > zk !
https://www.youtube.com/watch?v=ZZuD6iUe3Pc
Introduction à la Complexité des Algorithmes 33 / 174
Résumons
TriSélection TriRapide
Sup(n) c1 n 2 c2 n 2
https://www.youtube.com/watch?v=ZZuD6iUe3Pc
Introduction à la Complexité des Algorithmes 33 / 174
Résumons
TriSélection TriRapide
Sup(n) c1 n 2 c2 n 2
Moy(n) c3 n 2 c4 n ln n
https://www.youtube.com/watch?v=ZZuD6iUe3Pc
Introduction à la Complexité des Algorithmes 33 / 174
Résumons
TriSélection TriRapide
Sup(n) c1 n 2 c2 n 2
Moy(n) c3 n 2 c4 n ln n
Soient :
I T s (n) le temps effectif de calcul pour TriSélection de n éléments, ' Moys (n) = c3 n2
I T r (n) le temps effectif de calcul pour TriRapide de n éléments, ' Moyr (n) = c4 n ln n
https://www.youtube.com/watch?v=ZZuD6iUe3Pc
Introduction à la Complexité des Algorithmes 33 / 174
Résumons
TriSélection TriRapide
Sup(n) c1 n 2 c2 n 2
Moy(n) c3 n 2 c4 n ln n
Soient :
I T s (n) le temps effectif de calcul pour TriSélection de n éléments, ' Moys (n) = c3 n2
I T r (n) le temps effectif de calcul pour TriRapide de n éléments, ' Moyr (n) = c4 n ln n
Expérience : essayons pour n = 100000 et estimons n = 300000
T s (100000) T r (100000)
c3 = c4 =
1000002 100000 ln 100000
https://www.youtube.com/watch?v=ZZuD6iUe3Pc
Introduction à la Complexité des Algorithmes 33 / 174
Résumons
TriSélection TriRapide
Sup(n) c1 n 2 c2 n 2
Moy(n) c3 n 2 c4 n ln n
Soient :
I T s (n) le temps effectif de calcul pour TriSélection de n éléments, ' Moys (n) = c3 n2
I T r (n) le temps effectif de calcul pour TriRapide de n éléments, ' Moyr (n) = c4 n ln n
Expérience : essayons pour n = 100000 et estimons n = 300000
T s (100000) T r (100000)
c3 = c4 =
1000002 100000 ln 100000
et donc (pour T s (100000) = 1.65 et T r (100000) = .006) :
T s (100000) 2
T s (n) = n pour n = 300000 : ' 14.67
1000002
T r (100000)
T r (n) = n ln n pour n = 300000 : ' 0.019
100000 ln 100000
https://www.youtube.com/watch?v=ZZuD6iUe3Pc
Introduction à la Complexité des Algorithmes 33 / 174
Analyse Asymptotique
Les calculs à effectuer pour évaluer le temps d’exécution d’un algorithme peuvent
parfois être longs et pénibles ;
Les calculs à effectuer pour évaluer le temps d’exécution d’un algorithme peuvent
parfois être longs et pénibles ;
Les calculs à effectuer pour évaluer le temps d’exécution d’un algorithme peuvent
parfois être longs et pénibles ;
Les calculs à effectuer pour évaluer le temps d’exécution d’un algorithme peuvent
parfois être longs et pénibles ;
Les calculs à effectuer pour évaluer le temps d’exécution d’un algorithme peuvent
parfois être longs et pénibles ;
On aura donc recours à une approximation de ce temps de calcul, représentée par les
notations O, Ω et Θ
Les calculs à effectuer pour évaluer le temps d’exécution d’un algorithme peuvent
parfois être longs et pénibles ;
On aura donc recours à une approximation de ce temps de calcul, représentée par les
notations O, Ω et Θ
Hypothèse simplificatrice
On ne s’intéresse qu’aux fonctions asymptotiquement positives
(positives pour tout n ≥ n0 )
Arbitre 6 × 52 + 2 × 5 − 8 > 6 × 52
c × g (n)
f ∈ O(g )
f 0 ∈ O(g )
n0 n
Borne inférieure : f (n) ∈ Ω(g (n)) s’il existe un seuil à partir duquel f (n)
est supérieure à g (n), à une constante multiplicative près ;
Borne inférieure : f (n) ∈ Ω(g (n)) s’il existe un seuil à partir duquel f (n)
est supérieure à g (n), à une constante multiplicative près ;
Exemple : g (n) ∈ Ω(f (n))
Borne supérieure et inférieure : Θ(g (n)) = Ω(g (n)) ∩ O(g (n)) ; f (n)
est en Θ(g (n)) si elle est prise en sandwich entre c1 g (n) et
c2 g (n) ;
c2 × g (n)
f ∈ Θ(g )
c1 × g (n)
k n
Exemple
Soit g (n) = 4n3 − 5n2 + 2n + 3 ;
1 on ne retient que le terme de plus haut degré : 4n3 (pour n assez grand le terme en
n3 “domine” les autres, en choisissant bien c1 , c2 , on peut avoir c1 n3 ≤ g (n) ≤ c2 n3 )
2 on supprime les constantes multiplicatives : n3 (on peut la choisir !)
et on a donc g (n) ∈ Θ(n3 )
5n3 + 3n + 7 ∈ O(n3 ) ?
5n3 + 3n + 7 ∈ Θ(n3 ) ?
5n3 + 3n + 7 ∈ O(n4 ) ?
5n3 + 3n + 7 ∈ Θ(n4 ) ?
log n ∈ O(n) ?
log n ∈ Θ(n) ?
2n n2
n log n
n
log n
n
f (n)
Si limn→∞ g (n)
= c > 0 (constante) alors f ∈ Θ(g ) (et donc g ∈ Θ(f ))
f (n)
Si limn→∞ g (n)
= c > 0 (constante) alors f ∈ Θ(g ) (et donc g ∈ Θ(f ))
Si limn→∞ gf (n)
(n)
= 0 alors f ∈ O(g ) et f ∈
/ Ω(g )
f (n)
Si limn→∞ g (n)
= c > 0 (constante) alors f ∈ Θ(g ) (et donc g ∈ Θ(f ))
Si limn→∞ gf (n)
(n)
= 0 alors f ∈ O(g ) et f ∈
/ Ω(g )
f (n)
Si limn→∞ g (n)
= ∞ alors f ∈ Ω(g ) et f ∈
/ O(g )
f (n)
Si limn→∞ g (n)
= c > 0 (constante) alors f ∈ Θ(g ) (et donc g ∈ Θ(f ))
Si limn→∞ gf (n)
(n)
= 0 alors f ∈ O(g ) et f ∈
/ Ω(g )
f (n)
Si limn→∞ g (n)
= ∞ alors f ∈ Ω(g ) et f ∈
/ O(g )
Règle de l’Hôpital
f et g deux fonctions dérivables t.q. lim f (n) = lim g (n) = ∞, alors :
n→∞ n→∞
f (n) f 0 (n)
lim = lim 0 si cette limite existe.
n→∞ g (n) n→∞ (n)
g
Exemple
si <condition> alors
#instructions (1);
sinon
#instructions (2);
Exemple
Exemple
Exemple
Exemple
si <condition> alors Θ(g (n))
#instructions (1); Θ(f1 (n))
= Θ(g (n) + f1 (n) + f2 (n))
sinon
#instructions (2); Θ(f2 (n))
Exemple
en supposant qu’on a Θ(h(n)) itérations
tant que <condition> faire
Θ(g (n))
#instructions ; = Θ(h(n) × (g (n) + f (n)))
Θ(f (n))
Exemple
Algorithme : Factorielle(n)
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact, i : entier;
2 début
3 fact ← 2;
4 pour i allant de 3 à n faire
5 fact ← fact ∗ i;
6 retourner fact;
Algorithme : Factorielle(n)
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact, i : entier;
2 début
3 fact ← 2; initialisation : Θ(1)× Θ(1)
4 pour i allant de 3 à n faire
5 fact ← fact ∗ i;
6 retourner fact;
Algorithme : Factorielle(n)
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact, i : entier;
2 début
3 fact ← 2; initialisation : Θ(1)× Θ(1)
4 pour i allant de 3 à n faire itérations : Θ(n)× Θ(1)
5 fact ← fact ∗ i;
6 retourner fact;
Algorithme : Factorielle(n)
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact, i : entier;
2 début
3 fact ← 2; initialisation : Θ(1)× Θ(1)
4 pour i allant de 3 à n faire itérations : Θ(n)× Θ(1)
5 fact ← fact ∗ i; mult. + affect. : Θ(n)× Θ(1)
6 retourner fact;
Algorithme : Factorielle(n)
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact, i : entier;
2 début
3 fact ← 2; initialisation : Θ(1)× Θ(1)
4 pour i allant de 3 à n faire itérations : Θ(n)× Θ(1)
5 fact ← fact ∗ i; mult. + affect. : Θ(n)× Θ(1)
6 retourner fact; retour fonction : Θ(1)× Θ(1)
Algorithme : Factorielle(n)
nombre coût
Données : un entier n
Résultat : un entier valant n!
1 fact, i : entier;
2 début
3 fact ← 2; initialisation : Θ(1)× Θ(1)
4 pour i allant de 3 à n faire itérations : Θ(n)× Θ(1)
5 fact ← fact ∗ i; mult. + affect. : Θ(n)× Θ(1)
6 retourner fact; retour fonction : Θ(1)× Θ(1)
Séries arithmétiques
n n
X X 1
(n − i − 1) = n2 − n − i = n2 − n − (1 + 2 + 3 + · · · + n) = n2 − n − n(n + 1)
i=1 i=1
2
Séries arithmétiques
n n
X X 1
(n − i − 1) = n2 − n − i = n2 − n − (1 + 2 + 3 + · · · + n) = n2 − n − n(n + 1)
i=1 i=1
2
L’approche “force brute” est une méthode de conception d’algorithmes qui se base
simplement sur une énumération exhaustive de toutes les configurations possibles de
la solution recherchée
L’approche “force brute” est une méthode de conception d’algorithmes qui se base
simplement sur une énumération exhaustive de toutes les configurations possibles de
la solution recherchée
Cette méthode est souvent inefficace car elle se repose sur l’énumération complète
d’un espace de recherche
“Diviser pour régner” est une méthode de conception d’algorithmes qui se base sur
une “conception par décomposition” :
“Diviser pour régner” est une méthode de conception d’algorithmes qui se base sur
une “conception par décomposition” :
“Diviser pour régner” est une méthode de conception d’algorithmes qui se base sur
une “conception par décomposition” :
“Diviser pour régner” est une méthode de conception d’algorithmes qui se base sur
une “conception par décomposition” :
I Combiner les résultats des sous problèmes pour résoudre le problème initial
“Diviser pour régner” est une méthode de conception d’algorithmes qui se base sur
une “conception par décomposition” :
I Combiner les résultats des sous problèmes pour résoudre le problème initial
I Parfois, les sous-problèmes sont seulement plus “faiblement” liés, et combiner les résultats
peut-être complexe
Terminaison :
n
TriFusion “coupe” la donnée L (de taille |L| = n) en 2 morceaux de taille 2
n
TriFusion “coupe” la donnée L (de taille |L| = n) en 2 morceaux de taille 2
n
TriFusion “coupe” la donnée L (de taille |L| = n) en 2 morceaux de taille 2
Il faut avoir une intuition sur la forme de la solution (TriFusion : O(n log n))
Il faut avoir une intuition sur la forme de la solution (TriFusion : O(n log n))
n
On veut montrer que T (n) = 2T 2
+ Θ(n) ∈ O(n log n)
Il faut avoir une intuition sur la forme de la solution (TriFusion : O(n log n))
n
On veut montrer que T (n) = 2T 2
+ Θ(n) ∈ O(n log n)
Il faut avoir une intuition sur la forme de la solution (TriFusion : O(n log n))
n
On veut montrer que T (n) = 2T 2
+ Θ(n) ∈ O(n log n)
Attention !
L’hypothèse de récurrence est T (n) ≤ f (n), et non T (n) ∈ O(f (n))
L’hypothèse de récurrence “pour tout n ≤ k, T (n) ∈ O(f (n))” ne veut pas dire
grand chose puisque la notation O est définie pour n arbitrairement grand : on
remplace tous les termes en O, Ω, Θ par une fonction élément de l’ensemble
n
T (n) = 2T + n ≤ cn log n
2
Il faut montrer que la formule est vraie pour les conditions limites de la récurrence
pour des données de petite taille, i.e. n = 1
n
T (n) = 2T + n ≤ cn log n
2
Il faut montrer que la formule est vraie pour les conditions limites de la récurrence
pour des données de petite taille, i.e. n = 1
n
T (n) = 2T + n ≤ cn log n
2
Il faut montrer que la formule est vraie pour les conditions limites de la récurrence
pour des données de petite taille, i.e. n = 1
n
T (n) = 2T + n ≤ cn log n
2
Il faut montrer que la formule est vraie pour les conditions limites de la récurrence
pour des données de petite taille, i.e. n = 1
On peut aussi borner par f (n) = cn log n + b puisque cn log n + b ∈ O(n log n)
I Ou même f (n) = cn log n + an + b
T (2) = 2T (2/2) + 2
T (2) = 2T (2/2) + 2
T (2) = 2T (1) + 2
T (2) = 2T (2/2) + 2
T (2) = 2T (1) + 2
T (2) = 2 ∗ 1 + 2 = 4 ≤ 2c log 2 = 2c
T (2) = 2T (2/2) + 2
T (2) = 2T (1) + 2
T (2) = 2 ∗ 1 + 2 = 4 ≤ 2c log 2 = 2c
T (2) = 4 ≤ 2c
T (2) = 2T (2/2) + 2
T (2) = 2T (1) + 2
T (2) = 2 ∗ 1 + 2 = 4 ≤ 2c log 2 = 2c
T (2) = 4 ≤ 2c
c≥2
T (2) = 2T (2/2) + 2
T (2) = 2T (1) + 2
T (2) = 2 ∗ 1 + 2 = 4 ≤ 2c log 2 = 2c
T (2) = 4 ≤ 2c
c≥2
On fait la même chose pour T (3)...
T (2) = 2T (2/2) + 2
T (2) = 2T (1) + 2
T (2) = 2 ∗ 1 + 2 = 4 ≤ 2c log 2 = 2c
T (2) = 4 ≤ 2c
c≥2
On fait la même chose pour T (3)...
... et on obtient que c doit être ≥ 2.
Algorithmes Récursifs 66 / 174
Méthode par substitution (Récurrence)
n
T (n) = 2T + n ≤ cn log n
2
On vérifie que c’est aussi le cas pour x = n en substituant la formule pour T (x) dans
son expression récursive :
T (n) = 2T 2n + n
On vérifie que c’est aussi le cas pour x = n en substituant la formule pour T (x) dans
son expression récursive :
T (n) = 2T 2n + n
≤ 2c 2n log( 2n ) + n
On vérifie que c’est aussi le cas pour x = n en substituant la formule pour T (x) dans
son expression récursive :
T (n) = 2T 2n + n
≤ 2c 2n log( 2n ) + n
≤ cn log 2n + n
On vérifie que c’est aussi le cas pour x = n en substituant la formule pour T (x) dans
son expression récursive :
T (n) = 2T 2n + n
≤ 2c 2n log( 2n ) + n
≤ cn log 2n + n
= cn log n − cn log 2 + n
On vérifie que c’est aussi le cas pour x = n en substituant la formule pour T (x) dans
son expression récursive :
T (n) = 2T 2n + n
≤ 2c 2n log( 2n ) + n
≤ cn log 2n + n
= cn log n − cn log 2 + n
= cn log n − cn + n
On vérifie que c’est aussi le cas pour x = n en substituant la formule pour T (x) dans
son expression récursive :
T (n) = 2T 2n + n
≤ 2c 2n log( 2n ) + n
≤ cn log 2n + n
= cn log n − cn log 2 + n
= cn log n − cn + n
≤ cn log n (pour c ≥ 1)
Exemple
Algorithme : TriFusion (L)
Données : une list L
Résultat : la liste L triée (
si |L| ≤ 1 alors Θ(1) si n = 1
retourner L; T (n) = n
1
sinon 2T 2 + Θ(n ) si n > 1
|L|+1
mil ← b 2 c;
Ll ← TriFusion(L[:mil]);
Lr ← TriFusion(L[mil:]);
retourner Fusion(Ll , Lr );
Exemple
Algorithme : TriFusion (L)
Données : une list L
Résultat : la liste L triée (
si |L| ≤ 1 alors Θ(1) si n = 1
retourner L; T (n) = n
d
sinon aT b + Θ(n ) si n > 1
|L|+1
mil ← b 2 c;
Ll ← TriFusion(L[:mil]); Trifusion : a = 2, b = 2, d = 1
Lr ← TriFusion(L[mil:]);
retourner Fusion(Ll , Lr );
Exemple
Algorithme : RechBin (L)
Données : tableau trié L contenant e
Résultat
j :kla position de e dans L (
|L|
m← 2 ; Θ(1) si n = 1
si L[m] = e alors
T (n) = n
d
retourner m
aT b + Θ(n ) si n > 1
sinon si L[m] < e alors
retourner RechBin(L[m+1 :])
sinon
retourner RechBin(L[ :m])
Exemple
Algorithme : RechBin (L)
Données : tableau trié L contenant e
Résultat
j :kla position de e dans L (
|L|
m← 2 ; Θ(1) si n = 1
si L[m] = e alors
T (n) = n
0
retourner m
1T 2 + Θ(n ) si n > 1
sinon si L[m] < e alors
retourner RechBin(L[m+1 :]) Recherche Binaire : a = 1, b = 2, d = 0
sinon
retourner RechBin(L[ :m])
Tri fusion : (
Θ(1) si n = 1
T (n) =
2T (n/2) + Θ(n) si n > 1
Tri fusion : (
Θ(1) si n = 1
T (n) =
2T (n/2) + Θ(n) si n > 1
a = 2, b = 2, d = 1,
Tri fusion : (
Θ(1) si n = 1
T (n) =
2T (n/2) + Θ(n) si n > 1
a = 2, b = 2, d = 1, log2 2 = 1 = d
Tri fusion : (
Θ(1) si n = 1
T (n) =
2T (n/2) + Θ(n) si n > 1
a = 2, b = 2, d = 1, log2 2 = 1 = d
Recherche binaire : (
Θ(1) si n = 1
T (n) =
T ( 2n ) + Θ(1) si n > 1
Recherche binaire : (
Θ(1) si n = 1
T (n) =
T ( 2n ) + Θ(1) si n > 1
a = 1,
Recherche binaire : (
Θ(1) si n = 1
T (n) =
T ( 2n ) + Θ(1) si n > 1
a = 1, b = 2,
Recherche binaire : (
Θ(1) si n = 1
T (n) =
T ( 2n ) + Θ(1) si n > 1
a = 1, b = 2, d = 0,
Recherche binaire : (
Θ(1) si n = 1
T (n) =
T ( 2n ) + Θ(1) si n > 1
a = 1, b = 2, d = 0, log2 1 = 0 = d
Recherche binaire : (
Θ(1) si n = 1
T (n) =
T ( 2n ) + Θ(1) si n > 1
a = 1, b = 2, d = 0, log2 1 = 0 = d
2 Algorithme récursif
3 Programmation dynamique
2 (A1 ∗ (A2 ∗ A3 ))
1 4 ∗ 100 ∗ 25 = 10000 multiplications pour calculer N = A2 ∗ A3 de dimension 4 × 25
2 10 ∗ 4 ∗ 25 = 1000 multiplications pour calculer A1 ∗ N
3 total : 11000 multiplications
2 (A1 ∗ (A2 ∗ A3 ))
1 4 ∗ 100 ∗ 25 = 10000 multiplications pour calculer N = A2 ∗ A3 de dimension 4 × 25
2 10 ∗ 4 ∗ 25 = 1000 multiplications pour calculer A1 ∗ N
3 total : 11000 multiplications
Soit A1 , A2 , . . . An n matrices
Ai de taille ti−1 ∗ ti
3 matrices A1 ∗ A2 ∗ A3 ?
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ?
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ? → 4862 possibilités
Pour 50 matrices
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ? → 4862 possibilités
Pour 50 matrices → 5 × 1021 possibilités
Cas général : pour n matrices, il y a C(n − 1) parenthésages possibles, où C (n) est le
nombre de Catalan C (n) = n+11
× 2nn
(à étudier en détail en TD)
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ? → 4862 possibilités
Pour 50 matrices → 5 × 1021 possibilités
Cas général : pour n matrices, il y a C(n − 1) parenthésages possibles, où C (n) est le
nombre de Catalan C (n) = n+11
× 2nn
(à étudier en détail en TD)
n
C (n) ∈ Ω( n41.5 )
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ? → 4862 possibilités
Pour 50 matrices → 5 × 1021 possibilités
Cas général : pour n matrices, il y a C(n − 1) parenthésages possibles, où C (n) est le
nombre de Catalan C (n) = n+11
× 2nn
(à étudier en détail en TD)
n
C (n) ∈ Ω( n41.5 )
C’est exponentiel ! !
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ? → 4862 possibilités
Pour 50 matrices → 5 × 1021 possibilités
Cas général : pour n matrices, il y a C(n − 1) parenthésages possibles, où C (n) est le
nombre de Catalan C (n) = n+11
× 2nn
(à étudier en détail en TD)
n
C (n) ∈ Ω( n41.5 )
C’est exponentiel ! !
n
4
La complexité de l’approche force brute est Ω( (n−1) 1.5 )
3 matrices A1 ∗ A2 ∗ A3 ?
I (A1 ∗ A2 ) ∗ A3
I A1 ∗ (A2 ∗ A3 )
I 2 possibilités
Pour 4 matrices → 5 possibilités
Pour 5 matrices → 14 possibilités
Pour 10 matrices ? → 4862 possibilités
Pour 50 matrices → 5 × 1021 possibilités
Cas général : pour n matrices, il y a C(n − 1) parenthésages possibles, où C (n) est le
nombre de Catalan C (n) = n+11
× 2nn
(à étudier en détail en TD)
n
C (n) ∈ Ω( n41.5 )
C’est exponentiel ! !
n
4
La complexité de l’approche force brute est Ω( (n−1) 1.5 )
Très inefficace
Pour chaque solution, il faut découper la séquence A1 , ..An en deux sous séquences
A1 ..Ak et Ak+1 ..An (le calcul sera (A1 × ..Ak ) ∗ (Ak+1 × ..An ) )
Pour chaque solution, il faut découper la séquence A1 , ..An en deux sous séquences
A1 ..Ak et Ak+1 ..An (le calcul sera (A1 × ..Ak ) ∗ (Ak+1 × ..An ) )
Soit m[i][j] le coût minimal pour la séquence Ai . . . Aj (avec i < j)
Pour chaque solution, il faut découper la séquence A1 , ..An en deux sous séquences
A1 ..Ak et Ak+1 ..An (le calcul sera (A1 × ..Ak ) ∗ (Ak+1 × ..An ) )
Soit m[i][j] le coût minimal pour la séquence Ai . . . Aj (avec i < j)
Solution du problème est m[1][n]
Pour chaque solution, il faut découper la séquence A1 , ..An en deux sous séquences
A1 ..Ak et Ak+1 ..An (le calcul sera (A1 × ..Ak ) ∗ (Ak+1 × ..An ) )
Soit m[i][j] le coût minimal pour la séquence Ai . . . Aj (avec i < j)
Solution du problème est m[1][n]
Pour le parenthésage (A1 ..Ak ) × (Ak+1 ..An ), le coût est
cout = m[1][k] + m[k + 1][n] + t0 × tk × tn
Pour chaque solution, il faut découper la séquence A1 , ..An en deux sous séquences
A1 ..Ak et Ak+1 ..An (le calcul sera (A1 × ..Ak ) ∗ (Ak+1 × ..An ) )
Soit m[i][j] le coût minimal pour la séquence Ai . . . Aj (avec i < j)
Solution du problème est m[1][n]
Pour le parenthésage (A1 ..Ak ) × (Ak+1 ..An ), le coût est
cout = m[1][k] + m[k + 1][n] + t0 × tk × tn
=⇒ m[1][n] = mink∈[1,n−1] {m[1][k] + m[k + 1][n] + t0 × tk × tn } :
Pour chaque solution, il faut découper la séquence A1 , ..An en deux sous séquences
A1 ..Ak et Ak+1 ..An (le calcul sera (A1 × ..Ak ) ∗ (Ak+1 × ..An ) )
Soit m[i][j] le coût minimal pour la séquence Ai . . . Aj (avec i < j)
Solution du problème est m[1][n]
Pour le parenthésage (A1 ..Ak ) × (Ak+1 ..An ), le coût est
cout = m[1][k] + m[k + 1][n] + t0 × tk × tn
=⇒ m[1][n] = mink∈[1,n−1] {m[1][k] + m[k + 1][n] + t0 × tk × tn } :
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) = Pn−1
k=1 (T (k) + T (n − k) + c2 ) si n > 1
(
c1 si n = 1
T (n) =
3T (n − 1) + c2 si n > 1
On applique la méthode par substitution
T (1) = c1
T (2) = 3T (1) + c2 = 3c1 + c2
T (3) = 3T (2) + c2 = 9c1 + 4c2
T (4) = 3T (4) + c2 = 27c1 + 13c2
..
Pn−2
T (n) = c1 × 3n−1 + c2 × i=0 3i (On peut le prouver par récurrence)
n
Par conséquent : T (n) ∈ Θ(3 )
Règle de l’Hôpital
f et g deux fonctions dérivables t.q. lim f (n) = lim g (n) = ∞, alors :
n→∞ n→∞
0
lim f (n) = lim f 0(n) si cette limite existe.
n→∞ g (n) n→∞ g (n)
n
Rappel : la complexité de l’approche force brute est en Ω( n41.5 ) et la complexité de
l’algorithme récursif est en Θ(3n ). Que choisir ?
n
Rappel : la complexité de l’approche force brute est en Ω( n41.5 ) et la complexité de
l’algorithme récursif est en Θ(3n ). Que choisir ?
4n
4n n1.5
On va comparer n1.5
et 3n =⇒ on calcule limn→∞ 3n
?
n
Rappel : la complexité de l’approche force brute est en Ω( n41.5 ) et la complexité de
l’algorithme récursif est en Θ(3n ). Que choisir ?
4n
4n n1.5
On va comparer n1.5
et 3n =⇒ on calcule limn→∞ 3n
?
4n 4n
I n1.5 3
3n
= n1.5
4n
n1.5 4n 4n
I Donc limn→∞ 3n
= ∞ et par conséquent : n1.5
∈ Ω(3n ) et n1.5
/ O(3n )
∈
Souvent utilisée avec des problèmes d’optimisation (on cherche une solution qui
minimise ou maximise un critère)
Souvent utilisée avec des problèmes d’optimisation (on cherche une solution qui
minimise ou maximise un critère)
Assure que chaque sous-problème est traité une seule fois afin d’éviter le problème de
redondance.
Souvent utilisée avec des problèmes d’optimisation (on cherche une solution qui
minimise ou maximise un critère)
Assure que chaque sous-problème est traité une seule fois afin d’éviter le problème de
redondance.
Idée clé :
Souvent utilisée avec des problèmes d’optimisation (on cherche une solution qui
minimise ou maximise un critère)
Assure que chaque sous-problème est traité une seule fois afin d’éviter le problème de
redondance.
Idée clé :
I approche ascendante : Soit P(n) le problème à résoudre de taille n. Pour tout k < i, si
P(i) dépend de P(k), alors résoudre P(k) avant de résoudre P(i)
3 ...
retourner m[1][n]
Programmation Dynamique 88 / 174
Complexité de
CoutMultiplication_ProgDynamique
n
4
Meilleur que l’algorithme récursif (Θ(3n )) et la force brute (Ω( (n−1) 1.5 ) )
c d
2
3
4
1
b
5
7
c d
2
3
4
1
b
5
7
Cycle : a,b,c,d,a
Coût de la solution :7 + 3 + 2 + 5 = 17
c d
2
3
4
1
b
5
7
Cycle : a,c,b,d,a
Coût de la solution :1 + 3 + 4 + 5 = 13
2 Villes
2 Villes –> 1
2 Villes –> 1
3 Villes
2 Villes –> 1
3 Villes –> 1
2 Villes –> 1
3 Villes –> 1
4 Villes
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
n Villes
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
(n−1)!
n Villes –> 2
(la moitié du nombre de permutations possible de taille n − 1)
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
(n−1)!
n Villes –> 2
(la moitié du nombre de permutations possible de taille n − 1)
40 villes
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
(n−1)!
n Villes –> 2
(la moitié du nombre de permutations possible de taille n − 1)
40 villes –> à peu près 1046 solutions à tester !
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
(n−1)!
n Villes –> 2
(la moitié du nombre de permutations possible de taille n − 1)
40 villes –> à peu près 1046 solutions à tester !
Avec une machine moderne : 3 × 1029 années (plus que AgeUnivers 3 ) !
2 Villes –> 1
3 Villes –> 1
4 Villes –> 3
5 Villes –> 12
(n−1)!
n Villes –> 2
(la moitié du nombre de permutations possible de taille n − 1)
40 villes –> à peu près 1046 solutions à tester !
Avec une machine moderne : 3 × 1029 années (plus que AgeUnivers 3 ) !
La recherche exhaustive est inefficace ! !
Idée gloutonne :
Idée gloutonne :
I Construction de la solution ville par ville selon l’ordre de visite
Idée gloutonne :
I Construction de la solution ville par ville selon l’ordre de visite
I À partir de la dernière ville visitée, choisir la ville la plus proche qui est non visitée.
Idée gloutonne :
I Construction de la solution ville par ville selon l’ordre de visite
I À partir de la dernière ville visitée, choisir la ville la plus proche qui est non visitée.
I Arrêter quand on visite toutes les villes
Idée gloutonne :
I Construction de la solution ville par ville selon l’ordre de visite
I À partir de la dernière ville visitée, choisir la ville la plus proche qui est non visitée.
I Arrêter quand on visite toutes les villes
I Ajouter la première ville pour construire un cycle.
c d
2
3
4
1
b
5
7
Chemin initial : a
Coût initial :0
c d
2
3
4
1
b
5
7
c d
2
3
4
1
b
5
7
c d
2
3
4
1
b
5
7
c d
2
3
4
1
b
5
7
Cycle : a,c,d, b, a
Coût courant :1 + 2 + 4 + 7 = 14
c d
2
3
4
1
b
5
7
Cycle : a,c,d, b, a
Coût courant :1 + 2 + 4 + 7 = 14
C’est la solution retournée par l’algorithme glouton
Ce n’est pas une solution optimale mais c’est assez rapide à trouver
Complexité : O(n2 )
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
Preuve
I E est un ensemble fini non vide (évident)
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
Preuve
I E est un ensemble fini non vide (évident)
I I est héréditaire car :
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
Preuve
I E est un ensemble fini non vide (évident)
I I est héréditaire car :
F Pour {2, 4} : {} ∈ I , {2} ∈ I , {4} ∈ I
F Pour {1, 4} : {} ∈ I , {1} ∈ I , {4} ∈ I
F Pour {1} : {} ∈ I , {1} ∈ I
F Pour {2} : {} ∈ I , {2} ∈ I
F Pour {3} : {} ∈ I , {4} ∈ I
F Pour {} : {} ∈ I
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
Preuve
I E est un ensemble fini non vide (évident)
I I est héréditaire car :
F Pour {2, 4} : {} ∈ I , {2} ∈ I , {4} ∈ I
F Pour {1, 4} : {} ∈ I , {1} ∈ I , {4} ∈ I
F Pour {1} : {} ∈ I , {1} ∈ I
F Pour {2} : {} ∈ I , {2} ∈ I
F Pour {3} : {} ∈ I , {4} ∈ I
F Pour {} : {} ∈ I
I Propriété d’échange :
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
Preuve
I E est un ensemble fini non vide (évident)
I I est héréditaire car :
F Pour {2, 4} : {} ∈ I , {2} ∈ I , {4} ∈ I
F Pour {1, 4} : {} ∈ I , {1} ∈ I , {4} ∈ I
F Pour {1} : {} ∈ I , {1} ∈ I
F Pour {2} : {} ∈ I , {2} ∈ I
F Pour {3} : {} ∈ I , {4} ∈ I
F Pour {} : {} ∈ I
I Propriété d’échange :
F Pour H = {1, 4} et F = {2} : F ∪ {4} ∈ I
F Pour H = {2, 4} et F = {1} : F ∪ {2} ∈ I
F Pour H = {4} et F = {} : F ∪ {4} ∈ I
F ...
retourner F ;
retourner F ;
Theorem
Glouton (M(E, I) , w ) retourne un sous ensemble indépendant optimal
Theorem
Glouton (M(E, I) , w ) retourne un sous ensemble indépendant optimal
Algorithme : Glouton (M(E, I) , w )
Données : M(E, I) : matroïde, w : fonction de poids
Résultat : Sous ensemble indépendant de E de poids maximal
début
F ← {};
n ← |E| ;
L ← Trier (E) par poids décroissant ;
pour i ∈ [1..n] faire
si F ∪ {L[i]} ∈ I alors
F ← F ∪ {L[i]};
retourner F ;
Exemples :
I Types char, int, float, etc. : O(1)
Exemples :
I Types char, int, float, etc. : O(1)
Exemples :
I Types char, int, float, etc. : O(1)
Exemples :
I Types char, int, float, etc. : O(1)
Exemples :
I Types char, int, float, etc. : O(1)
Encodage
Un encodage pour un type de donnée T est une fonction injective :
f : T 7→ {0, 1}k
7 6 5 4 3 2 1 0
27 26 25 24 23 22 21 20
7
bi 2i
P
Chaque bit repésente un terme de la somme x =
i=0
0 1 0 0 1 0 1 1
27 26 25 24 23 22 21 20
7
bi 2i
P
Chaque bit repésente un terme de la somme x =
i=0
Pour x = 75 : 1 × 26 + 1 × 23 + 1 × 21 + 1 × 20
0 1 0 0 1 0 1 1
27 26 25 24 23 22 21 20
7
bi 2i
P
Chaque bit repésente un terme de la somme x =
i=0
Pour x = 75 : 1 × 26 + 1 × 23 + 1 × 21 + 1 × 20
0 1 0 0 1 0 1 1
27 26 25 24 23 22 21 20
0 1 0 0 1 0 1 1
27 26 25 24 23 22 21 20
0 0 0 0 0 0 0 1 0 0 1 0 1 1
| {z }
N◦ de 0 = N◦ de bits =7 26 25 24 23 22 21 20
Donner le nombre de bits “utiles” en préfixe, en code unaire (autant de 0 que de bits
significatifs)
0 0 0 0 0 0 0 1 0 0 1 0 1 1
| {z }
N◦ de 0 = N◦ de bits =7 26 25 24 23 22 21 20
Donner le nombre de bits “utiles” en préfixe, en code unaire (autant de 0 que de bits
significatifs)
Borne supérieure
Si n ∈ N alors |n| ∈ O(log n)
13 0 3 −18 2 9 11 −4
8 13 0 3 −18 2 9 11 −4
Même astuce que pour les entiers, le nombre d’éléments en préfixe : O(log n)
8 13 0 3 −18 2 9 11 −4
Même astuce que pour les entiers, le nombre d’éléments en préfixe : O(log n)
Borne supérieure
Si L est un tableau contenant n int, alors |L| ∈ O(n)
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
et 3 plats végétariens ?
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
et 3 plats végétariens ? 3 + 2 + 3 = 8 plats
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
et 3 plats végétariens ? 3 + 2 + 3 = 8 plats
Principe multiplicatif
Les choix indépendents se combinent par multiplication.
Combien de menus s’il y a 3 entrées, 4 plats, et 4 desserts ?
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
et 3 plats végétariens ? 3 + 2 + 3 = 8 plats
Principe multiplicatif
Les choix indépendents se combinent par multiplication.
Combien de menus s’il y a 3 entrées, 4 plats, et 4 desserts ? 3 × 4 × 4 = 48 menus
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
et 3 plats végétariens ? 3 + 2 + 3 = 8 plats
Principe multiplicatif
Les choix indépendents se combinent par multiplication.
Combien de menus s’il y a 3 entrées, 4 plats, et 4 desserts ? 3 × 4 × 4 = 48 menus
Combien de valeurs possibles pour un int sur 32 bits ?
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
et 3 plats végétariens ? 3 + 2 + 3 = 8 plats
Principe multiplicatif
Les choix indépendents se combinent par multiplication.
Combien de menus s’il y a 3 entrées, 4 plats, et 4 desserts ? 3 × 4 × 4 = 48 menus
Combien de valeurs possibles pour un int sur 32 bits ? 232 valeurs
Si m > n objets sont rangés dans n tiroirs, alors un tiroir en contient au moins 2
Si m > n objets sont rangés dans n tiroirs, alors un tiroir en contient au moins 2
Si m > n objets sont rangés dans n tiroirs, alors un tiroir en contient au moins 2
I Il n’y a pas plus d’un million de cheveux sur un crâne, donc pas plus d’un million de
nombres de cheveux distincts
Si m > n objets sont rangés dans n tiroirs, alors un tiroir en contient au moins 2
I Il n’y a pas plus d’un million de cheveux sur un crâne, donc pas plus d’un million de
nombres de cheveux distincts
Si m > n objets sont rangés dans n tiroirs, alors un tiroir en contient au moins 2
I Il n’y a pas plus d’un million de cheveux sur un crâne, donc pas plus d’un million de
nombres de cheveux distincts
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
f : T 7→ {0, 1}k
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
Il faut au moins autant de mots binaires que de valeurs possibles pour la donnée
I Principe des tiroirs : sinon, des données distinctes ont le même code, et f est non-injective
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
Il faut au moins autant de mots binaires que de valeurs possibles pour la donnée
I Principe des tiroirs : sinon, des données distinctes ont le même code, et f est non-injective
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
Il faut au moins autant de mots binaires que de valeurs possibles pour la donnée
I Principe des tiroirs : sinon, des données distinctes ont le même code, et f est non-injective
Exemple
Algorithme : Carré(x)
Données : un entier x
Résultat : un entier valant x 2
r : entier;
début
r ← 0;
pour i allant de 1 à x faire
pour j allant de 1 à x faire
r ← r + 1;
retourner r ;
Exemple
Algorithme : Carré(x)
Données : un entier x
Résultat : un entier valant x 2 Complexité : Θ(x 2 )
r : entier;
début
r ← 0;
pour i allant de 1 à x faire
pour j allant de 1 à x faire
r ← r + 1;
retourner r ;
Exemple
Algorithme : Carré(x)
Données : un entier x
Résultat : un entier valant x 2 Complexité : Θ(x 2 )
r : entier;
début Taille de la donnée |x| = Θ(log x)
r ← 0;
pour i allant de 1 à x faire
pour j allant de 1 à x faire
r ← r + 1;
retourner r ;
Algorithme : Carré(x)
Données : un entier x
Résultat : un entier valant x 2 Complexité : Θ(x 2 )
r : entier;
début Taille de la donnée |x| = Θ(log x)
r ← 0;
pour i allant de 1 à x faire
pour j allant de 1 à x faire Autrement dit, x = Θ(2|x| )
r ← r + 1;
retourner r ;
Algorithme : Carré(x)
Données : un entier x
Résultat : un entier valant x 2 Complexité : Θ(x 2 )
r : entier;
début Taille de la donnée |x| = Θ(log x)
r ← 0;
pour i allant de 1 à x faire
pour j allant de 1 à x faire Autrement dit, x = Θ(2|x| )
r ← r + 1;
Choisir la structure pour laquelle les opérations utiles sont les plus efficaces
Un type abstrait est défini par les opérations qui sont efficaces sur ce type
Un type abstrait est défini par les opérations qui sont efficaces sur ce type
Un type abstrait est défini par les opérations qui sont efficaces sur ce type
Fichier des étudiants de l’INSA, il faut une clé unique pour identification
Fichier des étudiants de l’INSA, il faut une clé unique pour identification
Fichier des étudiants de l’INSA, il faut une clé unique pour identification
Fichier des étudiants de l’INSA, il faut une clé unique pour identification
T [i − 1] T [i] T [i + 1]
enregistrement(x)
h(x) = h(y ) = i
enregistrement(y )
I Pire des cas Tmax (n) = Θ(n) (tous les enregistrements ont la même valeur de hâchage)
T [i − 1] T [i] T [i + 1]
enregistrement(x)
h(x) = h(y ) = i
enregistrement(y )
I Pire des cas Tmax (n) = Θ(n) (tous les enregistrements ont la même valeur de hâchage)
I Pour Tmoy (n) on suppose une distribution uniforme des valeurs de h(x) dans {1, . . . , m}
m
P
I Soit Li la longueur de la liste T [i], et E (Li ) l’espérance de Li : E (Li ) = n
i=1
T [i − 1] T [i] T [i + 1]
enregistrement(x)
h(x) = h(y ) = i
enregistrement(y )
I Pire des cas Tmax (n) = Θ(n) (tous les enregistrements ont la même valeur de hâchage)
I Pour Tmoy (n) on suppose une distribution uniforme des valeurs de h(x) dans {1, . . . , m}
m
P
I Soit Li la longueur de la liste T [i], et E (Li ) l’espérance de Li : E (Li ) = n
i=1
I Mais E (Li ) ne dépend pas de i, donc Tmoy (n) = E (Li ) = n/m ∈ O(1)
1 2
2 5 3 6
4 8 5 67 6 50 7 38
8 12 9 95
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
2 5 6 8 67 50 38 12 95 .
fils droit de i : 2i + 1
1 2
2 5 3 6
4 8 5 67 6 50 7 38
8 12 9 95 3
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
2 5 6 8 67 50 38 12 95 3
fils droit de i : 2i + 1
1 2
2 5 3 6
4 8 5 3 6 50 7 38
8 12 9 95 67
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
2 5 6 8 3 50 38 12 95 67
fils droit de i : 2i + 1
1 2
2 3 3 6
4 8 5 5 6 50 7 38
8 12 9 95 67
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
2 3 6 8 5 50 38 12 95 67
fils droit de i : 2i + 1
1 2
2 3 3 6
4 8 5 5 6 50 7 38
8 12 9 95 67
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
2 3 6 8 5 50 38 12 95 67
fils droit de i : 2i + 1
1 2
2 3 3 6
4 8 5 5 6 50 7 38
8 12 9 95 67
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
2 3 6 8 5 50 38 12 95 67
fils droit de i : 2i + 1
1 67
2 3 3 6
4 8 5 5 6 50 7 38
8 12 9 95
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
67 3 6 8 5 50 38 12 95 .
fils droit de i : 2i + 1
1 3
2 67 3 6
4 8 5 5 6 50 7 38
8 12 9 95
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
3 67 6 8 5 50 38 12 95 .
fils droit de i : 2i + 1
1 3
2 5 3 6
4 8 5 67 6 50 7 38
8 12 9 95
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
3 5 6 8 67 50 38 12 95 .
fils droit de i : 2i + 1
1 3
2 5 3 6
4 8 5 67 6 50 7 38
8 12 9 95
parent de i : bi/2c
1 2 3 4 5 6 7 8 9 10
réalisation : fils gauche de i : 2i
3 5 6 8 67 50 38 12 95 .
fils droit de i : 2i + 1
n insertions en O(log n)
n insertions en O(log n)
n suppressions en O(log n)
n insertions en O(log n)
n suppressions en O(log n)
Complexité du tri par tas : O(n log n)
n insertions en O(log n)
Tri par tas est optimal !
n suppressions en O(log n)
O(n log n) dans le pire des cas
Complexité du tri par tas : O(n log n)
https://aniti.univ-toulouse.fr
Des Postdocs
Considérons les algorithmes de tri qui ne peuvent pas “lire” ces éléments, seulement
les comparer (e.g. un tableau de pointeurs vers une classe d’objets comparables).
Considérons les algorithmes de tri qui ne peuvent pas “lire” ces éléments, seulement
les comparer (e.g. un tableau de pointeurs vers une classe d’objets comparables).
Considérons les algorithmes de tri qui ne peuvent pas “lire” ces éléments, seulement
les comparer (e.g. un tableau de pointeurs vers une classe d’objets comparables).
On peut considérer que la donnée de l’algorithme est une table de longueur k avec les
résultats des comparaisons :
x = [0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1]
| {z }
k
[0, 0, 1, 0, 1, 1, 1, 1, . . .]
[0, 0, 1, 0, 1, 1, 1, 1, . . .]
[0, 1, 0, 0, 1, 0, 0, 1, . . .]
2k [1, 0, 0, 0, 0, 1, 1, 1, . . .]
[0, 1, 1, 0, 1, 1, 0, 0, . . .]
[1, 0, 1, 0, 0, 1, 1, 0, . . .]
[0, 0, 1, 0, 1,.. 1, 1, 1, . . .]
.
[0, 0, 1, 0, 1, 1, 1, 1, . . .] (e1 , e2 , e3 , e4 , . . .)
[0, 0, 1, 0, 1, 1, 1, 1, . . .] (e1 , e2 , e4 , e3 , . . .)
[0, 1, 0, 0, 1, 0, 0, 1, . . .] (e1 , e3 , e2 , e4 , . . .)
2k [1, 0, 0, 0, 0, 1, 1, 1, . . .] (e1 , e3 , e4 , e2 , . . .) n!
[0, 1, 1, 0, 1, 1, 0, 0, . . .] (e1 , e4 , e2 , e3 , . . .)
[1, 0, 1, 0, 0, 1, 1, 0, . . .] (e1 , e4 , e3 , e2 , . . .)
[0, 0, 1, 0, 1,.. 1, 1, 1, . . .] (e1 , e2 , e..3 , e4 , . . .)
. .
[0, 0, 1, 0, 1, 1, 1, 1, . . .] (e1 , e2 , e3 , e4 , . . .)
[0, 0, 1, 0, 1, 1, 1, 1, . . .] (e1 , e2 , e4 , e3 , . . .)
[0, 1, 0, 0, 1, 0, 0, 1, . . .] (e1 , e3 , e2 , e4 , . . .)
2k [1, 0, 0, 0, 0, 1, 1, 1, . . .] (e1 , e3 , e4 , e2 , . . .) n!
[0, 1, 1, 0, 1, 1, 0, 0, . . .] (e1 , e4 , e2 , e3 , . . .)
[1, 0, 1, 0, 0, 1, 1, 0, . . .] (e1 , e4 , e3 , e2 , . . .)
[0, 0, 1, 0, 1,.. 1, 1, 1, . . .] (e1 , e2 , e..3 , e4 , . . .)
. .
[0, 0, 1, 0, 1, 1, 1, 1, . . .] (e1 , e2 , e3 , e4 , . . .)
[0, 0, 1, 0, 1, 1, 1, 1, . . .] (e1 , e2 , e4 , e3 , . . .)
[0, 1, 0, 0, 1, 0, 0, 1, . . .] (e1 , e3 , e2 , e4 , . . .)
2k [1, 0, 0, 0, 0, 1, 1, 1, . . .] (e1 , e3 , e4 , e2 , . . .) n!
[0, 1, 1, 0, 1, 1, 0, 0, . . .] (e1 , e4 , e2 , e3 , . . .)
[1, 0, 1, 0, 0, 1, 1, 0, . . .] (e1 , e4 , e3 , e2 , . . .)
[0, 0, 1, 0, 1,.. 1, 1, 1, . . .] (e1 , e2 , e..3 , e4 , . . .)
. .
2k ≥ n!
Classes de Complexité 136 / 174
Borne inférieure pour les algorithmes de tri
2k ≥ n! =⇒ k ≥ log(n!)
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
= log n + log(n − 1) + log(n − 1) + . . . + log(2)
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
= log n + log(n − 1) + log(n − 1) + . . . + log(2)
X n
= log i
i=2
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
= log n + log(n − 1) + log(n − 1) + . . . + log(2)
X n
= log i
i=2
n/2−1 n
X X
= log i + log i
i=2 i=n/2
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
= log n + log(n − 1) + log(n − 1) + . . . + log(2)
X n
= log i
i=2
n/2−1 n
X X
= log i + log i
i=2 i=n/2
n
X n
≥ log
2
i=n/2
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
= log n + log(n − 1) + log(n − 1) + . . . + log(2)
X n
= log i
i=2
n/2−1 n
X X
= log i + log i
i=2 i=n/2
n
X n
≥ log
2
i=n/2
n n
= log
2 2
2k ≥ n! =⇒ k ≥ log(n!)
= log n(n − 1)(n − 1) . . . 2
= log n + log(n − 1) + log(n − 1) + . . . + log(2)
X n
= log i
i=2
n/2−1 n
X X
= log i + log i
i=2 i=n/2
n
X n
≥ log
2
i=n/2
n n
= log
2 2
= Ω(n log n)
Théorème
Tout algorithme de tri par comparaison est en Ω(n log n)
Théorème
Tout algorithme de tri par comparaison est en Ω(n log n)
Problème de décision Q
Fonction Q : x →
7 {oui, non}
Problème de décision Q
Fonction Q : x →
7 {oui, non}
Pour un problème dont la réponse n’est pas dans {oui, non}, on peut définir un
problème polynomialement équivalent :
Problème de décision Q
Fonction Q : x →
7 {oui, non}
Pour un problème dont la réponse n’est pas dans {oui, non}, on peut définir un
problème polynomialement équivalent :
Problème de décision Q
Fonction Q : x →
7 {oui, non}
Pour un problème dont la réponse n’est pas dans {oui, non}, on peut définir un
problème polynomialement équivalent :
Instance : problème avec la donnée (“Combien vaut 5672 ?”, “Quel est le plus court
chemin entre Toulouse et Paris ?”)
Instance : problème avec la donnée (“Combien vaut 5672 ?”, “Quel est le plus court
chemin entre Toulouse et Paris ?”)
Instance : problème avec la donnée (“Combien vaut 5672 ?”, “Quel est le plus court
chemin entre Toulouse et Paris ?”)
Instance : problème avec la donnée (“Combien vaut 5672 ?”, “Quel est le plus court
chemin entre Toulouse et Paris ?”)
en temps constant si sa complexité dans le pire des cas est bornée par une constante
polynomial si sa complexité dans le pire des cas est en O(nc ) avec c > 0
c
exponentiel si elle est en Θ(2n ) pour un certain c > 1
en temps constant si sa complexité dans le pire des cas est bornée par une constante
polynomial si sa complexité dans le pire des cas est en O(nc ) avec c > 0
c
exponentiel si elle est en Θ(2n ) pour un certain c > 1
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
Inclusion
Si f (n) ∈ O(g (n)) alors f (n)-TIME ⊆ g (n)-TIME
Inclusion
Si f (n) ∈ O(g (n)) alors f (n)-TIME ⊆ g (n)-TIME
(n log n)-TIME
Inclusion
Si f (n) ∈ O(g (n)) alors f (n)-TIME ⊆ g (n)-TIME
n-TIME
(n log n)-TIME
Inclusion
Si f (n) ∈ O(g (n)) alors f (n)-TIME ⊆ g (n)-TIME
n-TIME
(n log n)-TIME
(log n)-TIME
Inclusion
Si f (n) ∈ O(g (n)) alors f (n)-TIME ⊆ g (n)-TIME
n2 -TIME
n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
Tri n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
Tri n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
Tri n-TIME
(n log n)-TIME
(log n)-TIME
Tri
donnée: Une liste L d’objet comparables
question: La séquence triée des objets de L
Tri n-TIME
(n log n)-TIME Max ?
(log n)-TIME
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
Rappel :
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
Rappel :
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
P-TIME ou simplement : P
Ensemble des problèmes pour lesquels il existe un algorithme en O(nc )
pour une constante c.
[
P= nc -TIME
c≥0
EXP-TIME :
c
Ensemble des problèmes pour lesquels il existe un algorithme en O(2n )
pour une constante c
c
[
EXP-TIME = 2n -TIME
c≥1
EXP-TIME :
c
Ensemble des problèmes pour lesquels il existe un algorithme en O(2n )
pour une constante c
c
[
EXP-TIME = 2n -TIME
c≥1
Evidemment, P ⊆ EXP-TIME
EXP-TIME :
c
Ensemble des problèmes pour lesquels il existe un algorithme en O(2n )
pour une constante c
c
[
EXP-TIME = 2n -TIME
c≥1
Evidemment, P ⊆ EXP-TIME
Est-ce que P ⊂ EXP-TIME ?
EXP-TIME :
c
Ensemble des problèmes pour lesquels il existe un algorithme en O(2n )
pour une constante c
c
[
EXP-TIME = 2n -TIME
c≥1
Evidemment, P ⊆ EXP-TIME
EXP-TIME P
Est-ce que P ⊂ EXP-TIME ? Oui !
Il existe des problèmes en Ω(2n )
f (n)-SPACE
Ensemble des problèmes pour lesquels il existe un algorithme nécessitant
O(f (n)) octets de mémoire
f (n)-SPACE
Ensemble des problèmes pour lesquels il existe un algorithme nécessitant
O(f (n)) octets de mémoire
Sous-Séquence Maximale
donnée: Un tableau L avec n éléments dans {−1, 1}
Quelles sont les valeurs de s et e dans [1, n] qui maximisent
question: P
e
i=s L[i]
Sous-Séquence Maximale
donnée: Un tableau L avec n éléments dans {−1, 1}
Quelles sont les valeurs de s et e dans [1, n] qui maximisent
question: P
e
i=s L[i]
-1 -1 |1 1 -1 {z
1 -1 1 1} -1 -1 1 1 -1 1
3
Sous-Séquence Maximale
donnée: Un tableau L avec n éléments dans {−1, 1}
Quelles sont les valeurs de s et e dans [1, n] qui maximisent
question: P
e
i=s L[i]
-1 -1 |1 1 -1 {z
1 -1 1 1} -1 -1 1 1 -1 1
3
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
s[i] 1 2 3 2 1 0 -1 0 -1 -2 -1 0 1 2 1 0 1 2 3 2 1 2 1 2 1 0 -1
Algorithme 2
Pi
s[i] = k=1 L[k]
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
s[i] 1 2 3 2 1 0 -1 0 -1 -2 -1 0 1 2 1 0 1 2 3 2 1 2 1 2 1 0 -1
Algorithme 2
Pi
s[i] = k=1 L[k]
Pj Pj Pi−1
I
k=i L[k] = k=1 L[k] − k=1 L[k]
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
s[i] 1 2 3 2 1 0 -1 0 -1 -2 -1 0 1 2 1 0 1 2 3 2 1 2 1 2 1 0 -1
min[i] 0 0 0 0 0 0 0 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2
Algorithme 2
Pi
s[i] = k=1 L[k]
Pj Pj Pi−1
I
k=i L[k] = k=1 L[k] − k=1 L[k]
min[i] = min(s[j] | j < i)
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
s[i] 1 2 3 2 1 0 -1 0 -1 -2 -1 0 1 2 1 0 1 2 3 2 1 2 1 2 1 0 -1
min[i] 0 0 0 0 0 0 0 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2
max[i] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 1 0 -1
Algorithme 2
Pi
s[i] = k=1 L[k]
Pj Pj Pi−1
I
k=i L[k] = k=1 L[k] − k=1 L[k]
min[i] = min(s[j] | j < i)
max[i] = max(s[j] | j ≥ i)
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
s[i] 1 2 3 2 1 0 -1 0 -1 -2 -1 0 1 2 1 0 1 2 3 2 1 2 1 2 1 0 -1
min[i] 0 0 0 0 0 0 0 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2
max[i] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 1 0 -1
mss[i] 3 3 3 3 3 3 3 4 4 4 5 5 5 5 5 5 5 5 5 4 4 4 4 4 3 2 1
Algorithme 2
Pi
s[i] = k=1 L[k]
Pj Pj Pi−1
I
k=i L[k] = k=1 L[k] − k=1 L[k]
min[i] = min(s[j] | j < i)
max[i] = max(s[j] | j ≥ i)
mss[i] = maxi − mini
L[i] 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
s[i] 1 2 3 2 1 0 -1 0 -1 -2 -1 0 1 2 1 0 1 2 3 2 1 2 1 2 1 0 -1
min[i] 0 0 0 0 0 0 0 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2
max[i] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 1 0 -1
mss[i] 3 3 3 3 3 3 3 4 4 4 5 5 5 5 5 5 5 5 5 4 4 4 4 4 3 2 1
Algorithme 2
Pi
s[i] = k=1 L[k]
Pj Pj Pi−1 Θ(1) tables de taille Θ(n)
I
k=i L[k] = k=1 L[k] − k=1 L[k]
Temps : Θ(n)
min[i] = min(s[j] | j < i)
Espace : Θ(n)
max[i] = max(s[j] | j ≥ i)
mss[i] = maxi − mini
Temps Espace
Algorithme 1 Θ(n3 ) Θ(log n)
Algorithme 2 Θ(n) Θ(n)
Théorème
f (n)-TIME ⊆ f (n)-SPACE
Théorème
f (n)-TIME ⊆ f (n)-SPACE
Théorème
f (n)-TIME ⊆ f (n)-SPACE
Alors tout algorithme pour A utilise Ω(g (n)) mémoire avec g (n) 6∈ O(f (n)).
Théorème
f (n)-TIME ⊆ f (n)-SPACE
Alors tout algorithme pour A utilise Ω(g (n)) mémoire avec g (n) 6∈ O(f (n)).
Théorème
f (n)-TIME ⊆ f (n)-SPACE
Alors tout algorithme pour A utilise Ω(g (n)) mémoire avec g (n) 6∈ O(f (n)).
P-SPACE
Ensemble des problèmes pour lesquels il existe un algorithme qui utilise
O(nc ) octets de mémoire pour une constante c.
[
P= nc -SPACE
c≥0
Est-ce que P-SPACE est inclu dans EXP-TIME, EXP-TIME inclu dans
P-SPACE, ou ni l’un ni l’autre ?
Théorème
P-SPACE ⊆ EXP-TIME
Théorème
P-SPACE ⊆ EXP-TIME
Théorème
P-SPACE ⊆ EXP-TIME
Théorème
P-SPACE ⊆ EXP-TIME
Théorème
P-SPACE ⊆ EXP-TIME
Théorème
P-SPACE ⊆ EXP-TIME
Théorème
P-SPACE ⊆ EXP-TIME
EXP-TIME P-SPACE P
EXP-TIME P-SPACE P
EXP-TIME P-SPACE ? P
EXP-TIME P-SPACE ? P
EXP-TIME P-SPACE ? P
EXP-TIME P-SPACE NP P
EXP-TIME P-SPACE NP P
TSP
donnée: Un ensemble de villes S, une matrice de distance D : S × S 7→ N,
un entier k
question: Est-ce qu’il existe une route de longueur au plus k passant par
toutes les villes ?
Les Classes NP et coNP 160 / 174
Classes non-déterministes
TSP
donnée: Un ensemble de villes S, une matrice de distance D : S × S 7→ N, un entier k
question: Est-ce qu’il existe une route de longueur au plus k passant par toutes les villes ?
TSP
donnée: Un ensemble de villes S, une matrice de distance D : S × S 7→ N, un entier k
question: Est-ce qu’il existe une route de longueur au plus k passant par toutes les villes ?
retourner vrai ;
retourner vrai ;
Conjecture P 6= NP
Un des 7 “problèmes du millénaire” du Clay Mathematics Institute
Mise-à-prix $1 000 000
Conjecture P 6= NP
Un des 7 “problèmes du millénaire” du Clay Mathematics Institute
Mise-à-prix $1 000 000
Conjecture P 6= NP
Un des 7 “problèmes du millénaire” du Clay Mathematics Institute
Mise-à-prix $1 000 000
I Montrer qu’un problème n’est pas dans P est difficile : tout algorithme est en Ω(2n )
Conjecture P 6= NP
Un des 7 “problèmes du millénaire” du Clay Mathematics Institute
Mise-à-prix $1 000 000
I Montrer qu’un problème n’est pas dans P est difficile : tout algorithme est en Ω(2n )
La réponse “oui” est accompagnée d’un certificat grace auquel on peut vérifier que la
réponse est correcte
La réponse “oui” est accompagnée d’un certificat grace auquel on peut vérifier que la
réponse est correcte
La réponse “oui” est accompagnée d’un certificat grace auquel on peut vérifier que la
réponse est correcte
co-TSP
donnée: Un ensemble de villes S, une matrice de distance D : S × S 7→ N, un entier k
question: Est-ce qu’il n’existe pas de route de longueur au plus k passant par toutes les
villes ?
Problème complémenaire
Le Problème complémenaire co-A d’un problème de décision A, est le
problème qui associe la réponse “non” à toute donnée associée à “oui” dans
A, et vice versa.
Problème complémenaire
Le Problème complémenaire co-A d’un problème de décision A, est le
problème qui associe la réponse “non” à toute donnée associée à “oui” dans
A, et vice versa.
Problème complémenaire
Le Problème complémenaire co-A d’un problème de décision A, est le
problème qui associe la réponse “non” à toute donnée associée à “oui” dans
A, et vice versa.
Un chemin qui ne passe pas par toutes les villes, ou de longueur > k ?
Un chemin qui ne passe pas par toutes les villes, ou de longueur > k ? pas suffisant !
Un chemin qui ne passe pas par toutes les villes, ou de longueur > k ? pas suffisant !
Un chemin qui ne passe pas par toutes les villes, ou de longueur > k ? pas suffisant !
Un chemin qui ne passe pas par toutes les villes, ou de longueur > k ? pas suffisant !
Un chemin qui ne passe pas par toutes les villes, ou de longueur > k ? pas suffisant !
coNP
Ensemble des problèmes de décision dont le problème complément est dans NP
Conjecture
NP 6= coNP ?
I Le certificat nécessite un espace fini (vérifiable en O(nc ) pour une donnée de taille n)
I Le certificat nécessite un espace fini (vérifiable en O(nc ) pour une donnée de taille n)
c
I Il y a donc un nombre fini de certificat : O(2n )
I Le certificat nécessite un espace fini (vérifiable en O(nc ) pour une donnée de taille n)
c
I Il y a donc un nombre fini de certificat : O(2n )
c
I On génère et verifie tous les certificats (en temps O(nc 2n ))
I Le certificat nécessite un espace fini (vérifiable en O(nc ) pour une donnée de taille n)
c
I Il y a donc un nombre fini de certificat : O(2n )
c
I On génère et verifie tous les certificats (en temps O(nc 2n ))
Théorème
NP ⊆ P-SPACE et coNP ⊆ P-SPACE
P
Résumé : les classes de complexité
(log n)-TIME
Résumé : les classes de complexité
P
..
.
n-TIME
..
.
(log n)-TIME
Résumé : les classes de complexité
N
P
P
..
.
n-TIME
..
.
(log n)-TIME
Résumé : les classes de complexité
N
N
P
co
P
..
.
n-TIME
..
.
(log n)-TIME
Résumé : les classes de complexité
P-SPACE
N
N
P
co
P
..
.
n-TIME
..
.
(log n)-TIME
Résumé : les classes de complexité
EXP-TIME
P-SPACE
N
N
P
co
P
..
.
n-TIME
..
.
(log n)-TIME