Inwieweit kann ein Algorithmus die zeitliche Komplexität eines beliebigen Eingabeprogramms vorhersagen?


23

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.N

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.


1
(1) „Die O-Notation“ bedeutet nicht „Zeitkomplexität“. (2) Es ist unklar, was Sie mit „O (Unendlich)“ meinen. Vermeiden Sie es, wenn möglich, eine neue Notation zu erfinden. (3) Die Entscheidung, ob ein bestimmtes Programm anhält oder nicht, und die Angabe einer expliziten Obergrenze für die zeitliche Komplexität des Programms sind unterschiedlich.
Tsuyoshi Ito

1
Es ist mir nicht vertraut, auf die zeitliche Komplexität von Programmen in eingeschränkten Klassen zu schließen, aber eine Klasse von Programmen, auf die es sich zu prüfen lohnt, nennt sich "gebundene Schleifenprogramme", für die es einfach ist, die zeitliche Komplexität zu begrenzen. Ich erinnere mich, dass in Kapitel 3 von Gems of Theoretical Computer Science von Uwe Schöning und Randall J. Pruim im Zusammenhang mit der Entscheidung über die Gleichwertigkeit von zwei Programmen gebundene Schleifenprogramme erörtert werden, aber ich bin nicht sicher, wie wichtig das Kapitel für Ihre Frage ist.
Tsuyoshi Ito

4
Ich bin ein wenig verwirrt. Inwiefern liegt dies außerhalb des Anwendungsbereichs? Eine vernünftige Antwort auf die Frage des OP wären Sprachfragmente (oder sogar Klassen von Fragmenten), für die die Laufzeit algorithmisch bestimmt werden kann.
Suresh Venkat


7
Ich bin schrecklich spät zu diesem Kommentarthread. Wir scheinen uns auf den Moment zu stürzen, in dem ein Beitrag nach Neuling riecht. Ich zeige nicht mit den Fingern. Ich fühle diesen Instinkt selbst. Vielleicht sollten wir sanfter sein. Das OP gab zu, mit dem Gebiet oder den Begriffen nicht vertraut zu sein. Was nützt eine Frage-Antwort-Site, wenn wir nur Menschen tolerieren, die genau wissen, was sie wollen, und dies in unserer Sprache tun.
Vijay D

Antworten:


23

TpT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

pT

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 .


Als Randnotiz siehe auch Epigram, eine Sprache, die eine Kündigung garantieren kann.
Realz Slaw

Dies ist ein guter Anfang, aber gibt es noch mehr zu sagen? (Zum Beispiel scheint es mir, dass die Laufzeit einer bestimmten elementaren rekursiven Funktion einfach zu berechnen sein muss, aber solche Funktionen können jedes Problem in der exponentiellen Hierarchie lösen ...)
usul

Sofern Sie feststellen können, dass das Eingabeprogramm in einer eingeschränkten Sprache geschrieben ist, können Sie davon ausgehen, dass die Zeitkomplexität durch die von dieser Sprache vorgegebene Obergrenze begrenzt ist. Viele primitive rekursive Funktionen haben jedoch allgemeine rekursive Entsprechungen, die effizienter sind
Chris Pressey

1
(Dieser Kommentar wurde versehentlich vorzeitig gespeichert und überschritt dann das 5-Minuten-Limit. Der zweite Satz sollte wie folgt lauten: :) Programme in diesen eingeschränkten Sprachen können jedoch Entsprechungen in weniger eingeschränkten Sprachen aufweisen, die effizienter sind (insbesondere haben viele primitive rekursive Funktionen) allgemein rekursive Äquivalente, die effizienter sind), was in der Praxis die Verwendung der uneingeschränkten, schwieriger zu analysierenden Sprachen fördert.
Chris Pressey

Das ist sehr interessant, Chris! Haben Sie eine Referenz? Tatsächlich scheint es kontra-inutiv zu sein: Ich hätte vermutet, dass primitive rekursive Funktionen allgemeine rekursive Funktionen für eine bestimmte Anzahl von Schritten simulieren können, was dann die Beschleunigung auf einen konstanten Faktor begrenzen würde.
Cody

11

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.

  1. Das SPEED-Projekt ist eine spezielle Programmanalyse, bei der es darum geht, Grenzen für Zähler zu finden, die einmal in das Programm aufgenommen wurden. Die Zähler können den Zeit- oder Platzverbrauch messen.
  2. Multivariate Amortized-Resource-Analyse , Jan Hoffman, Klaus Aehlig, Martin Hoffman, ACM TOPLAS 2012
  3. Amir Ben Amram, Entwicklungen in implicit computational complExity 2010, über entscheidbare Wachstumsrateneigenschaften von Imperativprogrammen . Dies ist eine schöne Arbeit über die Begrenzung der Komplexität von Imperativprogrammen durch syntaktische Restriktionen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.