Programm / Algorithmus, um die zeitliche Komplexität eines gegebenen Programms zu finden

7

Ich möchte wissen, ob es möglich ist, "ein Programm oder Algorithmus " zu schreiben, um die zeitliche Komplexität eines gegebenen Programms zu finden als Eingabe.

Eingabe: jedes Programm (P) [in einer beliebigen Sprache oder einer bestimmten Sprache]

Ausgabe: Zeitkomplexität des Programms (P).

Wurden bereits Versuche unternommen, ein solches Programm zu schreiben? Gibt es Algorithmen für diesen Zweck?

Wenn dies der Fall ist, geben Sie bitte die erforderlichen Links, Referenzen oder jegliche Art von Anleitung an.

    
user unknown 22.09.2009, 16:32
quelle

4 Antworten

29

Nein. Es ist nicht möglich. Dies ist eine Form des Problems beim Anhalten

    
erickson 22.09.2009 16:33
quelle
4

Es ist nicht möglich, die Komplexität eines beliebigen Algorithmus nachzuweisen, aber im Prinzip könnte man es schätzen:

  1. wähle n, die Größe der Eingabe
  2. führe den Algorithmus aus
  3. beobachte t (n), die Zeit, die benötigt wird, um den Algorithmus für die Eingabe der Größe n
  4. auszuführen
  5. wähle ein anderes n, wiederhole die Schritte 2 und 3, bis du eine Menge Daten hast
  6. regress t (n) auf n, n ^ k, log (n), n log (n), n! oder irgendeinem anderen Begriff, der angebracht sein könnte
  7. wähle einen Begriff mit statistischer Signifikanz und deklariere dies um Ihre geschätzte Komplexität des Algorithmus zu sein

Es gibt eine Reihe von Fallstricken bei diesem Ansatz

  1. Dies wird nichts beweisen, nur schätzen
  2. Wenn t (n) für große n sehr groß wird, wird es sehr lange dauern Sammeln Sie genügend Daten für Ihre Analyse
  3. Es gibt viele Möglichkeiten, wie dieser Ansatz getäuscht werden kann, wenn Sie nicht große Werte verwenden von n. Zum Beispiel wird dieser Algorithmus wie O (1) aussehen, es sei denn, Sie verwenden astronomische Werte für n

    %Vor%

Und andere SO-Benutzer können sich viel mehr einfallen lassen. Aber in manchen Fällen, etwa wenn Sie eine Komplexitätsanalyse eines Algorithmus durchführen und diese empirisch verifizieren möchten, ist dies immer noch ein nützlicher Ansatz.

    
mob 22.09.2009 17:11
quelle
0

können wir nicht noch mehr Variablen in den Algorithmus selbst einführen und die Komplexität auf die gleiche Art und Weise finden, wie wir es manuell tun. wie zum Beispiel können wir eine Variable in einer Einfügesortierung haben, sagen wir n = 0, die die Spur des gesamten Schleife-Teils des Algorithmus behält und dann die Antwort als O (n ^ 2)

gibt     
Manthan Shah 25.07.2012 11:25
quelle
-3

Nun, ich denke, Sie tun dies, indem Sie alle Fälle annehmen. 1: Wie mache zuerst ein Modul, das jede Anweisung extrahieren kann 2: Erstellen Sie eine Datenbank mit Anweisungen, die der Programmanweisung entsprechen. 3: Berechnen Sie die Komplexität durch Abrufen der entsprechenden Zeitkomplexität, die Sie in der Datenbank festgelegt haben, und das ist alles.

    
Shahid 18.04.2012 16:30
quelle

Tags und Links