Bester Algorithmus zum Löschen von Duplikaten im String-Array

8

Heute bat uns der Lehrer in der Schule, einen Duplikat-Lösch-Algorithmus zu implementieren. Es ist nicht so schwierig, und alle haben die folgende Lösung (Pseudocode) gefunden:

%Vor%

Die Berechnungskomplexität für dieses Algo ist n(n-1)/2 . (Wir sind in der High School, und wir haben nicht über Big-O gesprochen, aber es scheint O(n^2) zu sein). Diese Lösung erscheint hässlich und natürlich langsam, also habe ich versucht, etwas schneller zu programmieren:

%Vor%

Auf diese Weise enthält vS alle Elemente, die wir bereits bestanden haben. Wenn sich das Element v[i] in diesem Array befindet, ist es ein Duplikat und wird entfernt. Die Berechnungskomplexität für die binäre Suche ist log(n) und für die Hauptschleife (zweites Snippet) ist n . Daher ist das ganze CC n*log(n) wenn ich mich nicht irre.

Dann hatte ich eine andere Idee, einen binären Baum zu benutzen, aber ich kann ihn nicht ablegen Grundsätzlich sind meine Fragen:

  • Ist meine Kalkulation richtig? (Und wenn nicht, warum?)
  • Gibt es dafür eine schnellere Methode?

Danke

    
BlackBear 20.05.2011, 12:34
quelle

5 Antworten

13

Die einfachste Lösung besteht darin, das Array einfach zu sortieren (nimmt O (n log n) mit der Standardimplementierung, falls Sie sie verwenden können.) oder einen einfachen randomisierten Quicksort erstellen (der Code ist sogar auf Wikipedia)).

Danach scannen Sie es noch einmal. Während dieses Scans eliminieren Sie einfach aufeinanderfolgende identische Elemente.

Wenn Sie es in O (n) machen wollen, können Sie auch ein HashSet mit Elementen verwenden, die Sie bereits gesehen haben. Iterieren Sie einfach einmal über Ihr Array, überprüfen Sie für jedes Element, ob es sich in Ihrem HashSet befindet.

Wenn es nicht dort ist, füge es hinzu. Wenn es dort ist, entfernen Sie es aus dem Array.

Beachten Sie, dass dies zusätzlichen Speicher benötigt und das Hashing einen konstanten Faktor hat, der zu Ihrer Laufzeit beiträgt. Obwohl die Komplexität der Zeit besser ist, wird die praktische Laufzeit nur dann schneller sein, wenn Sie eine bestimmte Array-Größe überschreiten

    
b.buchhold 20.05.2011, 12:48
quelle
6

Sie können oft einen Raum-Zeit-Kompromiss verwenden und mehr Speicherplatz investieren, um Zeit zu sparen.

In diesem Fall könnten Sie eine Hash-Tabelle verwenden, um die eindeutigen Wörter zu bestimmen.

    
Gumbo 20.05.2011 12:47
quelle
2

add ist O(n) , Ihre CC-Berechnung ist also falsch. Dein Algorithmus ist O(n^2) .

Außerdem, wie wäre remove umzusetzen? Es sieht auch so aus, als wäre es O(n) - der ursprüngliche Algorithmus wäre also O(n^3) .

    
Robin Green 20.05.2011 12:50
quelle
0

Die binäre Suche funktioniert nur, wenn das von Ihnen gesuchte Array sortiert ist. Ich denke, das ist hier nicht der Fall, oder Sie würden nicht Ihr gesamtes Array in der inneren Schleife der ursprünglichen Lösung durchlaufen.

    
OpenSauce 20.05.2011 12:40
quelle
0

Wenn die Reihenfolge der endgültigen Lösung irrelevant ist, können Sie das Array basierend auf der Länge der Zeichenfolgen in kleinere Arrays aufteilen und dann Duplikate aus diesen Arrays entfernen. Beispiel:

%Vor%     
its_me 20.07.2017 15:14
quelle