2015-04-26 3 views
8

Ich arbeite durch Analyse der Algorithmen-Klasse zum ersten Mal und fragte mich, ob jemand mit dem folgenden Beispiel helfen könnte. Ich glaube, ich habe es für eine O (n) -Komplexität gelöst, aber ich frage mich, ob es eine bessere Version gibt, an die ich nicht O (logn) denke?Analyse von Algorithmen - Finden Sie fehlende Ganzzahl in Sorted Array besser als O (n)

Let A = A [1] = ... < < = A [n + 1] ein sortiertes Array von n verschiedenen ganzen Zahlen sein, wobei jede ganze Zahl in dem Bereich [1 ... n + 1]. Das heißt, in A fehlt genau eine ganze Zahl von {1, ..., n + 1}. Beschreiben Sie einen Efficeint-Algorithmus, um die fehlende ganze Zahl zu finden. Analysieren Sie die Worst-Case-Komplexität (Anzahl der Zugriffe auf Array A) Ihres Algorithmus.

Die Lösung, die ich habe, ist relativ einfach, und ich glaube, dass im schlimmsten Fall N Komplexität führt. Vielleicht denke ich über das Beispiel nach, aber gibt es eine bessere Lösung?

Meine Lösung

for(i = 1; i < n +1; i++) : 
    if(A[i-1] > i) : 
     return i 

Die Logik dahinter ist, da er sortiert wird, muss das erste Element 1 sein, muss die zweiten 2 sein, und so weiter und so fort, bis das Element in dem Array ist Größer als das Element, das es sein sollte, wurde ein Element verpasst, das Element zurückgegeben, das es sein sollte, und wir haben das fehlende Element.

Ist dies die richtige Logik? Gibt es einen besseren Weg?

Vielen Dank für das Lesen und danke im Voraus für die Unterstützung.

+0

Ja. Es gibt eine bessere Lösung. Tipp: Müssen Sie wirklich jedes Element im Array betrachten? – aquinas

+0

Würden Sie bitte Ihre Aussage des Problems aufräumen? (1) Wenn die A's verschieden sind, bedeutet das, dass sie nicht gleich sind; Warum also nicht einfach "A [1] Scott

Antwort

9

Diese Logik ist sicherlich richtig, aber sie ist nicht schnell genug, um O (n) zu übertreffen, weil Sie jedes Element überprüfen.

Sie können es schneller machen, indem Sie beobachten, dass, wenn A[i]==i, alle Elemente bei j < i an ihren richtigen Stellen sind. Diese Beobachtung sollte ausreichend sein, um einen Teil-und-herrsche-Ansatz zu konstruieren, die in O läuft (n lügt):

  • überprüfen Sie das Element in der Mitte
  • Wenn es an der falschen Stelle ist, gehen Sie nach links
  • Andernfalls gehen Sie nach rechts

formal, Sie nach einem Ort, wo A[i]==i und A[i+1]==i+2 suchen. Sie beginnen mit dem Intervall an den Enden des Arrays. Jede Sonde in der Mitte des Intervalls verkleinert das verbleibende Intervall um das Doppelte. Irgendwann bleibt ein Intervall von nur zwei Elementen übrig. Das Element auf der linken Seite ist das letzte "richtige" Element, während das Element auf der rechten Seite das erste Element nach der fehlenden Nummer ist.

+0

Lassen Sie mich einen Blick darauf werfen, dies in Englisch basierte: - Wählen Sie den mittleren Wert von 1 .... N - Wenn A [i-1] (seit gültige ganze Zahlen beginnen bei 1, und Array-Zugriff beginnt bei 0)! = i - Das fehlende Element muss links sein - Wählen Sie die Mitte von 1 .... I-1 Spülen wiederholen, bis A [i-1]> i funktioniert das? – Busturdust

+0

und wenn Original Pick war A [i-1] == i, dann tun Sie das gleiche auf der rechten Seite – Busturdust

+0

@Busturdust Ja, das ist es. – dasblinkenlight

8

Sie können mit A [i]> i nach dem ersten Index i suchen. Wenn die fehlende ganze Zahl k ist, dann ist A [i] = i für i < k und A [i] = i + 1 für i> = k.

3

Manchmal ist der Trick, das Problem auf andere Weise zu denken.

Im Geist Sie werden einfach mit einer Reihe von Booleschen Werten arbeiten; der Eintrag bei Index n ist die Wahrheit a[n] > n.

Darüber hinaus beginnt dieses Array mit null oder mehr aufeinanderfolgenden false, und die restlichen Einträge sind alle true.

Ihr Problem ist jetzt, den Index der ersten Instanz von true im (sortierten) Array von booleschen Werten zu finden.