En informatique théorique , la complexité temporelle désigne la complexité de calcul qui décrit le temps d'exécution d'un algorithme . Elle est généralement estimée en comptant le nombre d'opérations élémentaires effectuées par l'algorithme, en supposant que chaque opération élémentaire a une durée d'exécution fixe. Ainsi, la durée d'exécution et le nombre d'opérations élémentaires sont liés par un facteur constant .
Comme le temps d'exécution d'un algorithme peut varier pour des entrées de même taille, on considère généralement la complexité temporelle dans le pire des cas , c'est-à-dire le temps maximal requis pour des entrées d'une taille donnée. Moins courante, et généralement spécifiée explicitement, est la complexité temporelle moyenne , qui correspond au temps moyen d'exécution pour des entrées d'une taille donnée (ce qui est logique puisqu'il n'existe qu'un nombre fini d'entrées possibles de cette taille). Dans les deux cas, la complexité temporelle est généralement exprimée en fonction de la taille de l'entrée. Cette fonction étant généralement difficile à calculer exactement, et le temps d'exécution pour les petites entrées étant généralement négligeable, on s'intéresse généralement au comportement de la complexité lorsque la taille de l'entrée augmente, c'est-à-dire à son comportement asymptotique . Par conséquent, la complexité temporelle est généralement exprimée à l'aide de la notation grand O. etc., où bits nécessaire pour représenter l'entrée.
La complexité des algorithmes est classée selon le type de fonction apparaissant dans la notation grand O. Par exemple, un algorithme de complexité temporelle O(n) est un algorithme dont la complexité temporelle est O(n) = 1/n.
ancien meilleur algorithme pour l'isomorphisme de graphes
Un algorithme est dit à temps constant (souvent représenté comme
En revanche, la détermination de la valeur minimale dans un tableau non ordonné ne s'effectue pas en temps constant ; elle nécessite l'examen de chaque élément , ce qui entraîne une complexité temporelle linéaire, ou
Il est important de noter que le terme « temps constant » ne signifie pas que le temps d'exécution doit être totalement indépendant de la taille du problème ; il doit plutôt avoir une limite supérieure constante, quelle que soit la taille des données d'entrée. Par exemple, une tâche consistant à échanger les valeurs de
Un
Par exemple, l'ordonnancement de chaînes de matrices peut être résolu en temps polylogarithmique sur une machine parallèle à accès aléatoire , et la planarité d'un graphe peut être déterminée de manière entièrement dynamique .
Temps sous-linéaire
On dit qu'un algorithme s'exécute en temps sous-linéaire (souvent orthographié temps sublinéaire ) si
Le terme spécifique d'algorithme en temps sous-linéaire fait généralement référence à des algorithmes randomisés qui échantillonnent une petite fraction de leurs entrées et les traitent efficacement pour inférer approximativement les propriétés de l'instance entière. Ce type d'algorithme en temps sous-linéaire est étroitement lié aux tests de propriétés et aux statistiques .
Voici d'autres contextes dans lesquels les algorithmes peuvent s'exécuter en temps sous-linéaire :
- Les algorithmes parallèles qui ont un travail total linéaire ou supérieur (leur permettant de lire l'intégralité de l'entrée), mais une profondeur sous-linéaire .
- Les algorithmes qui reposent sur des hypothèses garanties concernant la structure des données d'entrée en sont un exemple important. Les opérations sur les structures de données , comme la recherche binaire dans un tableau trié, en sont un exemple significatif.
- Les algorithmes qui recherchent une structure locale dans les données d'entrée, par exemple la recherche d'un minimum local dans un tableau unidimensionnel (peuvent être résolus en
Temps quasi-linéaire
On dit qu'un algorithme s'exécute en temps quasi-linéaire (également appelé temps log-linéaire ) si
Les algorithmes qui s'exécutent en temps quasi-linéaire comprennent :
- Tri fusion sur place ,
- Tri rapide ,
- Tri par tas ,
- Transformées de Fourier rapides ,
- calcul de tableau de Monge ,
- Algorithme de Schönhage – Strassen pour la multiplication ,
Dans de nombreux cas, le
Les tris par comparaison nécessitent au moins
Temps sous-quadratique
Un algorithme est dit avoir un temps sous-quadratique si
Par exemple, les algorithmes de tri simples, basés sur la comparaison, ont une complexité quadratique (comme le tri par insertion ), tandis que des algorithmes plus avancés ont une complexité sous-quadratique (comme le tri Shell ). Aucun algorithme de tri général ne s'exécute en temps linéaire, mais le passage d'une complexité quadratique à une complexité sous-quadratique revêt une grande importance pratique.
temps polynomial
Quelques exemples d'algorithmes en temps polynomial :
- L' algorithme de tri par sélection sur n entiers effectue
- Toutes les opérations arithmétiques de base (addition, soustraction, multiplication, division et comparaison) peuvent être effectuées en temps polynomial.
- On peut trouver les couplages maximaux dans les graphes en temps polynomial. Dans certains contextes, notamment en optimisation , on distingue les algorithmes à complexité polynomiale forte et les algorithmes à complexité polynomiale faible .
Ces deux concepts ne sont pertinents que si les entrées des algorithmes sont des entiers.
Classes de complexité
Le concept de temps polynomial donne lieu à plusieurs classes de complexité en théorie de la complexité algorithmique. Voici quelques classes importantes définies à l'aide du temps polynomial.
- P : La classe de complexité des problèmes de décision qui peuvent être résolus sur une machine de Turing déterministe en temps polynomial
- NP : La classe de complexité des problèmes de décision qui peuvent être résolus sur une machine de Turing non déterministe en temps polynomial
- ZPP : La classe de complexité des problèmes de décision qui peuvent être résolus sans erreur sur une machine de Turing probabiliste en temps polynomial
- RP : La classe de complexité des problèmes de décision qui peuvent être résolus avec une erreur unilatérale sur une machine de Turing probabiliste en temps polynomial.
- BPP : Classe de complexité des problèmes de décision pouvant être résolus avec une erreur bilatérale sur une machine de Turing probabiliste en temps polynomial
- BQP : Classe de complexité des problèmes de décision pouvant être résolus avec une erreur bilatérale sur une machine de Turing quantique en temps polynomial
P désigne la classe de complexité temporelle minimale sur une machine déterministe, robuste aux changements de modèle de machine. (Par exemple, le passage d'une machine de Turing à une seule bande à une machine à plusieurs bandes peut entraîner un gain de vitesse quadratique, mais tout algorithme s'exécutant en temps polynomial sur un modèle s'exécute également en temps polynomial sur l'autre.) Chaque machine abstraite possède une classe de complexité correspondant aux problèmes résolubles en temps polynomial sur cette machine.
temps superpolynomial
Un algorithme est défini comme ayant un temps superpolynomial si T ( n ) n'est majoré par aucun polynôme ; c'est-à-dire si tout entier positiftest de primalité d'Adleman-Pomerance-Rumely s'exécute en un temps classe de complexité P. La thèse de Cobham postule que ces algorithmes sont impraticables, ce qui est souvent le cas. Le problème P versus NP n'étant pas résolu, on ignore si les problèmes NP-complets nécessitent un temps d'exécution superpolynomial.
temps quasi-polynomial
Temps sous-exponentiel
Le terme « temps sous-exponentiel » est utilisé pour exprimer que le temps d'exécution d'un algorithme peut croître plus rapidement que n'importe quel polynôme, tout en restant nettement inférieur à celui d'une exponentielle. En ce sens, les problèmes admettant des algorithmes à temps sous-exponentiel sont plus faciles à résoudre que ceux ne disposant que d'algorithmes exponentiels. La définition précise de « sous-exponentiel » ne fait pas consensus , mais les deux définitions les plus couramment utilisées sont présentées ci-dessous.
Première définition
Un problème est dit sous-exponentiel s'il peut être résolu en un temps d'exécution dont le logarithme est inférieur à la somme des carrés de tout polynôme donné. Plus précisément, un problème est sous-exponentiel s'il existe, pour tout ε > 0, un algorithme qui le résout en un temps 0"}},"i":0}}] O ( 2nε ) . L'ensemble de tous ces problèmes constitue la classe de complexité SUBEXP , qui peut être définie en fonction de DTIME comme suit.
- 0} \ extsf{DTIME}\\left(2^{n^\\varepsilon}\ ight)"
0}{ extsf {DTIME}}\left(2^{n^{\varepsilon }} ight)
Cette notion de sous-exponentielle n'est pas uniforme en termes de ε dans le sens où ε ne fait pas partie de l'entrée et chaque ε peut avoir son propre algorithme pour le problème.
Deuxième définition
Certains auteurs définissent le temps sous-exponentiel comme des temps d'exécution dans
Il est important que l'algorithme puisse avoir une complexité sous-exponentielle par rapport à la taille de l'instance, au nombre de sommets ou au nombre d'arêtes. En complexité paramétrée , cette différence est explicitée par la considération de paires.
Plus précisément, SUBEPT est la classe de tous les problèmes paramétrés
Hypothèse du temps exponentiel
Temps exponentiel
Un algorithme est dit à complexité exponentielle si T ( n ) est majoré par 2 <sup>n</sup> poly( n ) , où poly( n ) est un polynôme en n . Plus formellement, un algorithme est à complexité exponentielle si T ( n ) est majoré par O (2 <sup> nk</sup> ) pour une certaine constante k . Les problèmes admettant des algorithmes à complexité exponentielle sur une machine de Turing déterministe forment la classe de complexité connue sous le nom d' EXP .
Parfois, le temps exponentiel est utilisé pour désigner des algorithmes qui ont T ( n ) = 2 O ( n ) , où l'exposant est au plus une fonction linéaire de n . Cela donne lieu à la classe de complexité E .
Temps factoriel
Un algorithme est dit à temps factoriel si T(n) est majoré par la fonction factorielle n!. Le temps factoriel est un sous-ensemble du temps exponentiel (EXP) car
Un exemple d'algorithme s'exécutant en temps factoriel est le tri bogosort , un algorithme de tri notoirement inefficace basé sur la méthode des essais et erreurs . Le tri bogosort trie une liste de n éléments en la mélangeant de manière itérative jusqu'à ce qu'elle soit triée. En moyenne, chaque itération de l'algorithme examine l'un des n ! ordres possibles des n éléments. Si les éléments sont distincts, un seul de ces ordres est retenu. Le tri bogosort est lié au théorème du singe savant .
Temps double exponentiel
Un algorithme est dit à temps double exponentiel si T ( n ) est majoré par 2 2 poly( n ) , où poly( n ) est un polynôme en n . De tels algorithmes appartiennent à la classe de complexité 2-EXPTIME .
Parmi les algorithmes à complexité double exponentielle bien connus, on peut citer :
- Procédures de décision pour l'arithmétique de Presburger
- Calcul d'une base de Gröbner (dans le pire des cas )
- L'élimination des quantificateurs sur les corps réels fermés prend au moins un temps double exponentiel, et peut être effectuée dans ce temps.