Algorithmus zum Suchen von Duplikaten in einem Array

8

Ich habe eine Aufgabe, einen Algorithmus zu erstellen, um Duplikate in einem Array zu finden, das Zahlenwerte enthält. aber es hat nicht gesagt, welche Art von Zahlen, Ganzzahlen oder schwimmt. Ich habe folgenden Pseudocode geschrieben:

%Vor%

habe ich einen effizienten Algorithmus erstellt? Ich denke, es gibt ein Problem in meinem Algorithmus, es gibt doppelte Zahlen mehrere Male zurück. Zum Beispiel wenn Array zwei in zwei für zwei Indizes enthält, werde ich ... 2, 2, ... in der Ausgabe haben. Wie kann ich es ändern, um jedes Duplikat nur einmal zurückzugeben? Ich denke, es ist ein guter Algorithmus für Ganzzahlen, aber funktioniert es auch gut für Gleitkommazahlen?

    
Elton.fd 16.11.2010, 09:34
quelle

7 Antworten

10

Um Duplikate zu behandeln, können Sie Folgendes tun:

%Vor%     
Björn Pollex 16.11.2010, 09:49
quelle
6

Möchten Sie Dubletten in Java finden?

Sie können ein HashSet verwenden.

%Vor%

Der Rückgabewert von add () ist definiert als:

  

true, wenn der Satz nicht bereits vorhanden war   enthält das angegebene Element.

BEARBEITEN: Ich weiß, HashSet ist für Einsätze optimiert und enthält Operationen. Aber ich bin mir nicht sicher, ob es schnell genug für deine Bedenken ist.

EDIT2: Ich habe gesehen, dass du kürzlich das Hausaufgaben-Tag hinzugefügt hast. Ich würde nicht meine Antwort bevorzugen, wenn es Hausaufgaben, weil es für eine Allgorithm-Lektion zu "high-level" sein kann

Ссылка

    
Christian Kuetbach 16.11.2010 09:52
quelle
2

Ihre Antwort scheint ziemlich gut zu sein. Die erste Sortierung und die Überprüfung der Nachbarwerte ergibt O(n log(n)) complexity, was sehr effizient ist.

Merge sort ist O(n log(n)) , während benachbarte Werte einfach O(n) überprüft werden.

Eine Sache (wie in einem der Kommentare erwähnt) ist, dass Sie einen Stack-Überlauf (lol) mit Ihrem Pseudocode bekommen. Die innere Schleife sollte (in Java) lauten:

%Vor%

Wenn Sie tatsächlich auch anzeigen möchten, welche Zahlen (und / oder Indizes) die Duplikate sind, müssen Sie sie in einer separaten Liste speichern.

    
Nico Huysamen 16.11.2010 09:52
quelle
1

Ich bin nicht sicher, in welcher Sprache Sie den Algorithmus schreiben müssen, aber es gibt einige wirklich gute C ++ - Lösungen als Reaktion auf meine Frage hier. Sollte dir von Nutzen sein.

    
Saladin Akara 16.11.2010 09:41
quelle
1

O (n) Algorithmus: durchquere das Array und versuche jedes Element in einer Hashtabelle / Menge mit der Nummer als Hash-Schlüssel einzugeben. Wenn Sie nicht eingeben können, ist das ein Duplikat.

    
Maksood 03.03.2015 02:03
quelle
1
%Vor%     
smaiakov 21.10.2015 18:16
quelle
0

Ihr Algorithmus enthält einen Pufferüberlauf. i beginnt mit 0, also nehme ich an, dass die Indizes in das Array A nullbasiert sind, d.h. das erste Element ist A[0] , das letzte ist A[A.length-1] . Jetzt zählt i bis zu A.length-1 und ruft im Schleifenkörper A[i+1] auf, das für die letzte Iteration außerhalb des Arrays liegt. Oder, einfach ausgedrückt: Wenn Sie jedes Element mit dem nächsten Element vergleichen, können Sie nur Vergleiche der Länge 1 durchführen.

Wenn Sie nur einmal Duplikate melden möchten, würde ich eine bool-Variable firstDuplicate verwenden, die auf false gesetzt wird, wenn Sie ein Duplikat finden, und auf true, wenn sich die Zahl von der nächsten unterscheidet. Dann würden Sie nur das erste Duplikat melden, indem Sie nur die doppelten Zahlen melden, wenn firstDuplicate wahr ist.

    
Niki 16.11.2010 09:52
quelle

Tags und Links