Le problème d'arrêt indique qu'il est impossible d'écrire un programme qui peut déterminer si un autre programme s'arrête, pour tous les programmes d'entrée possibles .
Je peux, cependant, certainement écrire un programme qui peut calculer le temps d'exécution d'un programme comme:
for(i=0; i<N; i++)
{ x = 1; }
et retourner une complexité temporelle de , sans jamais l'exécuter.
Pour tous les autres programmes d'entrée, il retournerait un indicateur indiquant qu'il n'a pas pu déterminer la complexité temporelle.
Ma question est la suivante:
Quelles conditions doivent être remplies pour que nous puissions déterminer algorithmiquement la complexité temporelle d'un programme donné?
* S'il existe une référence canonique ou un article de synthèse à ce sujet, j'apprécierais un lien vers celui-ci dans les commentaires.
Réponses:
En général, vous ne pouvez pas déterminer la complexité, même pour l'arrêt de programmes: soit une machine de Turing arbitraire et soit le programme (qui renvoie toujours 0):p TT pT
Il est clair qu'il est indécidable en général que soit linéaire ou temps quadratique.pT
Cependant, beaucoup de travail a été effectué sur le calcul efficace de la complexité du programme. J'ai un penchant particulier pour la théorie de la complexité implicite qui vise à créer des langages qui, en utilisant des constructions spéciales ou des disciplines de type, permettent d'écrire uniquement des programmes qui habitent une certaine classe de complexité bien définie. Par ce que je considère comme un miracle, ces langues sont souvent complètes pour cette classe!
Un exemple particulièrement agréable est décrit dans cet article par J.-Y. Marion, qui décrit un petit langage impératif, avec une discipline de type inspiré des techniques de flux d' information et d' analyse de sécurité, ce qui permet une caractérisation des algorithmes P .
la source
La question que vous posez et l'astuce de comptage spécifique que vous décrivez sont classiques dans l'analyse de programme. Il y a le problème théorique de l'analyse de la complexité, et c'est une manifestation pratique en termes d'estimation automatique des performances d'un morceau de code. Une telle analyse automatisée a plusieurs applications, de la détection de bogues de performance à l'estimation du coût de certains calculs dans le cloud.
Cody a souligné que le problème est indécidable en général. Ce problème est plus difficile que de prouver la terminaison, car l'obtention d'une limite de complexité implique que le programme se termine également. Il existe deux approches à un tel problème. L'une provient de l'analyse des programmes. L'idée d'ajouter un compteur et d'estimer sa valeur existe depuis les années 70. Ce codage réduit le problème de la détermination du temps d'exécution à celui du calcul d'un invariant.
Une deuxième approche consiste à concevoir un langage de programmation qui n'admet que des programmes d'une certaine complexité bornée. C'est le domaine de la complexité de calcul implicite.
Quelques références pour les deux domaines suivent.
la source