2016-05-10 5 views
2

Ich wollte nur überprüfen, ob in meinem Array Dubletten enthalten sind. Ich auf Google gesucht und einige Ansätze sehen:Ist dieser Ansatz zum Überprüfen von Duplikaten in einem Array relativ effizient? Warum oder warum nicht?

  • Doppel for-Schleife Schleifen obwohl das Array und vergleicht jedes Element
  • ein Wörterbuch erstellen, die die Anzahl von Vorkommen jedes Element speichert

Aber diese Methoden erfordern viele Schleifen und ich bin irgendwie faul, eine große Menge an Code nur für diese Funktionalität zu schreiben. xD. So

Ich dachte, dieser kreative Art und Weise:

let containsDuplicates = Set(array).count != array.count 

Dieses Verfahren ist jedoch schneller oder langsamer als die anderen beiden? Ich bin mir nicht sicher, weil es scheint, ein Set zu erstellen, das ich denke, muss durch das Array durchlaufen. Und ich weiß nicht, ob der Zugriff auf die count auch das gesamte Array durchläuft.

Wenn ich nur höchstens 50 Elemente im Array habe, ist das überhaupt von Bedeutung?

+1

Probieren Sie es aus und messen Sie die Zeit ... –

+0

Versuchen Sie was? Ich weiß nicht, wie man die Code-Ausführungszeit misst. @MartinR Und ich möchte auch wissen, warum ich nicht weiß, wie ich die Antwort finden kann. – Sweeper

+0

Dies ist der erste Google-Treffer, den ich für "Swift measure execution time" gefunden habe: http://stackoverflow.com/questions/24755558/measure-elapsed-time-in-swift. Die Antwort hängt auch vom Array-Inhalt ab, zB wie viele Duplikate enthalten sind. –

Antwort

1

Das ist so ziemlich der beste Weg. Dictionary-Speicher ist konstante Zeit, und jedes Element muss nur einmal gespeichert werden, so ist es eine O(n) Lösung, die O(n^2) für die doppelte for-Schleife-Ansatz. Die Raumeffizienz ist geringer, aber das ist heutzutage normalerweise kein Problem.

Wenn Sie dies oft tun, würde ich vorschlagen, eine Art von hybriden Datenstruktur zu verwenden, so dass Sie diese Set s nicht von Grund auf neu generieren.

+0

Können Sie mehr über die "hybride Datenstruktur" erfahren? Es klingt vage. – Sweeper

+0

Machen Sie Ihre eigenen 'struct' /' class' mit den Eigenschaften 'Array' und' Set'. Implementiere die 'add' /' remove'/etc. Methoden zum gleichzeitigen 'Hinzufügen' /' Entfernen'/etc. sowohl aus dem 'Array' als auch aus dem' Set'. Auf diese Weise kann der Aufruf von 'contains' einfach die vorhandene Menge verwenden, ohne' O (n) 'time zu verschwenden, um sie bei jedem Aufruf neu zu erstellen. – Alexander

0

Mein erster Gedanke war, ein Set zu erstellen und zu sehen, ob die Anzahl der Elemente anders als das Array ist, genau wie Sie. Apple wird diese Konvertierung wahrscheinlich ziemlich gut optimiert haben, und auf diese Weise wird der Code kompakt und leicht verständlich.

Sie erwähnen nicht, wozu das Array gehört und wie es verwendet wird, aber könnten Sie einfach ein Set anstelle des Arrays verwenden, so dass Duplikate gar nicht erst hinzugefügt werden? Oder wenn Sie den Überblick behalten müssen, wie viele, aber trotzdem die eindeutigen Werte kennen müssen, erstellen Sie eine neue Klasse, die ein Wörterbuch für den Speicher verwendet. Der Schlüssel ist, was Sie im Array speichern, aber wäre einzigartig und der Wert wäre die Anzahl.

Verwandte Themen