Array entfernen Sie doppelte Elemente
Ich habe eine unsortierte array, was ist die beste Methode, um entfernen Sie alle Duplikate eines Elements, wenn vorhanden?
e.g:
a[1,5,2,6,8,9,1,1,10,3,2,4,1,3,11,3]
so, nachdem Sie, dass der Betrieb das array Aussehen sollte
a[1,5,2,6,8,9,10,3,4,11]
Ist dieses Hausaufgaben? Wenn nicht, viele Sprachen (scripting-Sprachen mindestens) sind diese eingebaut. Ruby:
Ein temporäres Wörterbuch, in dem Sie Elemente einfügen, wie Sie gelesen werden, um Sie zu entfernen, wenn Sie bereits in das Wörterbuch.
Es ist nicht eine Arbeit zu Hause.. ich wollte wissen, die entsprechenden algoritm im Grunde. @pascal Verwendung temporärer Wörterbuch bedeutet, mit extra Speicher(storage)?
Ja, siehe zum Beispiel Matthäus die Antwort.
Auch Wenn Sie ein C++ - Benutzer..dann verwenden Sie eindeutige() in C++ STL <Algorithmus> cplusplus.com/reference/algorithm/unique
[1, 2, 3, 2, 3, 1].uniq
Ein temporäres Wörterbuch, in dem Sie Elemente einfügen, wie Sie gelesen werden, um Sie zu entfernen, wenn Sie bereits in das Wörterbuch.
Es ist nicht eine Arbeit zu Hause.. ich wollte wissen, die entsprechenden algoritm im Grunde. @pascal Verwendung temporärer Wörterbuch bedeutet, mit extra Speicher(storage)?
Ja, siehe zum Beispiel Matthäus die Antwort.
Auch Wenn Sie ein C++ - Benutzer..dann verwenden Sie eindeutige() in C++ STL <Algorithmus> cplusplus.com/reference/algorithm/unique
InformationsquelleAutor mohit | 2010-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie jedes element gegen jedes andere element
Die naive Lösung ist es zu prüfen jedes element gegen jedes andere element. Dies ist verschwenderisch und gibt einen O(n2) Lösung, auch wenn Sie nur "vorwärts".
Art dann entfernen Sie Duplikate
Eine bessere Lösung ist die Sortierung des Arrays und überprüfen Sie dann jedes element mit der nächsten zu, um Duplikate zu finden. Wählen Sie eine effiziente Art und das ist O(n log n).
Den Nachteil, mit der Art-basierten Lösung ist, um nicht beibehalten werden. Ein zusätzlicher Schritt, der aufpassen kann, dies jedoch. Setzen Sie alle Einträge (in die einzigartige sortierten array) in eine Hashtabelle, die O(1) zugreifen. Dann Durchlaufen Sie das original-array. Für jedes element prüfen, ob es in der hash-Tabelle. Wenn es ist, fügen Sie es in das Ergebnis und Sie löschen es aus der hash-Tabelle. Sie werden am Ende mit einem resultierenden array mit der Reihenfolge der ursprünglichen mit jedem element in der gleichen position wie das erste vorkommen.
Lineare Arten von Ganzzahlen
Wenn man sich mit Ganzzahlen, die von einigen festen Bereich, die Sie tun können noch besser durch die Verwendung einer radix-sort. Wenn Sie davon ausgehen, die zahlen sind alle im Bereich von 0 bis 1.000.000 zum Beispiel, können Sie zuweisen, ein bit-Vektor, der einige 1,000,001. Für jedes element im ursprünglichen array ausgeführt wurde, setzen Sie das entsprechende bit basierend auf seinen Wert (z.B. den Wert 13 Ergebnisse in Einstellung 14 bit). Dann durchqueren Sie das original-array, wenn es in der bit-Vektor. Wenn es ist, fügen Sie es in das Ergebnis-array und klar, dass der bit aus dem bit-Vektor. Das ist O(n) und trades Raum für Zeit.
Hash-Tabelle-Lösung
Das führt uns zu der besten Lösung von allen: die Art ist eigentlich eine Ablenkung, aber nützlich. Erstellen Sie eine Hashtabelle mit O(1) zugreifen. Durchqueren Sie den ursprünglichen Liste. Wenn es nicht in der hashtable schon, fügen Sie es in das Ergebnis-array und fügen Sie es in die hash-Tabelle. Wenn es in der hash-Tabelle, ignorieren Sie es.
Dies ist mit Abstand die beste Lösung. Also warum den rest? Denn Probleme wie diese sind über das anpassen von wissen, das Sie haben (oder sollten haben) zu Problemen und verfeinert, basierend auf den Annahmen, die Sie machen in einer Lösung. Das entwickeln einer Lösung und das Verständnis der Hintergründe ist es weit mehr nützlich, als das wiederkäuen einer Lösung.
Auch, hash-Tabellen sind nicht immer verfügbar. Nehmen Sie ein embedded-system oder etwas, wo der Raum SEHR begrenzt ist. Realisieren Sie eine schnelle Sortierung in einer Handvoll Maschinenbefehle, weit weniger als jede hash-Tabelle sein könnte.
Vollständige und übersichtliche Zusammenfassung
Man sollte sich klar machen, dass hashtables nur geben Sie erwartet Konstante Zeit, nicht garantiert Konstante Zeit.
Während der hashtable lässt Sie nicht hinzufügen Objekte duplizieren, wenn Sie fügen Sie alle zahlen in der Hashtabelle, und dann einfach ausdrucken , können Sie erreichen das gleiche Ergebnis. was ist der Punkt über, um einige if-Bedingungen und macht die Logik komplizierter?
Die meisten Gründe ersichtlich, die angesprochen worden sind: Bedeutung von bestellen, fehlen der hash-Tabelle, die Verfügbarkeit, die starke Raum-Einschränkungen.
InformationsquelleAutor cletus
Diese kann getan werden, in amortisiert O(n) unter Verwendung einer hashtable-basierte set.
Psuedo-code:
InformationsquelleAutor Matthew Flaschen
Wenn Sie nicht brauchen, um die original-Objekts können Sie mit einer Schleife und erstelle ein neues array mit eindeutigen Werten. In C# eine Liste verwenden, erhalten Sie Zugriff auf die benötigte Funktionalität. Es ist nicht das attraktivste oder intelligente Lösung, aber es funktioniert.
InformationsquelleAutor WDuffy
Behandlung von zahlen als Schlüssel.
Wenn Sie über die Daten wissen, wie die Reihe von zahlen, und wenn es endlich ist, dann können Sie initialisieren, großen array mit NULL ist.
InformationsquelleAutor bhups
InformationsquelleAutor dhayyati
Verwenden Sie eine Set-Implementierung.
HashSet,TreeSet oder LinkedHashSet wenn Ihre Java.
InformationsquelleAutor Zaki
Ich Stimme mit Cletus. Verwenden Sie eine QuickSort dann entfernen dups
InformationsquelleAutor Laramie
Dies ist ein code-segment, die ich erstellt in C++, Probieren Sie es
InformationsquelleAutor Vanji
Meine Lösung(
O(N)
) nicht nutzen, zusätzliche Speicher, aber das array muss sortiert wurden(meine Klasse, die mit insertion-sort-Algorithmus, aber es spielt keine Rolle.):Haupt-Und
InformationsquelleAutor isxaker
InformationsquelleAutor Nivi
InformationsquelleAutor rjnitt
InformationsquelleAutor Ved Prakash
Können Sie die "in" und "nicht" - syntax in python, das macht es ziemlich straight forward.
Die Komplexität ist höher als die hashing-Ansatz, obwohl da ein "nicht" ist äquivalent zu einer linearen traversal, um herauszufinden, ob dieser Eintrag vorhanden ist oder nicht.
InformationsquelleAutor Deepak Pathania