Vous êtes sur la page 1sur 4

P: easy to find NP: easy to check

Chapitre 4 : Complexité en temps et espace mémoire

Problématique : Intuitivement, un algorithme est efficace s’il n’utilise qu’une quantité


raisonnable des ressources nécessaires au calcul. Une telle définition peut sembler impossible
à formaliser. En effet, des ressources déraisonnables pour un calcul manuel, ne les sont pas
forcement pour un calcul fait par une machine. De même, ce qui est infaisable sur un micro-
ordinateur peut être facilement réalisé à l’aide d’un super-ordinateur, et ce qui est
inaccessible aux machines actuelles les plus rapides ne présentera peut-être pas la moindre
difficulté pour les machines du future. En d’autre termes, le mot « déraisonnable » est une
notion relative à la technologie actuelle.

Alternative : En échappant à la technologie disponible, la complexité nous fournit un outil


efficace pour mesurer cette notion. Plus précisément, les ressources utilisées par l’algorithme
sont caractérisées par la fonction exprimant la quantité de ces ressources en termes de la taille
de l’instance du problème traité.

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 : Étant donné un algorithme A. Si on considère le temps d’exécution comme un


fonction de n où n est la taille des données d’entrée, on dira que l’algorithme A roule en
temps polynomial (ou plus simplement, que l’algorithme A est polynomial) si son temps
d’exécution est dans O(p(n)) pour un certain polynôme p.
Il peut paraître audacieux d'identifier polynomial est efficace. Deux arguments justifient
néanmoins ce choix. Il est clair qu'un algorithme polynomial de complexité O(n100) n'est pas
efficace. Toutefois, en pratique, ce genre d'algorithme est très rare. Le plus souvent, quand un
algorithme polynomial existe pour un problème, sa complexité est un polynôme de degré peu
élevé (≤5). Les algorithmes polynomiaux existants sont donc le plus souvent efficaces (en
pratique, on jugera de l'efficacité des algorithmes polynomiaux au cas par cas). D'autre part,
notre but présent n'est pas d'établir l'existence d'algorithmes efficaces, mais bien de montrer
que, pour certains problèmes, il n'existe pas d'algorithmes efficaces. Dans cette optique, il est
tout à fait raisonnable de considérer qu'un problème pour lequel il n'existe pas d'algorithme
polynomial n'a pas de solution efficace.

1. La complexité d’un problème


L’étude de la complexité des problèmes s’attache à déterminer la complexité intrinsèque
d’un problème et à classifier les problèmes selon celle-ci, donc à répondre à des questions
comme:
• Quelle est la complexité minimale d’un algorithme résolvant tel problème?
• Existe-t-il un algorithme polynomial pour résoudre un problème donné?
• Comment peut-on dire qu’un algorithme est optimal (en complexité)?
• Comment peut-on montrer qu’il n’existe pas d’algorithme polynomial pour un
problème?
• Qu’est-ce qu’un problème ”dur”?
• Comment prouver qu’un problème est au moins aussi “dur” qu’un autre?

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

L’exemple de la multiplication, On conjecture que la multiplication de deux entiers de


longueur n peut se faire en O(n log n). Le meilleur algorithme connu est en O(n log n log log
n). La meilleure borne inférieure trouvée est O(n).

Il y a trois méthodes pour trouver une borne inférieure :


1. Les méthodes dites d’oracle ou d’adversaire
2. Les arbres de décision
3. Les réductions

**********
*******
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é.

Un problème de décision peut donc être vu comme un ensemble I d’instances du problème


(une entrée) avec pour chaque instance une réponse “oui” ou “non”.

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.

Cette définition est (quasiment-) indépendante du modèle d’algorithme choisi: un algorithme


polynomial en C sera polynomial si il est traduit en termes de machine de Turing et les
modèles classiques de calcul (excepté les ordinateurs quantiques) sont polynomialement
équivalents.

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.

Quelques autres exemples de classes

• PSPACE: la classe des problèmes de décision pour lesquels il existe un algorithme de


résolution polynomial en espace. Bien sûr PTIME est inclus dans PSPACE: un algo
polynômial en temps ”consomme au plus un espace polynômial”.
• EXPTIME: la classe des problèmes de décision pour lesquels il existe un algorithme
de résolution exponentiel en temps.

2.2 La classe NP

Elle contient beaucoup de propriétés associées à des problèmes courants: problèmes de


tournées, d’emploi du temps, placement de tâches, affectation de fréquences, rotation
d’équipages, découpage...

Vous aimerez peut-être aussi