Heim > Backend-Entwicklung > C++ > Hauptteil

Wie können wir Duplikate in einem Array von Zahlen von 0 bis n-1 in O(n)-Zeit und O(1)-Raum finden?

Linda Hamilton
Freigeben: 2024-11-01 20:02:02
Original
985 Leute haben es durchsucht

How can we find duplicates in an array of numbers from 0 to n-1 in O(n) time and O(1) space?

Duplikate in O(n)-Zeit und O(1)-Raum finden: Eine ausführliche Erklärung

Das gestellte Problem besteht darin, Duplikate zu identifizieren Elemente innerhalb eines Arrays, das Zahlen im Bereich von 0 bis n-1 enthält. Die Herausforderung besteht darin, dies effizient zu erreichen, innerhalb einer Zeitkomplexität von O(n) und mit nur konstantem (O(1)) Speicherplatz.

Die vorgestellte Lösung verwendet eine ausgeklügelte Technik, die keine Hash-Tabellen oder andere zusätzliche Daten erfordert Strukturen. Stattdessen nutzt es die Werte im Array selbst, um die doppelten Elemente zu identifizieren und zu markieren.

  1. Permutieren des Arrays:

    Die innere Schleife permutiert Das Array basiert auf der folgenden Logik:

    while A[A[i]] != A[i]
        swap(A[i], A[A[i]])
    end while
    Nach dem Login kopieren

    Dieser Permutationsschritt stellt sicher, dass, wenn ein Element x im Array vorhanden ist, mindestens eine seiner Instanzen bei A[x] positioniert wird. Dies ist entscheidend für die nachfolgenden Schritte.

  2. Identifizieren von Duplikaten:

    Die äußere Schleife überprüft jedes Element A[i]:

    for i := 0 to n - 1
        if A[i] != i then
            print A[i]
        end if
    end for
    Nach dem Login kopieren

    Wenn A[i] != i, bedeutet dies, dass i nicht an der richtigen Stelle im Array vorhanden ist. Daher ist es ein doppeltes Element und wird gedruckt.

  3. Zeitkomplexitätsanalyse:

    Die Technik läuft in O(n)-Zeit . Die verschachtelte Schleife hat eine äußere Schleife, die n-mal iteriert, und eine innere Schleife, die höchstens n-1 Iterationen durchführt (da jeder Austausch ein Element näher an seine korrekte Position bringt). Somit ist die Gesamtzahl der Iterationen durch n*(n – 1) begrenzt, was O(n^2) ist, kann aber zu O(n) vereinfacht werden als n*(n – 1) = n^2 – n = n(n - 1) = n*n - n < n*n = O(n^2) = O(n).

  4. Raumkomplexitätsanalyse:

    Der Algorithmus verwendet nur konstanten Raum , unabhängig von der Größe der Eingabe. Die wichtigste Erkenntnis besteht darin, dass der für die Permutationen genutzte Platz bereits im Eingabearray vorhanden ist. Es sind keine zusätzlichen Speicherstrukturen erforderlich.

  5. Zusätzliche Hinweise:

    • Der Algorithmus geht davon aus, dass das Array ganze Zahlen von 0 bis n enthält - 1.
    • Die zeitliche Komplexität bleibt gleich, auch wenn Duplikate vorhanden sind.
    • Der Algorithmus ist für kleine bis mittelgroße Arrays effizient. Für große Arrays sind alternative Ansätze mit Datenstrukturen wie Hash-Tabellen möglicherweise besser geeignet.

Das obige ist der detaillierte Inhalt vonWie können wir Duplikate in einem Array von Zahlen von 0 bis n-1 in O(n)-Zeit und O(1)-Raum finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!