2017-11-01 6 views
1

Ich denke, es ist wahrscheinlich eine einfache Antwort, aber ich dachte, dass ich schnell überprüfen würde ...Array vs Wörterbuch Suchleistung in Swift

Sagen wir, ich bin das Hinzufügen Ints zu einer Reihe an verschiedenen Punkten in meinem Code und dann will ich, wenn ein Array finden eine gewisses Int in Zukunft enthält ..

var array = [Int]() 

array.append(2) 
array.append(4) 
array.append(5) 
array.append(7) 

if array.contains(7) { print("There's a 7 alright") } 

Ist die schwerere Leistung klug, als wenn ich ein Wörterbuch erstellt?

var dictionary = [Int:Int]() 

dictionary[7] = 7 

if dictionary[7] != nil { print("There's a value for key 7")} 

Offensichtlich gibt es Gründe, wie Sie vielleicht die Möglichkeit von doppelten Einträgen aus der gleichen Anzahl beseitigen wollen ... aber ich könnte auch tun, mit einem Set .. Ich frage mich in erster Linie nur über die Leistung von dictionary[key] vs array.contains(value)

Vielen Dank für Ihre Zeit

+3

Sind Sie tatsächlich ein Leistungsproblem zu sehen, oder ist das nur eine allgemeine Frage der Neugier? Verschwenden Sie keine Zeit mit Sorgen um die Leistung, bis Sie sich Sorgen machen müssen. Schreiben Sie zuerst lesbaren, wartbaren Code. – rmaddy

+2

Probieren Sie es aus und messen Sie ... –

+0

Es hängt von vielen Faktoren ab: Ist die Reihenfolge der Werte wichtig oder nicht, Anzahl der Werte, Häufigkeit der Insertionen, ... –

Antwort

5

Generell Dictionaries liefert konstant, dh O (1), den Zugang, die searching wenn ein Wert vorhanden ist und die Aktualisierung es ist schneller als mit einem Array, was bedeutet, abhängig ng on Implementierung kann O (n) sein. Wenn das Dinge sind, für die Sie optimieren müssen, dann ist eine Dictionary eine gute Wahl. Da Wörterbücher die Eindeutigkeit von Schlüsseln erzwingen, können Sie jedoch nicht mehrere Werte unter demselben Schlüssel einfügen.

Basierend auf der Frage würde ich empfehlen, dass Sie Ray Wenderlich's Collection Data Structures lesen, um ein ganzheitliches Verständnis von Datenstrukturen zu bekommen, als ich hier bieten kann.

+0

Gute Antwort und guter Link;) Aus Gründen der Vollständigkeit würde ich füge nur hinzu, dass * das Suchen * ein ungeordnetes 'Array' die Operation O (n) ist. –

+0

perfekt ... danke Jungs – Magoo

+0

@PauloMattos Danke, habe meine Antwort mit ein wenig mehr Details über Array Suchleistung bearbeitet –

1

Ich habe einige Proben genommen!

Ich habe Ihren Code bearbeitet, so dass die Druckanweisungen leer sind.

Ich lief den Code 1.000.000 mal. Jedes Mal habe ich gemessen, wie lange es dauert, auf das Wörterbuch und das Array getrennt zuzugreifen. Dann subtrahierte ich die dictTime für arrTime (arrTime - dictTime) und speicherte diese Nummer jedes Mal.

Sobald es fertig war, nahm ich den Durchschnitt der Ergebnisse.

Das Ergebnis ist: 23150. Das bedeutet, dass über 1000.000 Versuche das Array schneller von 23150 NanoSec zugegriffen wurde. Der maximale Unterschied war 2426737 und der min -5711121.

Hier sind die Ergebnisse in einem Diagramm: enter image description hereenter image description here

Verwandte Themen