Das Problem "Anhalten" gibt an, dass es unmöglich ist, ein Programm zu schreiben, mit dem festgestellt werden kann, ob ein anderes Programm anhält, und zwar für alle möglichen Eingabeprogramme .
Ich kann jedoch sicherlich ein Programm schreiben, das die Laufzeit eines Programms wie folgt berechnen kann:
for(i=0; i<N; i++)
{ x = 1; }
und geben Sie eine zeitliche Komplexität von , ohne sie jemals auszuführen.
Für alle anderen Eingabeprogramme würde ein Flag zurückgegeben, das angibt, dass die Zeitkomplexität nicht bestimmt werden konnte.
Meine Frage lautet:
Welche Bedingungen müssen erfüllt sein, damit wir die zeitliche Komplexität eines bestimmten Programms algorithmisch bestimmen können?
* Wenn es einen kanonischen Verweis oder einen Übersichtsartikel dazu gibt, würde ich mich über einen Link in den Kommentaren freuen.
Antworten:
Es wurde jedoch viel Arbeit zur effektiven Berechnung der Programmkomplexität geleistet. Ich habe eine besondere Vorliebe für die implizite Komplexitätstheorie, die darauf abzielt, Sprachen zu erstellen, die es unter Verwendung spezieller Konstrukte oder Typdisziplinen ermöglichen, nur Programme zu schreiben, die in einer bestimmten, genau definierten Komplexitätsklasse liegen. Soweit ich das für ein Wunder halte, sind diese Sprachen für diese Klasse oft vollständig!
Ein besonders schönes Beispiel ist in diesem Aufsatz von J.-Y. Marion, die eine winzige imperative Sprache beschreibt, mit einer Typendisziplin, die von Techniken der Informationsfluss- und Sicherheitsanalyse inspiriert ist und die eine Charakterisierung von Algorithmen in P ermöglicht .
quelle
Die Frage, die Sie stellen, und der spezifische Zähltrick, den Sie beschreiben, sind klassische Fragen in der Programmanalyse. Es gibt das theoretische Problem der Komplexitätsanalyse und die praktische Manifestation in Form einer automatischen Schätzung der Leistung eines Codeteils. Bei einer solchen automatisierten Analyse gibt es verschiedene Anwendungen, von der Erkennung von Leistungsfehlern bis zur Schätzung der Kosten für einige Berechnungen in der Cloud.
Cody wies darauf hin, dass das Problem im Allgemeinen nicht zu entscheiden ist. Dieses Problem ist schwerer zu lösen als die Beendigung zu beweisen, da das Erhalten einer Komplexitätsgrenze zur Folge hat, dass das Programm ebenfalls beendet wird. Es gibt zwei Ansätze für ein solches Problem. Eine stammt aus der Programmanalyse. Die Idee, einen Zähler hinzuzufügen und seinen Wert zu schätzen, besteht seit den 70er Jahren. Diese Codierung reduziert das Problem der Laufzeitbestimmung auf das der Berechnung einer Invariante.
Ein zweiter Ansatz besteht darin, eine Programmiersprache zu entwerfen, die nur Programme mit einer bestimmten begrenzten Komplexität zulässt. Dies ist der Bereich impliziter Rechenkomplexität.
Einige Referenzen für beide Bereiche folgen.
quelle