Théorie de la complexité
(informatique théorique)
La théorie de la complexité est un domaine des mathématiques, et plus précisément de
l'informatique théorique, qui étudie formellement la quantité de ressources (en temps et en
espace) nécessaire pour la résolution de problèmes au moyen de l'exécution d'un algorithme.
Il s'agit donc d'étudier la difficulté intrinsèque de problèmes posés mathématiquement.
Sommaire
1 Introduction
2 Problème algorithmique
3 Définition
o 3.1 Exemple de problème
o 3.2 Réponse algorithmique
o 3.3 Complexité d'un problème algorithmique
o 3.4 De l'existence à la décision
4 Modèle de calcul
5 Complexité en temps et en espace
o 5.1 Les quatre familles de classes de complexité en temps et en espace
6 Classes de complexité
o 6.1 Classes L et NL
o 6.2 Classe P
o 6.3 Classe NP et classe Co-NP (complémentaire de NP)
o 6.4 Classe PSPACE
o 6.5 Classe EXPTIME
o 6.6 Classe NC (Nick's Class)
o 6.7 Classes probabilistes
o 6.8 Autres classes
o 6.9 Inclusions des classes
o 6.10 Problèmes C-complets ou C-difficiles
6.10.1 Définition
6.10.2 Exemples
o 6.11 Réduction de problèmes
7 Problèmes ouverts en théorie de la complexité
o 7.1 Le problème ouvert P=NP
o 7.2 Autres problèmes
8 Notes
9 Bibliographie
10 Voir aussi
o 10.1 Articles connexes
o 10.2 Liens externes
Introduction
Un algorithme répond à un problème. Il est composé d'un ensemble d'étapes simples
nécessaires à la résolution, dont le nombre varie en fonction du nombre d'éléments à traiter.
D'autre part, plusieurs algorithmes peuvent répondre à un même problème. Pour savoir quelle
méthode est plus efficace il faut les comparer. Pour cela, on utilise une mesure que l'on
appelle la complexité qui représente le nombre d'étapes qui seront nécessaires pour résoudre le
problème pour une entrée de taille donnée.
La théorie de la complexité s'attache à connaître la difficulté (ou la complexité) d'une réponse
par algorithme à un problème, dit algorithmique, posé de façon mathématique. Pour la définir,
il faut présenter les concepts de problèmes algorithmiques, de réponses algorithmiques aux
problèmes, et la complexité des problèmes algorithmiques.
Problème algorithmique
Définition
Un problème algorithmique est un problème posé de façon mathématique, c'est-à-dire qu'il est
énoncé rigoureusement dans le langage des mathématiques – le mieux étant d'utiliser le calcul
des prédicats. Il comprend des hypothèses, des données[1] et une question. On distingue deux
types de problèmes :
les problèmes de décision : ils posent une question dont la réponse est oui ou non ;
les problèmes d'existence ou de recherche d'une solution : ils comportent une
question ou plutôt une injonction de la forme « trouver un élément tel que …» dont la
réponse consiste à fournir un tel élément.
La théorie de la complexité étudie principalement (mais pas uniquement) les problèmes
de décisions.
Exemple de problème
Un exemple de problème de décision est:
"Etant donné un entier n celui-ci est-il premier?"
Réponse algorithmique
Dans chaque catégorie de problèmes ci-dessus, on dit qu'un problème a une réponse
algorithmique si sa réponse peut être fournie par un algorithme. Un problème est décidable s'il
s'agit d'un problème de décision – donc d'un problème dont la réponse est soit oui soit non –
et si sa réponse peut être fournie par un algorithme. Symétriquement, un problème est
calculable s'il s'agit d'un problème d'existence et si l'élément calculé peut être fourni par un
algorithme. La théorie de la complexité ne couvre que les problèmes décidables ou
calculables et cherche à évaluer les ressources – temps et espace mémoire – mobilisées pour
obtenir algorithmiquement la réponse.
Complexité d'un problème algorithmique
La théorie de la complexité vise à savoir si la réponse à un problème peut être donnée très
efficacement, efficacement ou au contraire être inatteignable en pratique (et en théorie), avec
des niveaux intermédiaires de difficulté entre les deux extrêmes ; pour cela, elle se fonde sur
une estimation – théorique – des temps de calcul et des besoins en mémoire informatique.
Dans le but de mieux comprendre comment les problèmes se placent les uns par rapport aux
autres, la théorie de la complexité établit des hiérarchies de difficultés entre les problèmes
algorithmiques, dont les niveaux sont appelés des « classes de complexité ». Ces hiérarchies
comportent des ramifications, suivant que l'on considère des calculs déterministes – l'état
suivant du calcul est « déterminé » par l'état courant – ou non déterministes.
De l'existence à la décision
Un problème d'existence peut être transformé en un problème de décision équivalent. Par
exemple, le problème du voyageur de commerce qui cherche, dans un graphe dont les arêtes
sont étiquetées par des coûts, à trouver un cycle, de coût minimum, passant une fois par
chaque sommet, peut s'énoncer en un problème de décision comme suit : Existe-t-il un cycle
passant une fois par chaque sommet tel que tout autre cycle passant par tous les sommets ait
un coût supérieur. L'équivalence de ces deux problèmes suppose que la démonstration
d'existence repose sur un argument constructif, c'est-à-dire, par exemple, dans le cas du
voyageur de commerce, fournissant effectivement un cycle de coût minimum dans le cas où
l'on a montré qu'un cycle de coût minimum existe. Le problème de l'existence d'un cycle de
coût minimum est équivalent au problème du voyageur de commerce, au sens où si l'on sait
résoudre efficacement l'un, on sait aussi résoudre efficacement l'autre. Dans la suite de cet
article, nous ne parlerons donc que de problèmes de décision.
Modèle de calcul
L'analyse de la complexité est étroitement associée à un modèle de calcul. L'un des modèles
de calcul les plus utilisés est celui des machines abstraites dans la lignée du modèle proposé
par Alan Turing en 1936.
Articles connexes : Machine de Turing et Random access machine.
Les deux modèles les plus utilisés en théorie de la complexité sont :
la machine de Turing,
la machine RAM (Random Access Machine).
Dans ces deux modèles de calcul, un calcul est constitué d'étapes élémentaires ; à chacune de
ces étapes, pour un état donné de la mémoire de la machine, une action élémentaire est choisie
dans un ensemble d'actions possibles. Les machines déterministes sont telles que chaque
action possible est unique, c'est-à-dire que l'action à effectuer est dictée de façon unique par
l'état courant de celle-ci. S'il peut y avoir plusieurs choix possibles d'actions à effectuer, la
machine est dite non déterministe. Il peut sembler naturel de penser que les machines de
Turing non déterministes sont plus puissantes que les machines de Turing déterministes,
autrement dit qu'elles peuvent résoudre en un temps donné des problèmes que les machines
déterministes ne savent pas résoudre dans le même temps.
D'autres modèles de calcul qui permettent d'étudier la complexité s'appuient sur :
les fonctions récursives, dues à Kleene ;
le lambda-calcul ;
les automates cellulaires ;
la logique linéaire.
Complexité en temps et en espace
Sans nuire à la généralité on peut supposer que les problèmes que nous considérons n'ont
qu'une donnée. Cette donnée a une taille qui est un nombre entier naturel. La façon dont cette
taille est mesurée joue un rôle crucial dans l'évaluation de la complexité de l'algorithme.
Ainsi, si la donnée est elle-même un nombre entier naturel, sa taille peut être appréciée de
plusieurs façons : on peut dire que la taille de l'entier p vaut p, mais on peut aussi dire qu'elle
vaut log(p) parce que l'entier a été représenté en numération binaire ou décimale, ce qui
raccourcit la représentation des nombres. Ainsi, 1 024 peut être représenté avec seulement
onze chiffres binaires et quatre chiffres décimaux et donc sa taille est 11 ou 4, et non pas de
l'ordre de 1 000. En pratique, c'est cette deuxième taille qui est utilisée, à la fois parce qu'elle
correspond à la représentation usuelle des données sur une machine, et parce que la théorie de
l'information montre qu'on ne peut essentiellement pas la diminuer encore. Le but de la
théorie de la complexité est de donner une évaluation du temps de calcul ou de l'espace de
calcul nécessaire en fonction de cette taille, qui sera notée n. L'évaluation des ressources
requises permet de répartir les problèmes dans des classes de complexité.
Pour les machines déterministes, on définit la classe TIME(t(n)) des problèmes qui peuvent
être résolus en temps t(n), c'est-à-dire pour lesquels il existe au moins un algorithme sur une
machine déterministe résolvant le problème en temps t(n). Le temps est le nombre de
transitions sur machine de Turing ou le nombre d’opérations sur machine RAM. Mais, en fait,
ce temps n'est pas une fonction précise, mais un ordre de grandeur. On parle aussi
d'évaluation asymptotique. En particulier les constantes multiplicatives sont
systématiquement ignorées grâce au théorème de speedup linéaire. Ainsi, pour un temps qui
s'évalue par un polynôme, ce qui compte, c'est le degré du polynôme. Si ce degré est 2, on
dira que l'ordre de grandeur est en O(n²), que la complexité est quadratique, et que le
problème appartient à la classe TIME(n²).
Les quatre familles de classes de complexité en temps et en espace
Suivant qu'il s'agit de temps et d'espace, de machine déterministes ou non déterministes, on
distingue quatre familles principales de classes de complexité :
TIME(t(n))
La classe des problèmes de décision qui peuvent être résolus en temps de l'ordre de
grandeur de t(n) sur une machine déterministe.
NTIME(t(n))
La classe des problèmes de décision qui peuvent être résolus en temps de l'ordre de
grandeur de t(n) sur une machine non déterministe.
SPACE(s(n))
La classe des problèmes de décision qui requièrent pour être résolus un espace de
l'ordre de grandeur de s(n) sur une machine déterministe.
NSPACE(s(n))
La classe des problèmes de décision qui requièrent pour être résolus un espace de
l'ordre de grandeur de s(n) sur une machine non déterministe.
Classes de complexité
Les classes de complexité sont des ensembles de problèmes qui ont la même complexité selon
un certain critère. Dans ce qui suit nous allons définir quelques classes de complexité parmi
les plus étudiées en une liste qui va de la complexité la plus basse à la complexité la plus
haute. Il faut cependant avoir à l'esprit que ces classes ne sont pas totalement ordonnées.
Commençons par la classe constituée des problèmes les plus simples, à savoir : ceux dont la
réponse peut être donnée en temps constant. Par exemple, la question de savoir si un nombre
entier est positif peut être résolue sans vraiment calculer, donc en un temps indépendant de la
taille du nombre entier. C'est la plus basse des classes de problèmes.
La classe des problèmes linéaires est celle qui contient les problèmes qui peuvent être décidés
en un temps qui est une fonction linéaire de la taille de la donnée. Il s'agit des problèmes qui
sont en O(n).
Souvent au lieu de dire : « un problème est dans une certaine classe C », on dit plus
simplement : « le problème est dans C ».
Classes L et NL
Articles détaillés : L (complexité) et NL (complexité).
Un problème de décision qui peut être résolu par un algorithme déterministe en espace
logarithmique par rapport à la taille de l'instance est dans L. Avec les notations introduites
plus haut, L = SPACE(log(n)). La classe NL s'apparente à la classe L mais sur une machine
non déterministe (NL = NSPACE(log(n)). Par exemple, savoir si un élément appartient à un
tableau trié peut se faire en espace logarithmique.
Classe P
Article détaillé : P (complexité).
Un problème de décision est dans P s'il peut être décidé sur une machine déterministe en
temps polynomial par rapport à la taille de la donnée. On qualifie alors le problème de
polynomial. C'est un problème de complexité , pour un certain .
Un exemple de problème polynomial est celui de la connexité dans un graphe. Étant donné un
graphe à s sommets (on considère que la taille de la donnée, donc du graphe, est son nombre
de sommets), il s'agit de savoir si toutes les paires de sommets sont reliées par un chemin. Un
algorithme de parcours en profondeur construit un arbre couvrant du graphe à partir d'un
sommet. Si cet arbre contient tous les sommets du graphe, alors le graphe est connexe. Le
temps nécessaire pour construire cet arbre est au plus c.s² (où c est une constante et s le
nombre de sommets du graphe), donc le problème est dans la classe P.
On admet, en général, que les problèmes dans P sont ceux qui sont faciles à résoudre[4].
Classe NP et classe Co-NP (complémentaire de NP)
Articles détaillés : NP (complexité) et co-NP.
La classe NP des problèmes Non-déterministes Polynomiaux réunit les problèmes de
décision qui peuvent être décidés sur une machine non déterministe en temps polynomial. De
façon équivalente, c'est la classe des problèmes qui admettent un algorithme polynomial
capable de tester la validité d'une solution du problème. On dit aussi qu'un problème de
décision est dans la classe NP s'il existe pour chaque solution positive un certificat
polynomial, c'est-à-dire s'il existe pour chaque donnée pour laquelle la réponse est « oui », un
certificat de longueur polynomiale en la taille de la donnée, tel que la vérification de la
réponse pour la donnée munie de son certificat se réalise en temps polynomial.
Intuitivement, les problèmes dans NP sont les problèmes qui peuvent être résolus en
énumérant l'ensemble des solutions possibles et en les testant à l'aide d'un algorithme
polynomial.
Par exemple, la recherche de cycle hamiltonien dans un graphe peut se faire par
l'enchainement de deux algorithmes :
le premier engendre l'ensemble des cycles (en temps exponentiel, classe EXPTIME,
voir ci-dessous) ;
puis le second teste les solutions (en temps polynomial).
Ce problème est donc dans la classe NP.
La classe duale de la classe NP, qui s'intéresse à la négation de la propriété donnée, est
appelée Co-NP. Intuitivement, Co-NP est l'ensemble des problèmes qui admettent quand ils
sont faux des contre-exemples calculables en temps polynomial.
On a P ⊆ NP. En effet, il existe un algorithme qui étant donné une instance du problème et un
certificat, ne regarde que l'instance et retourne si elle est vraie ou non. Tout problème dans P
est ainsi dans NP.
Classe PSPACE
Article détaillé : PSPACE.
La classe PSPACE est celle des problèmes décidables par une machine déterministe en espace
polynomial par rapport à la taille de sa donnée. On peut aussi définir la classe NSPACE ou
NPSPACE des problèmes décidables par une machine non déterministe en espace polynomial
par rapport à la taille de sa donnée. Par le théorème de Savitch, on a PSPACE = NPSPACE,
c'est pourquoi on ne rencontre guère les notations NSPACE ni NPSPACE.
Classe EXPTIME
Article détaillé : EXPTIME.
La classe EXPTIME rassemble les problèmes décidables par un algorithme déterministe en
temps exponentiel par rapport à la taille de son instance.
Classe NC (Nick's Class)
La classe NC est la classe des problèmes qui peuvent être résolus en temps poly-
logarithmique (c'est-à-dire résolus plus rapidement qu'il ne faut de temps pour lire
séquentiellement leurs entrées) sur une machine parallèle ayant un nombre polynomial
(c'est-à-dire raisonnable) de processeurs.
Intuitivement, un problème est dans NC s'il existe un algorithme pour le résoudre qui peut être
parallélisé et qui gagne à l'être. C'est-à-dire, si la version parallèle de l'algorithme (s'exécutant
sur plusieurs processeurs) est significativement plus efficace que la version séquentielle.
Par définition, NC est un sous ensemble de la classe P (NC ⊆ P) car une machine parallèle
peut être simulée par une machine séquentielle.
Mais on ne sait pas si P ⊆ NC (et donc si NC = P). On conjecture que non, en supposant qu'il
existe dans P des problèmes dont les solutions sont intrinsèquement non parallélisables.
Classes probabilistes
Certaines classes de complexité sont dites probabilistes (ou randomizées). Leurs définitions
font alors appel à des machines de Turing un peu spéciales qui peuvent tirer des bits aléatoires
pour faire leurs calculs : les machines de Turing probabilistes.
On a par exemple les classes ZPP, RP et BPP, qui sont toutes en temps polynomiale mais
diffèrent par leurs conditions d'acceptation.
Autres classes
Un grand nombre de classes de complexité ont été définies. On peut citer les classes
quantiques comme BQP, les classes issues de la cryptographie comme IP (dans le cadre des
systèmes de preuves interactives) ou PCP, ou encore les classes de circuits qui utilisent des
circuits booléens, comme P/poly.
Inclusions des classes
On a les inclusions :
L ⊆ NL ⊆ NC ⊆ P ⊆ NP ⊆ PSPACE = NPSPACE ⊆ EXPTIME ⊆ NEXPTIME
P ⊆ Co-NP ⊆ PSPACE.
Les théorèmes de hiérarchie assurent que
NL ⊊ PSPACE
P ⊊ EXPTIME
NP ⊊ NEXPTIME
et on ne sait pas aujourd'hui ce qu'il en est des inclusions plus fortes.
Problèmes C-complets ou C-difficiles
Définition
Soit C une classe de complexité (comme P, NP, PSPACE, etc.). On dit qu'un problème est
C-difficile si ce problème est au moins aussi difficile que tous les problèmes dans C. Un
problème C-difficile qui appartient à C est dit C-complet.
Formellement, on définit une notion de réduction : soient Π et Π' deux problèmes ; une
réduction de Π' à Π est un algorithme (ou une machine) d'une complexité donnée (qu'on sait
être inférieure à celle de la classe) C transformant toute instance de Π' en une instance de Π.
Ainsi, si l'on a un algorithme pour résoudre Π, on sait aussi résoudre Π'. On peut donc dire
que Π est au moins aussi difficile à résoudre que Π', à la complexité de la réduction près.
Π est alors C-difficile si pour tout problème Π' de C, Π' se réduit à Π. La notion de C-difficile
peut varier selon le type de complexité que l'on autorise pour la réduction. Dans beaucoup de
cas on s'intéresse aux réductions polynomiales, c'est-à-dire celle demandant uniquement un
espace et un temps polynomial pour être effectuée. Mais on peut également s'intéresser à
d'autre type de réduction comme celles utilisant un espace logarithmique, afin d'étudier par
exemple le lien entre les classes P et L.
La relation de réduction étant réflexive et transitive, elle définit un pré-ordre sur les
problèmes. Ainsi, on la note usuellement avec le symbole ≤ : on a Π'≤Π si Π' se réduit à Π.
On peut apposer au symbole une lettre précisant le type de réduction que l'on sautorise: par
exemple signifie habituellement qu'il existe une réduction polynomiale de Π vers
Π'. Les problèmes C-difficiles sont les majorants de C et les problèmes C-complets sont les
plus grands éléments de C.
Exemples
Article détaillé : Problème NP-complet.
Les problèmes NP-complets sont un cas particulier important de ce concept. De manière
standard, ils sont définis en autorisant uniquement des réductions polynomiales, c'est-à-dire
que l'algorithme qui calcule le passage d'une instance de Π' à une instance de Π est
polynomial. Le théorème de Cook-Levin, dû à Stephen Cook et à Leonid Levin, énonce qu'il
existe un problème NP-complet. Plus précisément, Cook a montré que le problème SAT est
NP-complet. On a par la suite établi la NP-complétude de nombreux autres problèmes.
On qualifie de NP-complets les problèmes décisionnels, c'est-à-dire ceux dont la réponse est
de type binaire (oui/non, vrai/faux, 1/0, …). On qualifie de NP-difficiles les problèmes
d'optimisation, c'est-à-dire que la réponse est de type numérique. À un problème
d'optimisation NP-difficile est associé un problème de décision NP-complet, mais dire qu'un
problème NP-difficile est aussi NP-complet est un abus de langage.
Quand on parle de problèmes P-complets ou P-difficiles on s'autorise uniquement des
réductions dans LOGSPACE.
Réduction de problèmes
Article détaillé : Réduction polynomiale.
Pour montrer qu'un problème Π est C-difficile pour une classe C donnée, il y a deux façons
de procéder : ou bien montrer que tout problème de C se réduit à Π, ou bien montrer qu’un
problème C-complet se réduit à Π. Par exemple, démontrons avec la seconde méthode que le
problème de la recherche de circuit hamiltonien dans un graphe orienté est NP-complet.
Le problème est dans NP, autrement dit, il peut être résolu par un algorithme
polynomial sur une machine non déterministe. Il suffit par exemple d'engendrer de
façon non déterministe un circuit, puis de tester s'il est hamiltonien.
On sait que le problème de la recherche d'un cycle hamiltonien dans un graphe non
orienté est NP-difficile. Or un graphe non orienté peut se transformer en un graphe
orienté en créant deux arcs opposés pour chaque arête. Il est donc possible de ramener
le problème connu, NP-complet, à savoir chercher un cycle hamiltonien dans un
graphe non orienté, au problème que nous voulons classer, à savoir chercher un circuit
hamiltonien dans un graphe orienté. Le problème de l'existence d'un circuit
hamiltonien est donc NP-complet.
Problèmes ouverts en théorie de la complexité
Le problème ouvert P=NP
Article détaillé : Problème P = NP.
On a clairement P ⊆ NP car un algorithme déterministe est un algorithme non déterministe
particulier, ce qui, dit en mots plus simples, signifie que si une solution peut être calculée en
temps polynomial, alors elle peut être vérifiée en temps polynomial. En revanche, la
réciproque : NP ⊆ P, qui est la véritable difficulté de l'égalité P = NP, est un problème ouvert
fondamental de l'informatique théorique. Il a été posé en 1970 indépendamment par Stephen
Cook et Leonid Levin ; il fait partie des listes, établies en 2000, des problèmes du prix du
millénaire et des problèmes de Smale.
La plupart des spécialistes conjecturent que les problèmes NP-complets ne sont pas solubles
en un temps polynomial (donc, que P ≠ NP). Cela ne signifie pas pour autant que toute
tentative de résoudre un problème NP-complet est vaine (voir la section « Résolution » de
l'article sur la NP-complétude). Il existe de nombreuses approches (qui se sont finalement
révélées irrémédiablement erronées) attaquant le problème P ≠ NP ; le spécialiste de la
théorie de la complexité Gerhard Woeginger maintient une liste de ces erreurs[5]. La
revendication récente (6 août 2010) de Vinay Deolalikar[6], travaillant aux HP Labs (en), d'une
démonstration de P ≠ NP, a été la première à faire l'objet d'une attention relativement
importante de nombreux mathématiciens et informaticiens de renom, que ce soit sous la forme
d'échanges dans des blogs[7],[8],[9], de journaux en ligne ou sous la forme plus construite d'un
projet d'étude collaborative en ligne (du type Polymath project (en), tel que promu par les
médaillés Fields Terence Tao et Tim Gowers). Cette étude collaborative donne la liste des
points où l'approche de Vinay Deolalikar achoppe actuellement[10].
Autres problèmes
On ne sait pas par exemple si
L=NL
L=P
P=NP
NP=co-NP
P=Pspace
NP=Pspace
Exptime=NExptime
Notes
1. ↑ Les données sont aussi appelées des instances.
2. ↑ En fait, existence constructive et réponse par algorithme vont de pair, et cette exigence est tout à fait
naturelle.
3. ↑ À noter qu'en théorie de la complexité, on parle toujours d'ordre de grandeur.
4. ↑ Il s'agit évidemment d'une convention, car un problème ayant une complexité ne
peut pas être considéré comme facile à résoudre.
5. ↑ (en) The P-versus-NP page [archive], page personnelle de Gerhard J. Woeginger, de l'université
technique d'Eindhoven
6. ↑ (en) Vinay Deolalikar [archive], page personnelle aux HP Labs
7. ↑ (en) Putting my money where my mouth isn't [archive], sur le blog de Scott Aaronson
8. ↑ (en) Gödel's lost letter and P=NP [archive], sur le blog de Dick Lipton
9. ↑ (en) P ≠ NP [archive], sur le blog de Greg Baker & Katrina G. Salvante
10. ↑ (en) Deolalikar P vs NP paper [archive], sur le wiki du projet polymaths
Bibliographie [modifier]
Olivier Carton, Langages formels, calculabilité et complexité [détail des éditions] [lire en
ligne (page consultée le 16 juin 2011)] [présentation en ligne]
(en) Sanjeev Arora et Boaz Barak, Computational Complexity : A modern Approach,
Cambridge University Press, 2009 (ISBN 0-521-42426-7)
(en) Christos Papadimitriou, Computational Complexity, Addison-Wesley, 1993
(ISBN 978-0-201-53082-7)
(en) Michael R. Garey et David S. Johnson, Computers and Intractability : A guide to
the theory of NP-completeness, W.H. Freeman & Company, 1979 (ISBN 0-7167-1045-5)
Richard Lassaigne et Michel de Rougemont, Logique et Complexité, Hermes, 1996
(ISBN 2-86601-496-0)
Nicolas Hermann et Pierre Lescanne, Est-ce que P = NP ? Les Dossiers de La
Recherche, 20:64–68, août-octobre 2005
Voir aussi [modifier]
Sur les autres projets Wikimedia :
Complexité algorithmique, sur Wikiversity
Articles connexes [modifier]
Complexité, article général sur la complexité
Complexité de Kolmogorov
Explosion combinatoire
Machine de Turing non déterministe
Réduction polynomiale
Liens externes [modifier]
(en) Complexity Zoo
(en) The Status of the P versus NP Problem : cet article, publié dans les Comm. of the
ACM, a été cité par l'article New York Times ci-dessous.
(en) « Prizes Aside, the P-NP Puzzler Has Consequences », The New York Times, 7
octobre 2009
[afficher]
v · d · m
Théorie de la complexité (informatique théorique)
L •NL • P • NP (NP-complet •co-NP •co-NP-complet) •PSPACE •
Classes classiques
EXPTIME • NEXPTIME • EXPSPACE
Classes randomisées et
RP •ZPP •BPP •BQP •IP •Protocoles d'Arthur et Merlin •PP
quantiques
Autres P/poly •NC
Classes de fonctions
#-P (#-P-complet)
calculables
Hiérarchies Hiérarchie polynomiale
Théorèmes Théorème de Savitch •Théorème d'Immerman-Szelepcsényi •Théorème
structurels PCP •Théorème de Karp-Lipton •Théorème de Sipser-Gács-Lautemann
Outils et
Théorème de speedup linéaire •Théorème de Cook •Réduction polynomiale
réductions
[afficher]
v · d · m
Informatique théorique
Décidabilité et indécidabilité • Ensemble récursif • Problème de l'arrêt •
Calculabilité
Ensemble récursivement énumérable
Théorie des automates •Automate fini • Transducteur fini • Automate sur
les mots infinis •Automate d'arbres • Automate à pile • Automate
Modèle de calcul
linéairement borné • Automate cellulaire • Machine de Turing • Thèse de
Church
Modes de calcul Concurrence • Parallèlisme • Théorie de l'ordonnancement
Mesure et échelle
Réduction polynomiale • Problème NP-complet
de complexité
Assistant de preuve • Calcul des prédicats • Correspondance de
Logique mathématique Curry-Howard • Fonction récursive • Lambda-calcul • Théorème
d'incomplétude de Gödel • Théorie des types
Compilation • Expression rationnelle • Grammaire formelle •
Grammaire formelle et
Transduction rationnelle • Langage rationnel • Langage
systèmes de réécriture
algébrique • Langage contextuel • Théorie des langages
Sémantique des langages de programmation • Sémantique
Sémantique dénotationnelle • Sémantique axiomatique • Sémantique
opérationnelle
Spécifier, vérifier et Interprétation abstraite • Méthodes formelles • Model checking
concevoir des
programmes
Algorithme génétique • Algorithme glouton • Algorithme
Algorithmique probabiliste • Complexité algorithmique • Diviser pour régner •
Heuristique • Programmation dynamique
Problèmes et Algorithme du simplexe • Géométrie algorithmique • Algorithme
algorithmes numériques d'Euclide • Test de primalité
Problèmes et Algorithmes de la théorie des graphes • Arbre (structure de
algorithmes non- données) • Liste (informatique) • Table de hachage • Tas
numériques (informatique)
Théorie des graphes Coloration de graphe • Problèmes de cheminement
Recherche Optimisation • Optimisation combinatoire • Théorie de
opérationnelle l'ordonnancement
Combinatoire des mots • Codage • Codage de l'information •
Données et codage Compression de données • Cryptage • Cryptanalyse •
Cryptographie • Théorie de l'information