Académique Documents
Professionnel Documents
Culture Documents
Quand peut-on considérer qu’un algorithme est efficace ? Faut-il exiger une complexité en
O(n3) ou O(n) ? Il n’y a pas de réponse absolue à cette question, mais quelques limites
significatives peuvent être mises en évidence. Une complexité exponentielle (O(cn) où c>1)
est presque toujours excessive. Considérons par exemple 2n. Pour n=100, ce qui représente
une taille de problème fort modeste, 2100=1030 est un nombre largement excessif. En effet, en
imaginant qu’il représente des nanosecondes, il correspond à une durée de 3 1011 siècles ! La
situation est d'autant plus frappante si l'on considère n = 1000. En fait, il est aisé de se
convaincre que quels que soient les facteurs constants qui affectent une complexité
exponentielle, celle-ci mène toujours à des temps de calcul excessifs même pour des
problèmes dont la taille est très limitée.
Admettons donc qu'une complexité exponentielle est excessive. Peut-on dire que toute
fonction de complexité croissant moins vite qu'une exponentielle est acceptable? En général,
non. Toutefois, la différence entre croissance exponentielle et non exponentielle est
suffisamment forte pour qu'il soit tentant d'y fixer la limite de la complexité acceptable. Plus
précisément, nous considérerons comme acceptable toute fonction de complexité
polynomiale, c'est-à-dire 0(nk) pour un k fixé ! En d'autres termes nous identifierons les
notions d'algorithme efficace et d'algorithme polynomial (de fonction de complexité
polynomiale).
P: easy to find NP: easy to check
Définition : La complexité d’un problème est la complexité minimale dans le pire des cas
d’un algorithme qui le résout.
Note : C’est souvent la complexité en temps qu’on considère mais on peut s’intéresser à
d’autres mesures comme par exemple la complexité en espace.
Par exemple si on dit que la complexité d’un problème est quadratique (O(n2)) cela veut dire:
1. qu’il existe un algorithme quadratique qui le résout.
2. et que tout algorithme qui le résout sera au moins quadratique.
Calculer la complexité d’un problème est une chose extrêmement ardue en général. On se
contente souvent d’encadrer:
• pour trouver une borne supérieure, il suffit de trouver un algorithme.
• pour trouver une ”bonne” borne inférieure, les choses sont souvent plus dures... : pour
montrer par exemple qu’un problème est de complexité au moins exponentielle, il faut
montrer que tout algorithme le résolvant est exponentiel.
P: easy to find NP: easy to check
**********
*******
2. Les classes de Problèmes
L’idée est de classifier les problèmes selon l’ordre de grandeur de leur complexité. Tout
d’abord pour simplifier, on va se limiter aux problèmes de décision.
Définition : Un problème est appelé problème de décision s’il consiste à décider si un élément
appartenant à une certaine famille a « oui » ou « non » une certaine propriété.
Exemple : ”être premier” est une fonction qui à tout entier naturel associe oui -si il est
premier-, non sinon.
Voici quelques exemples de problèmes que nous verrons au cours de ce cours. Certains sont
des problèmes de décision « D », d’autres pas. Cependant vous verrez qu’étant donné un
problème quelconque, il est généralement facile d’en déduire un problème de décision.
• HAM est le problème qui, étant donné un graphe G, consiste à trouver (s’il existe) un
cycle hamiltonien de G.
• HAMD est le problème de décision qui, étant donné un graphe G, consiste à décider si
oui ou non G contient un cycle hamiltonien.
• TSP (“ the traveling salesman probleme”, ou en Français : “le problème du commis
voyageur”) est le problème qui étant donné un graphe complet Kn où on a associé à
chacune des arêtes un certain poids > 0, consiste à trouver un cycle hamiltonien de Kn
dont le poids total soit minimal.
• TSPD est le problème de décision qui étant donné un graphe complet Kn où on a
associé à chacune des arêtes un certain poids >0 et un entier positif k, consiste à
décider s’il existe un cycle hamiltonien dont le poids total soit au plus k.
P: easy to find NP: easy to check
2.1 La classe P
Définition : La classe P (ou PTIME) est la classe des problèmes de décision pour lesquels il
existe un algorithme de résolution polynomial en temps.
Définition : Un problème de décision est dit praticable si il est dans P, impraticable sinon.
”existe-t-il un algorithme praticable pour ce problème?” se ramène à ”ce problème est-il dans
P?”
Exemples de problèmes praticables ou non
• ”Etre pair” est P.
• ”Etre trié” pour une liste d’entiers est P.
• ”Etre premier” est P ... On le sait depuis quelques années seulement.
• ” le problème des échecs généralisés -i.e. la taille de l’échiquier est non fixée, on a une
configuration, on cherche à savoir si elle est gagnante- n’est pas P.
2.2 La classe NP