Académique Documents
Professionnel Documents
Culture Documents
o
N attribué par la bibliothèque :
Université DE CARTHAGE
École Nationale des Ingénieurs de Carthage
Département d’Informatique Appliquée
Support de Cours
ALGORITHMIQUE FONDAMENTALE
ET COMPLEXITÉ
MASTÈRE DE RECHERCHE EN INFORMATIQUE
Responsable du Module
Hazem FKAIER
1 Complexité :
Conceptes & Outils 1
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 À propos du temps d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2.2 Analyse du temps d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.3 Rappel sur l’algorithmique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Notions Mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.1 Complexité asymptotique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.2 Estimation asympthotique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.3 Notations de Landau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.4 Limite supérieure : notation Grand-O . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.5 Limite inférieure : Notation Grand-Ω . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.6 Notation Grand-Θ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.7 Utilisation de la limite pour détermier l’ordre . . . . . . . . . . . . . . . . . . . . 9
1.3.8 Propriété . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.9 Comparaison d’algorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4 Variation de la complexités d’un algorithme . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.1 Complexité au meilleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.2 Complexité au pire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.3 Complexité en moyenne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.4 Synthèse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.5 Propriété des complexités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5 Détermination de la complexité d’un algorithme et d’un problème . . . . . . . . . . . . . 13
1.5.1 Classes de complexité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.2 Complexité de problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.3 Classification des problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.4 Calcul de la complexité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
iii
TABLE DES MATIÈRES
2.2.2 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.3 Les principaux types de problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3 Machine de Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3.1 Notion de machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3.2 Définition de la machine de Turing . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3.3 Thèse de Church . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3.4 Machine de Turing déterministe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.3.5 Machine de Turing non déterministe . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4 Décidabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4.1 Problèmes décidables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4.2 Problèmes indécidables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4.3 Définitions formelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.5 Classe P et Classe NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.1 Classe P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.2 Algorithme de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.3 Classe NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3 La NP-Complétude 31
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Réduction de problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.1 Réduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.2 Réduction polynômiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.3 Exemple de réduction polynômiale simple . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Le problème SAT et le théorème de Levin-Cook . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.1 Présentation du problème SAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.2 Une première série de variante : k-SAT . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.3 Variantes autour de 2-SAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4 NP-complétude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.1 Ensemble complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.2 Propriété de la NP-complétude . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.3 Preuve de la NP-complétude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4.4 Interpréter la NP-Complétude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5 Autres problèmes NP-Complets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
iv
CHAPITRE 1
Complexité :
Conceptes & Outils
1.1 Introduction
L’efficacité d’un algorithme se mesure par le temps d’exécution en fonction de la taille des données
d’entrée et la place mémoire nécessaire à son exécution en fonction de la taille des données d’entrée. Ces
deux fonctions sont appelées complexité de l’algorithme. La détermination de ces fonctions s’appelle
l’analyse de complexité. Dans la suite nous n’étudierons que le temps d’exécution. Pour mesurer le
temps d’exécution comme fonction de la taille des données il faut se donner une unité de mesure. Pour
simplifier le modèle on considère comme temps constant les opérations élémentaires exécutés par une
machine (opérations arithmétiques, logiques, affectations, etc.). L’analyse consiste alors à exprimer le
nombre d’opérations effectuées comme une fonction de la taille des données d’entrée.
1
1.2 À propos du temps d’exécution
Figure 1.1 – Puissance de calcul du meilleur ordinateur mondial au fil des ans.
capacités de calcul de moins d’un million d’opérations flottantes par seconde, à plus d’un million de
milliards d’opérations flottantes par seconde.
Cette évolution est était prévisible d’après « la loi de MOORE »Cette révolution oblige à un chan-
gement profond de compréhension des algorithmes qui précisémment commandent ces machines. En
effet, un raisonnement simpliste pourrait consister à penser que la puissance de calcul est pratiquement
infinie.
De fait, beaucoup de programmes peuvent s’exécuter rapidement sur ces supercalculateurs, voire
même sur les ordinateurs que nous cotoyons tous les jours. Cependant, la plupart des calculs que l’ont
peut imaginer ne sont pas, loin s’en faut, simples. Par exemple, beaucoup d’opérations sur une liste font
intervenir l’ordre de la liste en question. Or le nombre d’ordres possibles pour une liste de n éléments, noté
n!, croît excessivement vite. Par exemple, supposons que nous voulions faire sur le meilleur calculateur
existant aujourd’hui, au cours d’une seconde, une opération flottante sur toutes les listes ordonnées
possibles à n éléments. Alors malheureusement, malgré toute notre puissance de calcul, il nous faudrait
nous limiter aux listes à 17 éléments ou moins (17! = 355687428096000 = 3.55 1014 ).
Par ailleurs même si la puissance de calcul va croissant, le coût requis par opération flottante a
tendance à stagner. Cela fait que la consommation énergétique due aux calculs devient phénoménale.
On a estimé que la puissance énergétique totale consommée par les ordinateurs dans le monde était en
2005 de 200T W h, ce qui correspond à la production d’une trentaine de tranches de centrales nucléaires à
800M W att chacune, ou encore, en termes d’empreinte carbone, de 30 million d’automobiles. L’ordinateur
le plus puissant du monde en 2009, le Cray Jaguar, consomme 7M W att pour une puissance de calcul
mesurée de 1, 759T F lops. Ce coût demandé par l’organisation Top500 1 n’est qu’un coût partiel de calcul.
Les spécialistes du calcul haute performance estiment que très bientôt les coûts énergétiques totaux d’un
supercalculateur seraient de l’ordre de 100 MWatt. Tout cela a un coût phénoménal, tant en termes de
ressources financières que planétaires et humaines.
1. http ://www.top500.rog
2
Chapitre 1. Complexité :
Conceptes & Outils
En résumé, les ressources de calcul d’aujourd’hui sont loin d’être infinies, et il convient de les estimer
avec précision.
Ce cours donne les bases d’une bonne analyse des temps de calcul et donne plusieurs exemples
marquants de calcul complexes réalisés dans un temps maîtrisé.
Exemple 1 ()
Le parcours d’une matrice ligne par ligne ou colonne par colonne donne deux temps d’exécution
très différents. Interpréter ? ?
Plusieurs techniques au niveau matériel ou logiciel sont mises-en-œuvre pour améliorer les temps
exécution :
— récupérer les données par bloc à partir de la mémoire ;
— anticiper sur l’accès aux données : pre-fetching ;
— anticiper sur l’exécution des instruction :exécution spéculative ;
— exécuter plusieurs instructions en même temps : processeurs super-scalaires ;
— profiter de la localité temprelle et spaciale des données pour améliorer le profile d’accès aux
données ;
— etc . . .
La mesure de la complexité d’un algorithme c’est :
1. évaluer les ressources (mémoire et CPU) utiles ;
3
1.2 À propos du temps d’exécution
Un algorithme est une suite ordonnée d’opérations ou d’instruction écrites pour la résolution d’un
problème donné. Un algorithme est une suite d’actions que devra effectuer un automate pour arriver à
partir d’un état initial, en un temps fini, à un résultat. L’algorithmique désigne le processus de recherche
d’algorithme.
Structures de données
Une structure de données indique la manière d’organisation des données dans la mémoire. Le choix
d’une structure de données adéquate dépend généralement du problème à résoudre.
Deux types de structures de données :
— Statiques : Les données peuvent être manipulées dans la mémoire dans un espace statique alloué
dès le début de résolution du problème. Exemple : les tableaux
— Dynamiques : On peut allouer de la mémoire pour y stocker des données au fur et à mesure des
besoins de la résolution du problème. Exemple : liste chainée, pile, file, . . .
La notion des pointeurs : nécessité de la gestion des liens entre les données d’un problème en mémoire.
4
Chapitre 1. Complexité :
Conceptes & Outils
De nombreux outils formels ou théoriques ont été développés pour décrire les algorithmes, les étu-
dier, exprimer leurs qualités, pouvoir les comparer entre eux : Ainsi, pour décrire les algorithmes, des
structures algorithmiques ont été mises en évidence : structures de contrôle (boucle, conditionnelle, ...)
et structures de données (variables, listes, ...). Pour justifier de la qualité des algorithmes, les notions de
correction, de complétude et de terminaison ont été mises en place.
Enfin, pour comparer les algorithmes entre eux, une théorie de la complexité des algorithmes a été
définie.
Terminaison : La terminaison est l’assurance que l’algorithme terminera en un temps fini. Les
preuves de terminaison font habituellement intervenir une fonction entière positive strictement décrois-
sante à chaque « pas »de l’algorithme.
Correction : Étant donnée la garantie qu’un algorithme terminera, la preuve de correction doit
apporter l’assurance que si l’algorithme termine en donnant une proposition de solution, alors cette
solution est correcte - c’est-à-dire qu’elle est effectivement une solution au problème posé.
Complétude : La preuve de complétude garantit que, pour un espace de problèmes donné, l’algo-
rithme, s’il termine, donnera des propositions de solutions
Éfficacité : Il faut que le programme exécute sa tâche avec efficacité c’est à dire avec un coût
minimal. Le coût pour un ordinateur se mesure en termes de temps de calcul et d’espace mémoire
nécessaire.
5
1.3 Notions Mathématiques
Définition
Soit un problème P de taille n. On note P(n) une instance de P. On veut calculer la complexité
temporelle T (n) de l’algorithme A qui résout P.
Les notations asymptotiques sont définies comme suit :
∀n ≥ n0 , on a : T (n) ≤ cf (n)
O(f (n)) est l’ensemble des fonction T (n) qui peuvent être bornées supérieurement par cf (n) pour
n suffisamment grand.
6 cf (n)
T (n)
-
n0 n
Exemple 3 ()
T (n)= 60n2 + 5n + 1 ∈ O(n2 ).
car on peut trouver c = 66 et n0 = 1 / ∀n ≥ 1 on a T (n) ≤ 66n2 .
La notation grand-O peut être obtenue à partir de l’expression d T (n) en ne conservant que le terme
le plus fort de l’expression est ignorer les autres.
Exemple 4 ()
6
Chapitre 1. Complexité :
Conceptes & Outils
Exemple 5 ()
On suppose qu’on dispose d’un algorithme dont le temps d’exécution est décrit par la fonction
T (n) = 3n2 + 10n + 10. L’utilisation des règles de la notation O nous permet de simplifier en :
La notation O permet de trouver un majorant. Il existe aussi une autre notation qui permet de
trouver un minorant. C’est la notation « Omega ».
Définition
Une fonction T (n) ∈ Ω(f (n)), si et seulement si ∃ deux constantes n0 et c > 0 telles que :
∀n ≥ n0 , on a T (n) ≥ cf (n)
Ω(f (n)) est l’ensemble de toutes les fonctions T (n) bornées inférieurement par cf (n) pour n suffisament
grand.
7
1.3 Notions Mathématiques
6 T (n)
cf (n)
-
n0 n
Définition
Une fonction T (n) ∈ Θ(f (n)) si et seulement si elle vérifie à la fois T (n) ∈ O(f (n)) et T (n) ∈
Ω(f (n)). C’est-à-dire ∃ deux constantes c1 et c2 telles que :
c2 f (n)
6
T (n)
c1 f (n)
-
n0 n
Application 1 ()
Soit T (n) = 60n2 + 5n + 1
Montrer que T (n) ∈ Θ(n2 )
8
Chapitre 1. Complexité :
Conceptes & Outils
Exemple 8 ()
√
Soient f (n) = n log(n) + log(n) et g(n) = n log(n)
f (n)
⇒ f (n) = Ω(g(n)) car lim → +∞
n→+∞ g(n)
Exemple 9 ()
n3
Soient f (n) = 2 et g(n) = 37n2 + 120n + 17
1.3.8 Propriété
— Reflèxivité
f (n) = O(f (n))
— Transitivité
f (n) = O(g(n)) et g(n) = O(h(n)) alors f (n) = O(h(n))
de même pour Ω et Θ
— Produit par un scalaire
a > 0, a O(f (n) = O(f (n))
— Somme
Par contre,
f (n) = Ω(g(n) ⇔ g(n) = O(f (n))
9
1.4 Variation de la complexités d’un algorithme
Exemple 10 ()
Considérons deux algorithmes A et B résolvent un même problème telles que : TA (n) = 50n2 et
TB (n) = n3
On’a TA (n) = O(n2 ) et TB (n) = O(n3 )
A est meilleurs asympthotique que B.
Remarque
La complexité au meilleur, ou complexité dans le meilleur cas, est le plus petit nombre d’opérations
qu’aura à exécuter l’algorithme sur un jeu de données de taille fixée, ici à n :
Avantage
C’est une borne inférieure de la complexité de l’algorithme sur un jeu de données de taille n.
10
Chapitre 1. Complexité :
Conceptes & Outils
La complexité au pire, ou complexité dans le pire cas, dite aussi cas le plus défavorable (worst-case
en anglais), est le plus grand nombre d’opérations qu’aura à exécuter l’algorithme sur un jeu de données
de taille fixée, ici à n :
Avantage
Il s’agit d’un maximum, et l’algorithme finira donc toujours avant d’avoir effectué Tmax (n) opérations.
Inconvénient
Cette complexité peut ne pas refléter le comportement « usuel »de l’algorithme, le pire cas pouvant
ne se produire que très rarement, mais il n’est pas rare que le cas moyen soit aussi mauvais que le pire
cas.
La complexité en moyenne est la moyenne des complexités de l’algorithme sur des jeux de données
de taille n :
X
Tmoy (n) = P r(d)C(d), d ∈ Dn
Avantage
Elle reflète le comportement « général »de l’algorithme si les cas extrêmes sont rares ou si la com-
plexité varie peu en fonction des données.
Inconvénient
La complexité en pratique sur un jeu de données particulier peut être nettement plus importante que
la complexité en moyenne, dans ce cas la complexité en moyenne ne donnera pas une bonne indication
du comportement de l’algorithme.
En pratique la complexité en moyenne est beaucoup plus difficile à déterminer que la complexité dans
le pire cas, d’une part parce que l’analyse devient mathématiquement difficile, et d’autre part parce qu’il
n’est pas toujours facile de déterminer un modèle de probabilités adéquat au problème.
Définition
Si toutes les configurations des données de taille fixée n sont équiprobables, la complexité en moyenne
s’exprime en fonction du nombre |Dn | de données de taille n :
11
1.4 Variation de la complexités d’un algorithme
1 X
Tmoy (n) = C(d)
|Dn |
d∈Dn
Souvent on partitionne l’ensemble Dn des configurations de taille n selon leur coût, et on évalue la
probabilité P r(Dni ) de chaque classe Di − n des configurations de taille n de coût i.
La complexité en moyenne devient alors :
X
Tmoy (n) = P r(Dni )C(Dni )
i ⊆Dn
Dn
Attention
Ce n’est parce qu’un algorithme est meilleur en moyenne qu’un autre en moyenne, qu’il est meilleur
dans le pire des cas.
1.4.4 Synthèse
C’est l’analyse pessimiste ou au pire qui est généralement adoptée.
En effet, de nombreux algorithmes fonctionnent la plupart du temps dans la situation la plus mauvaise
pour eux.
L’analyse au pire des cas donne une limite supérieure de la performance et elle garantit qu’un
algorithme ne fera jamais moins bien que ce qu’on a établi.
Un algorithme est dit optimal si sa complexité est la complexité minimale parmi les algorithmes de
sa classe.
Même si on s’intéresse quasi-exclusivement à la complexité en temps des algorithmes.
Il est parfois intéressant de s’intéresser à d’autres ressources, comme la complexité en espace (taille
de l’espace mémoire utilisé), la largeur de bande passante requise, . . . etc.
Remarque
Si le comportement de l’algorithme ne dépend pas de la configuration des données, ces trois quantités
sont confondues.
Mais en général, ce n’est pas le cas et l’on ne sait pas si le coût moyen est plus proche du coût minimal
ou du coût maximal (sauf si l’on sait déterminer les fréquences relatives des configurations donnant un
coût minimal et celles donnant un coût maximal).
12
Chapitre 1. Complexité :
Conceptes & Outils
Les algorithmes usuels peuvent être classés en un certain nombre de grandes classes de complexité.
Les complexités les plus utilisées sont :
Définition
la complexité d’un problème est le nombre minimal d’opérations élémentaires à effectuer pour ré-
soudre ce problème : c’est une borne inférieure pour la complexité des algorithmes que l’on peut imaginer
pour traiter ce problème.
13
1.5 Détermination de la complexité d’un algorithme et d’un problème
Un algorithme résolvant un problème P est dit optimal si on sait que c’est impossible de trouver un
autre résolvant P avec une meilleure complexité.
Exemple 11 ()
Pour la multiplication matricielle, il existe une borne inférieure pour ce problème : n2 .
Les problèmes dits « difficiles »pour lesquels il n’existe pas un algorithme dont le temps d’exé-
cution est borné par une fonction polynômiale.
14
Chapitre 1. Complexité :
Conceptes & Outils
Exemple 12 ()
x : entier
y : entier
x←0 /*instruction 1 en O(1) */
y←x2 /*instruction 2 en O(1) */
Exemple 13 ()
si <condition> alors
<traitement 1>
sinon
<traitement 2>
finsi
15
1.6 Exercices
ind_F in
X
T = O(T<traitement> )
i=ind_Deb
1.6 Exercices
Exercice 1 ( pts)
Exercice 2 ( pts)
Sur une machine qui réalise 1010 opérations/sec, calculer les temps d’exécution des algorithmes suivants
selon leurs complexités et la taille des problèmes.
log n n n log n n2 n3 2n
102
105
Exercice 3 ( pts)
Calculer la complexité, en nombre d’opérations arithmétiques, des algorithmes suivants au meilleur et
au pire des cas.
Algo1 :
16
Chapitre 1. Complexité :
Conceptes & Outils
Pour i de 1 a n faire
A[i] ← 0
Pour j de 1 a n faire
A[i] ← A[i] + B[i, j]
D[i, j] ← 0
Si B[i, j] > 0 alors
Pour k de 1 a n faire
D[i, j] ← D[i, j] + B[i, k] × C[k, j]
Finpour
Sinon D[i, j] ← B[i, j] + C[i, j]
Finpour
Finpour
Algo2 :
Si x > 0 alors
Pour i de 1 a n faire
A[i] ← B[i] × C[i]
Pour j de 1 a n faire
D[i,j] ← 0
Pour k de 1 a j faire
D[i,j] ← D[i,j]+X[i,k]*Y[k ,j]
Finpour
Finpour
Finpour
Sinon
Pour i de 1 a n faire
Pour j de 1 a n faire
D[i,j] ← X[i,j]+Y[i,j]
Finpour
Finpour
Finsi
Exercice 4 ( pts)
17
1.6 Exercices
Exercice 5 ( pts)
Exercice 6 ( pts)
Énoncer les algorithmes de tri suivants et calculer leurs complexités en terme de comparaisons et d’af-
fectations.
— Tri Bulles
— Tri permutation
— Tri sélection
— Tri insertion
Proposer une estimation asymthotique en notation O() de ces quantités.
Exercice 7 ( pts)
Partant de
f (n) = O(g(n)) ⇒ O(f (n) + g(n)) = O(g(n))
Exercice 8 ( pts)
Un algorithme résolvant un problème associé à un graphe G = (X, U ) est de complexité O(δm + n) où
n = |X| et m = |U | et δ est le maximum des degrés des nœuds.
Discuter et simplifier l’expression O(δm + n).
Exercice 9 ( pts)
Soit une instance P(n) d’un problème P. Soit un algorithme A(n) résolvant P(n). On note |E(n)| le
nombre d’éléments de l’ensemble d’entrée de A(n). A(n) est dit de coût minimum si la complexité C(n)
de A(n) est d’ordre O(|E(n)|).
1. Écrire un algorithme de recherche d’un élément x dans une liste non tirée de taille n. L’algorithme
est-il de coût minimum ?
18
Chapitre 1. Complexité :
Conceptes & Outils
2. Écrire un algorithme de recherche binaire d’un élément x dans une liste triée de taille n. Quelle
est sa complexité ? Est-il de coût minimum ? Que pensez vous de la définition d’un algorithme de
coût minimum donnée ci-dessus ?
3. Combien de boucles imbriquées doit comporter un algorithme de coût minimum ayant en entrée :
— deux vecteurs d’ordre n ;
— une matrice carrée d’ordre n et un vecteure d’ordre n ;
— une matrice non carrée (m,n) et un vecteur d’ordre n ;
— deux matrices carrée d’ordre n.
Donner dans chaque cas la complexité O(f (n)), f (n) à déterminer.
4. Dans quel cas le tri d’une liste de n éléments peut se faire avec un algorithme de complexité
O(n) ?
Exercice 10 ( pts)
Soit un graphe G = (X, U ) où n = |X| et m = |U | et A la matrice d’adjacence de G. A est une matrice
carrée d’ordre n telle que a(i, j) = 1 s’il exite un arc entre les nœuds i et j, 0 sinon.
On désire calculer le maximum des degrés des n nœuds. Écrire l’algorithme correspondant. Est-il de
coût minimum ?
Exercice 11 ( pts)
Énoncer les algorithmes de tri suivants et calculer leurs complexitÃ
s
c en terme de comparaisons et
d’affectations.
— Tri Bulles
— Tri permutation
— Tri sélection
— Tri insertion
Proposer une estimation asymthotique en notation O() de ces quantités.
19
1.6 Exercices
20
CHAPITRE 2
2.1 Introduction
Les problèmes de décidablité, de complexité et d’approximation sont au cœur de l’informatique
moderne :
— Est-ce qu’un problème est résoluble par une machine ?
— Est-ce qu’un problème est résoluble par une machine en un temps raisonnable ?
— Quelle est la difficulté pour trouver une solution approchée à un problème qui n’est pas résoluble
par une machine en un temps raisonnable ?
— Classer les problèmes en fonction de leur difficulté structurelle indépendamment des technologies
actuelles ou futures ;
— Classer les problèmes en fonction de la difficulté du calcul d’une solution approchée.
D’où la question : tous les problèmes peuvent-ils être résolus en temps polynomial ?
— Non, car certains ne peuvent pas être résolus (non décidabilité de la terminaison) ;
— Non, a priori, car il y a des problèmes pour lesquels on ne connaît que des algorithmes de coût
exponentiel.
On aimerait donc savoir si un problème peut ou non être résolu par un algorithme polynomial : s’il
ne peut exister d’algorithme polynomial pour le résoudre, il vaudra alors sans doute mieux développer
un algorithme d’approximation (ou heuristique) polynomial qu’un algorithme de résolution exact à la
complexité super-polynomiale. La question de l’existence d’un algorithme de résolution de complexité
polynomiale nous amène à définir des classes de complexité : intuitivement on aimerait avoir une classe
des programmes que l’on peut résoudre en temps polynomial, une classe de problème plus compliqués,
et un moyen de déterminer à quelle classe appartient un problème.
21
2.2 Notion de problème
Exemple 1 ()
Décider si un nombre est premier.
— Le langage des instances est N, il peut être représenté par l’ensemble L = {0, 1}∗ ;
— Décider la primalité revient à construire une machine M qui calcule la fonction f de L dans
{0, 1} définie par :
(
1 si x est premier
f (x) =
0 sinon
On définit un problème abstrait Q comme une relation binaire sur un ensemble I d’instances d’un
problème et un ensemble S de solutions de ce problème.
Exemple 2 ()
Prenons le problème PLUS-COURT-CHEMIN qui consiste à trouver le plus court chemin entre deux
sommets d’un graphe.
— Une instance de ce problème est un triplet composé d’un graphe et de deux sommets.
— Une solution du problème est une séquence de sommets du graphe (si la séquence est vide,
il n’existe pas de chemin du graphe reliant les deux sommets).
— Le problème lui-même est la relation qui associe à une instance donnée une ou plusieurs
solutions.
Dans le cadre de la théorie de la NP-complétude, nous nous restreindrons aux problèmes de décision,
c’est-à-dire ceux dont la solution est soit vrai soit faux.
Exemple 3 ()
prenons le problème CHEMIN qui répond à la question « étant donné un graphe G, deux sommets u
et v et un entier positif k, existe-t-il dans G un chemin de u à v de longueur au plus k ? ».
Problèmes d’optimisation
De nombreux problèmes abstraits ne sont pas des problèmes de décisions mais des problèmes d’op-
timisation. Pour leur appliquer la théorie de la NP-complétude, le plus souvent on les reformulera sous
la forme d’un problème d’optimisation en imposant une borne sur la valeur à optimiser, comme nous
l’avons fait en passant du problème PLUS-COURT-CHEMIN au problème CHEMIN.
Ce passage aux problèmes de décision n’est pas restrictif :
22
Chapitre 2. Calculabilité & décidabilité
2.2.2 Codage
Définition
Pour qu’un programme informatique puisse résoudre un problème abstrait, il faut que ces instances
soient représentées sous une forme compréhensible par le programme.
On appelle codage d’un ensemble S d’objets abstraits une application e de S dans l’ensemble des
chaînes binaires (ou dans l’ensemble des chaînes d’un alphabet fini quelconque). Exemple : le classique
codage des entiers sous forme binaire. . . Un algorithme informatique qui « résout »un certain problème
de décision prend en fait en entrée un codage d’une instance de ce problème. Un problème dont les
instances forment l’ensemble des chaînes binaires est appelé problème concret.
On dit qu’un algorithme résout un problème concret en O(T (n)) quand, sur une instance i du
problème de longueur n = |i|, l’algorithme est capable de produire la solution en au plus O(T (n)).
Un problème concret est donc résoluble en temps polynomial s’il existe un algorithme permettant
de le résoudre en temps O(nk ) pour une certaine constante k.
Pour quoi s’embêter avec des codages plutôt que de définir directement la complexité d’un problème
abstrait ? Parce que la complexité dépend du codage. . .Pour le voir, considérons un algorithme qui prend
comme unique entrée un entier k, et dont le temps d’exécution est en Θ(k).
— Si l’entier k est fourni en unaire (son codage est alors une chaîne de k 1), le temps d’exécution
de l’algorithme est en O(n) sur des entrées de longueur n, et l’algorithme est de complexité
polynomiale.
— Si l’entier k est fourni en binaire, la longueur du codage est alors de n = blog2 kc + 1, et le temps
d’exécution de l’algorithme est en Θ(k) = Θ(2n ), et l’algorithme est de complexité superpolyno-
miale.
On ne peut donc pas parler de la complexité de la résolution d’un problème abstrait sans spécifier son
codage.
23
2.3 Machine de Turing
24
Chapitre 2. Calculabilité & décidabilité
1. un ensemble Q d’états,
2. un ensemble Σ de symboles,
3. un état initial ι,
4. un symbole distingué t ∈ Σ (appelé le symbole « blanc »),
5. un ensemble d’états finaux A ⊆ Q,
6. une fonction de transition δ, de Q × Σ dans Q × Σ × {−1, +1}.
Son sens est le suivant :
si la machine est dans l’état q0 et qu’elle lit le symbole σ0 à la position courante du curseur, et en
écrivant δ(q0 , σ0 ) = (q1 , σ1 , 1 ), alors la machine va écrire à l’emplacement du curseur le symbole
σ1, passe à l’état q1 .
Par ailleurs, elle avance le curseur sur la bande d’une case si 0 = +1 et le recule d’une case si
0 = −1.
Exemple 4 ()
La machine de Turing qui suit possède un alphabet {’0’, ’1’}, ’0’ étant le « blanc ». On suppose que
le ruban contient une série de ’1’, et que la tête de lecture/écriture se trouve initialement au-dessus
du ’1’ le plus à gauche.
Cette machine a pour effet de doubler le nombre de ’1’, en intercalant un ’0’ entre les deux séries.
Par exemple, « 111 »devient « 1110111 ». L’ensemble d’états possibles de la machine est e1, e2, e3,
e4, e5 et l’état initial est e1.
25
2.3 Machine de Turing
Ce processus se répète jusqu’à ce que e1 tombe sur un 0 (c’est le 0 du milieu entre les deux séquences
de 1) ; à ce moment, la machine s’arrête.
26
Chapitre 2. Calculabilité & décidabilité
Par exemple à la question existe t-il un chemin eulérien ou hamiltonien, va t-elle répondre VRAI ou
FAUX) dans un temps déterminé.
Theorème 2.3.1. Les langages reconnus par les automates finis déterministes sont exactement ceux
reconnus par les automates finis non-déterministes.
Theorème 2.3.2. Les langages reconnus par un automate fini sont exactement ceux décrits par les
expressions régulières
2.4 Décidabilité
2.4.1 Problèmes décidables
Un codage des instances d’un probème conduit à une représentation des données en mémoire. Si nous
pensons à un modèle d’exécution sur un ordinateur, au niveau élémentaire le codage d’une instance est
une suite de bits à 0 ou à 1. Cette suite de bits est un mot sur l’alphabet Σ = {0, 1}. L’ensemble des
mots codants les instances du problème défini un langage.
Le problème de la reconnaissance d’un langage L consiste à décider pour tout mot ω ∈ Σ∗ si ω
appartient à L. La reconnaissance de langage est l’abstraction par rapport un codage de la résolution
d’un problème de désicion Π, un codage représente chacune des instances comme un mot sur un alphabet
Σ de symboles.
3. Turing Machine
27
2.4 Décidabilité
Nous pouvons ainsi associer à Π le langage LΠ constitué de tous les mots codants à travers un codage
naturel de Π les instances positives. Décider pour une instance x si x ∈ YΠ est alors équivalent à décider
pour le mot ω encodant x si ω ∈ LΠ .
Le Halting problem ou problème d’arrêt n’est pas une procédure effective, il ne connaît pas en
effet pas de solution calculable, il est indécidable.
Un problème est dit triatable s’il admet un algorithme polynomial pour le résoudre.
28
Chapitre 2. Calculabilité & décidabilité
Définition : décidabilité
1. Un problème est décidable si et seulement si il existe une machine de Turing qui résout le problème
et qui s’arrête toujours.
2. Un problème est dit indécidable si il n’est pas décidable.
3. Un problème est semi-décidable si il existe une machine de Turing qui le résout. Il n’y a aucune
condition sur l’arrêt.
2.5.1 Classe P
On définit la classe T IM E(f (n)) comme l’ensemble des langages pouvant être décidés en temps
O(f (n)) par une machine de Turing déterministe.
La classe de complexité P est l’ensemble des problèmes concrets de décision qui sont résolubles en
temps polynomial. Autrement dit, la classe P est l’ensemble des problèmes pour lesquels une machine
de Turing déterministe peut trouver une solution en un temps polynomial.
Définition
La classe P est l’ensemble des langages L pouvant être décidés par une machine de Turing déterministe
polynomiale.
[
P = T IM E(nk )
k
29
2.5 Classe P et Classe NP
Exemple 6 ()
Il est trivial de vérifier qu’un chemin est un cycle hamiltonien (cycle simple contenant tous les som-
mets) d’un graphe donné alors que l’on ne sait résoudre ce problème qu’en temps super polynomial.
Définition
2.5.3 Classe NP
Nous définissons la classe N T IM E(f (n)) comme l’ensemble des langages pouvant être reconnus en
temps O(f (n)) par une machine de Turing non déterministe.
Rappelons qu’une TM non déterministe accepte un mot simplement s’il existe une exécution accep-
tant ce mot. Ainsi une TM non déterministe T reconnait le langage L en temps f (n) si :
— Pour tout mot ω ∈ L, il existe une exécution de T acceptant ω en au plus f (|ω|) transitions.
— Pour tout mot ω ∈ / L, aucune exécution de T (quelle que soit sa longueur) ne conduit à un état
accepteur.
La classe de complexité NP est l’ensemble des problèmes concrets de décision Q pour lesquels il
existe un algorithme polynomial de validation A.
∃c ≥ 0 telle que ∀x instance de Q : Q(x) = vrai ⇐⇒ ∃y certificat , |y| = O(|x|c ), A(x, y) = vrai
Autrement dit, la classe NP est l’ensemble des problèmes pour lesquels une machine de Turing
non-déterministe peut valider une solution en temps polynomial.
Définition
La classe NP est l’ensemble des langages L pouvant être reconnus par une machine de Turing non
déterministe polynomiale. [
NP = N T IM E(nk )
k
Il est clair que nous avons l’inclusion P ⊆ N P . En effet, la machine de Turing déterministe est un
cas particulier de machine de Turing non déterministe. . .
Le problème ouvert le plus célèbre de la complexité est de savoir si P = N P ou si cette inclusion est
stricte.
30
CHAPITRE 3
La NP-Complétude
3.1 Introduction
Le principe de l’étude de la complexité est de classifier les problèmes par rapport au critère de temps
d’exécution sur une machine de Turing.
Les deux classes P et NP que nous avons définies ne semblent pas assez fines pour discriminer la
difficulté des problèmes.
Nous aimerions introduire une relation d’ordre sur les problèmes (langages), signifiant qu’un pro-
blème est plus facile qu’un autre (que le langage correspondant est plus facile à décider que l’autre).
Dans ce cas, la résolution du problème Π2 (y) nous fournira la solution du problème Π1 (x) et le
problème Π1 n’est, dans un certain sens, « pas plus difficile à résoudre »que le problème Π2 .
3.2.1 Réduction
Certains problèmes peuvent être résolus s’il on dispose d’un algorithme résolvant un autre problème.
31
3.2 Réduction de problèmes
Exemple 1 ()
Problème 1 : trouver le maximum d’une suite de nombres ;
Problème 2 : trier en ordre décroissant une suite de nombres.
Si l’on dispose d’un algorithme résolvant le problème 2, alors on a aussi un algorithme résolvant
le problème 1 (pas nécessairement le meilleur)
Les techniques de réduction déjà beaucoup utilisée pour déterminer la (non) calculabilité de pro-
blèmes
a ∈ A ⇔ f (a) ∈ B
Autrement dit, si le mot a est une solution pour l’algorithme A alors f (a) est une solution pour
l’algorithme B.
De manière plus formelle, si le mot a est accepté par la machine de Tuing qui décrit A alors f (a) est
accepté par la machine de Turing qui décrit B.
Du point de vue des problèmes, f est une réduction polynomiale du problème Π au problème Π0 si
elle est une réduction polynomiale entre les langages correspondants.
L’existence d’une réduction polynômiale de Π vers Π0 montre que Π0 est au moins aussi difficile
que Π.
En effet, si Π peut être résolu en temps polynomial, alors Π0 peut l’être aussi ;
si par contre Π requiert un temps exponentiel, alors Π0 ne peut être résolu par un algorithme poly-
nômial.
Notons bien que le sens premier de la réduction de Π vers Π0 est encore plus fort :
une réduction prouve qu’à une transformation polynomiale près des instances, c’est-à-dire à un
codage naturel près de Π, le problème Π est simplement un sous-problème de Π0 .
D’un point de vue algorithmique, une réduction est un « pre-processing »des instances du problème
Π, qui permet d’utiliser tout algorithme polynomial de résolution pour Π0 pour résoudre Π en temps
polynomial.
On notera Π p Π0 si il existe une réduction polynomiale de Π vers Π0 . Nous dirons que Π se réduit
à Π0 .
32
Chapitre 3. La NP-Complétude
Propriétés
— Si A p B et B ∈ P Alors A ∈ P ;
— Si A p B et B ∈ NP Alors A ∈ NP ;
Pour montrer que nous avons la réduction HP p HC, considérons une instance de HP, c’est-à-dire un
graphe G.
La transformation f est évidemment polynomiale. Montrons que c’est une réduction, c’est-à-dire que
G admet une chaîne hamiltonienne si et seulement si f (G) possède un cycle hamiltonien.
Si G possède une chaîne hamiltonienne φ, alors le cycle xφx est hamiltonien dans f (G). Récipro-
quement, si f (G) admet un cycle hamiltonien, son sous-graphe privé de x, G, possède une chaîne
hamiltonienne.
33
3.3 Le problème SAT et le théorème de Levin-Cook
Définition
On dit qu’un problème π est NP-complet s’il est lui-même NP et que tout problème NP se réduit à π
en temps polynomial.
D’une manière générale, tous les problèmes k-SAT sont NP-complets pour k ≥ 3.
L’idée de la réduction à partir de SAT est simplement de réécrire chaque clause comme une clause de
cardinalité 3.
34
Chapitre 3. La NP-Complétude
Exemple 3 ()
Transformer la clause de 5-SAT suivante en une formule de 3-SAT :
(x1 ∨ x2 ∨ x3 ∨ x4 ∨ x5 )
On ajoute une deux variables supplémentaires y1 et y2 et on scinde la caulse en 3. La clause
précédente peut s’écrire aussi :
(x1 ∨ x2 ∨ y1 ) ∧ (y¯1 ∨ x3 ∨ y2 ) ∧ (y¯2 ∨ x4 ∨ x5 )
Il est facile de vérifier que la donnée d’une fonction d’interprétation pour les variables booléennes
satisfait ou non la formule logique, donc SAT ∈ NP, il nous faut maintenant prouver que :
La difficulté vient du fait qu’il faut prouver l’existence d’une réduction pour tous les langages L de
NP. La seule indication dont on dispose est l’existence d’une TM non déterministe qui accepte L en
temps polynomial.
Cook a montré dans la preuve de son théorème l’existence d’une transformation qui à chaque mot ω
et tout langage (problème) L ∈ NP associe une instance LSAT qui est positive si et seulement si ω ∈ L.
3.4 NP-complétude
Définition
Soit A une classe de problèmes. Un problème E est A-complet par rapport à une relation de réduction
si
1. E ∈ A
2. ∀B ∈ A : B E
Un problème E est A-difficile par rapport à une relation de réduction si :
— ∀B ∈ A : B E
35
3.4 NP-complétude
∀B ∈ NP : B p E
Soit E un problème NP-complet, on’a alors :
— E ∈ P ssi P = NP ;
— E 6∈ P ssi P 6= NP ;
— Si E p B et B ∈ NP alors B est NP-complet.
Comment démontrer
— NP ⊆ P
— ou non ( NP ⊆ P )
Prendre un élément E « représentatif »de NP (le plus difficile) et essayer de démontrer
— E∈P
— ou E 6∈ P
36
Chapitre 3. La NP-Complétude
Choisir un élément E qui soit NP-complet par rapport à une relation de réduction p
— E ∈ NP
— ∀B ∈ NP : B p E
a. Montrer que E peut être décidé avec une TM détreministe en un temps polyômial (Écrire cet
algorithme).
b. ou bien, montrer que cet algorithme ne peut pas être décidé avec une TM déterministe en un
temps polynômial (donner une preuve formmelle).
Theorème 3.4.2. Si π1 est un problème tel que π2 p π1 pour un certain problème π2 ∈ NPC, alors π1
est NP-difficile. De plus, si π1 ∈ NP, alors π1 ∈ NPC.
Changer le problème en un problème plus simple. Particulariser le problème pour certaines instances.
37
3.5 Autres problèmes NP-Complets
Utiliser un algorithme exponentiel si la plupart des instances à résoudre sont de complexité sur-
polynomiales
Utiliser la technique d’exploration, mais en se limitant à un nombre polynomial de cas (heuristique) :
Algorithme incomplet.
Si problème d’optimisation, calculer une solution approximative.
HC = ensemble des graphes possédant un circuit hamiltonien (circuit hamiltonien = circuit parcou-
rant une et une seule fois tous les sommets du graphe)
Le problème de la recherche d’un circuit eulerien est dans P.
Étant donnés
— un graphe de n noeuds (villes) ;
— les distances associées à chaque arc (paires de villes) ;
— B : un entier positif,
Existe-t-il un circuit reliant les n noeuds (villes) et de longueur ≤ B ? On peut montrer que HC p
TS
Étant donnés
— un graphe où a et b sont parmi les nœuds ;
— les distances associées à chaque arc ;
— B :un entier positif.
Existe-t-il un chemin reliant a et b et de longueur ≥ B ?
Si on change « et de longueur ≤ B »alors le problème est dans P.
3-SAT
C1 ∧ C2 ∧ · · · ∧ Cn
avec
— Ci = Li1 ∨ Li2 ∨ Li3
— Li1 = Ak ou Li1 = ¬Ak
— Ak est une variable propositionnelle (forme normale conjonctive avec 3 variables par clause)
38
Chapitre 3. La NP-Complétude
Couverture de sommets VC
Étant donnés
— un graphe
— B :un entier positif
Existe-t-il un sous-ensemble des sommets de taille ≤ B qui couvre tous les arcs du graphe (i.e. chaque
arc à au moins une extrémité dans ce sous-ensemble)
Le problème de la couverture des arcs est dans P
Problème de la clique
Étant donnés
— un graphe
— B :un entier positif
Existe-t-il un sous-ensemble des sommets de taille ≥ B qui soit une clique (i.e. chaque paire de
noeuds de ce sous-ensemble est reliée par un arc)
Étant donnés
— un graphe
— B :un entier positif
Est-il possible de colorier les noeuds du graphe en utilisant au plus B couleurs, de telle sorte que
deux noeuds adjacents (i.e. reliés par un arc) soient de couleurs diffèrentes
Problème de partition
Étant donné un ensemble A et une taille s(a) pour chacun de ses éléments,
Existe-t-il un sous-ensemble B ⊆ A tel que
X X
s(a) = s(a)
a∈B a∈A\B
39
Table des figures
3.1 Réduction HP p HC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2 Classification des problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3 Représentation visuelle des deux configurations possibles . . . . . . . . . . . . . . . . . . 37
41
TABLE DES FIGURES
42
Liste des tableaux
43
LISTE DES TABLEAUX
44
Bibliographie
45