2016-04-09 20 views
0

Ich habe ein wenig Mühe bei der Bestimmung der großen o dieser Lösung Ich kam auf eine CTCI Frage Die Raumkomplexität sollte O (1) sein, ist aber die Laufzeit AUF)? Es scheint mehr nach O (N^2) wegen der while-Schleife zu sein. Die while-Schleife wird jedoch nicht für jedes Element innerhalb der for-Schleife N-mal ausgeführt.Laufzeit und Platz Komplexität dieses Codes

public static int[] missing_two(int [] n){ 

     for(int i=0;i<n.length;i++){ 
      while(n[i]!=i){ 
       int temp=n[i]; 
       n[i]=n[n[i]]; 
       n[temp]=temp; 
      } 
     } 

    } 

Wäre 6,0,1,2,3,4,5 ein Beispiel für den schlimmsten Fall hier? Die while-Schleife wird n-mal auf dem ersten Index ausgeführt. und 0 danach. Also sollte das nicht O (2n) => O (n) sein?

+0

Sind Sie sicher, dass der Code funktioniert? Ich kann es falsch parsieren, aber wenn 'n [i] == i' dann' n [i] == n [n [i]] 'so wird Ihre Ausgangsbedingung' n [i]! = I + 1' Du steckst auf einer Endlosschleife fest. – xvan

+0

ahh danke, dass du darauf hinweist. Sie haben recht, – Nych

Antwort

1

Mein Verständnis ist, dass große O-Notation verwendet wird, um eine obere Grenze oder ein Worst-Case-Szenario zu geben. Die Frage, die Sie selbst stellen müssen, ist: Könnte der Eingabevektor n Werte haben, so dass zumindest in einem Fall für alle Werte im Eingabevektor n die while-Schleife vollständig ausgeführt wird? Dann wäre eine korrekte Big-O-Notation O (N^2), wenn nicht aber nahe, dann wäre O (N^2) immer noch eine bessere Schätzung als O (N), als O (N) für eine obere Grenze wäre schon überschritten worden.

Nachdem Sie die Frage bearbeitet und weitere Informationen dazu gegeben haben, stimme ich Ihnen zu. Es ist O (N)

+0

Ja, es ist möglich, zum Beispiel 6,0,1,2,3,4,5. Allerdings beim ersten Index. es wird n Zyklen machen, aber der ganze folgende Index wird 0 Zyklen sein. also denke ich es ist mehr in Richtung 2n. – Nych

+0

Wenn es möglich ist, nehmen wir an, dass n Vektor 10 Samples hat, dann wird für 10 mal aufgerufen und für jedes mal für das heißt das while wird noch 10 Mal aufgerufen, macht das nicht 100 statt 20? – VMMF

+0

Ich glaube im schlimmsten Fall. Die while-Schleife wird nur 10-mal auf einem der Elemente durchlaufen. während dieser 10 Schleifen. Es sortiert den Rest des Arrays. Die Bedingung für das Auslösen der while-Schleife ist n [i]! = I (ich habe früher einen Fehler in meinem Code gemacht). Nach dieser ersten Schleife wird der Rest des Elements die while-Schleife nicht auslösen. Auf dem Beispiel habe ich darüber gesprochen. 6,0,1,2,3,4,5. Auf dem ersten Index tauscht er 6, mit 5. dann 5 mit 4 usw. bis es 0,1,2,3,4,5,6 wird. Wenn es zum nächsten Index weitergeht. n [1] = 1, daher wird die While-Schleife nicht ausgelöst. – Nych