Antworten:
Wenn die Reihenfolge der Elemente in der Sammlung nicht wichtig ist, bieten Sets eine bessere Leistung beim Auffinden von Elementen in der Sammlung.
Der Grund dafür ist, dass eine Gruppe Hash-Werte verwendet, um Elemente (wie ein Wörterbuch) zu finden, während ein Array seinen gesamten Inhalt durchlaufen muss, um ein bestimmtes Objekt zu finden.
Das Bild aus Apples Dokumentation beschreibt es sehr gut:
Array
ist eine geordnete Folge von Elementen (die Reihenfolge wird beim Hinzufügen beibehalten)
[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];
[1, 2, 3, 4, 6, 4, 1, 2]
Set
ist eine eindeutige (keine Duplikate), ungeordnete Liste von Elementen
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];
[1, 2, 6, 4, 3]
Die beste Antwort darauf ist Apples eigene Dokumentation .
Der Hauptunterschied besteht darin, dass NSArray
es sich um eine bestellte Sammlung und NSSet
um eine ungeordnete Sammlung handelt.
Es gibt mehrere Artikel, die über den Geschwindigkeitsunterschied zwischen den beiden sprechen, wie diesen hier . Wenn Sie eine ungeordnete Sammlung durchlaufen, NSSet
ist das großartig. In vielen Fällen müssen Sie jedoch Dinge tun, die nur ein NSArray
Mensch tun kann, sodass Sie die Geschwindigkeit für diese Fähigkeiten opfern.
NSSet
NSArray
Das ist alles, was es wirklich zu tun gibt! Lassen Sie mich wissen, ob das hilft.
NSSet
für die Indizierung opfern . Es ist üblich, zwei verschiedene Datenstrukturen für dieselben Daten zu verwenden. Oder Sie erstellen und indizieren dieses Array :) Aber dann ist es besser, eine Datenbank zu verwenden, in der es bereits implementiert ist.
NSSet
und handelt NSArray
, ist meine Antwort korrekt und vollständig. Ja, Sie können andere Datenstrukturen erstellen, aber ich vergleiche nur diese beiden.
NSArray
und einige Funktionen von benötigen, lautet NSSet
die richtige Antwort nicht "Leistung nutzen NSArray
und opfern". Die Antwort ist, beide zu kombinieren oder eine andere Datenstruktur zu verwenden.
Ein Array wird verwendet, um über ihren Index auf Elemente zuzugreifen. Jedes Element kann mehrmals in das Array eingefügt werden. Arrays behalten die Reihenfolge ihrer Elemente bei.
Ein Set wird grundsätzlich nur verwendet, um zu überprüfen, ob sich der Artikel in der Sammlung befindet oder nicht. Die Artikel haben kein Konzept der Reihenfolge oder Indizierung. Sie können einen Gegenstand nicht zweimal in einem Satz haben.
Wenn ein Array überprüfen möchte, ob es ein Element enthält, muss es alle seine Elemente überprüfen. Sets sind so konzipiert, dass sie schnellere Algorithmen verwenden.
Sie können sich eine Menge wie ein Wörterbuch ohne Werte vorstellen.
Beachten Sie, dass Array und Set nicht die einzigen Datenstrukturen sind. Es gibt andere, z. B. Warteschlange, Stapel, Haufen, Fibonaccis Haufen. Ich würde empfehlen, ein Buch über Algorithmen und Datenstrukturen zu lesen.
Weitere Informationen finden Sie in Wikipedia .
contains
Operation ist O(n)
. Anzahl der Vergleiche, wenn nicht im Array n
. Die durchschnittliche Anzahl von Vergleichen, wenn sich das Objekt im Array befindet, beträgt n/2
. Selbst wenn das Objekt gefunden wird, ist die Leistung schrecklich.
NSArray
s haben andere Geschwindigkeitsvorteile gegenüber NSSet
s. Wie immer ist es ein Kompromiss.
NSArray *Arr;
NSSet *Nset;
Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];
NSLog(@"%@",Arr);
NSLog(@"%@",Nset);
das Array
2015-12-04 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)
der Satz
2015-12-04 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
Die Hauptunterschiede wurden bereits in anderen Antworten angegeben.
Ich möchte nur darauf hinweisen, dass aufgrund der Art und Weise, wie Mengen und Wörterbücher implementiert werden (dh Hashes verwenden), darauf geachtet werden sollte, keine veränderlichen Objekte für die Schlüssel zu verwenden.
Wenn ein Schlüssel mutiert ist, ändert sich (wahrscheinlich) auch der Hash und zeigt auf einen anderen Index / Bucket in der Hash-Tabelle. Der ursprüngliche Wert wird nicht gelöscht und tatsächlich berücksichtigt, wenn die Struktur aufgelistet oder nach ihrer Größe / Anzahl gefragt wird.
Dies kann zu einigen wirklich schwer zu lokalisierenden Fehlern führen.
Hier finden Sie einen ziemlich gründlichen Vergleich der NSArray
und der NSSet
Datenstrukturen.
Kurze Schlussfolgerungen:
Ja, NSArray ist schneller als NSSet, da es einfach gehalten und iteriert werden kann. Nur 50% schneller zum Erstellen und bis zu 500% schneller zum Iterieren. Lektion: Wenn Sie nur Inhalte iterieren müssen, verwenden Sie kein NSSet.
Wenn Sie auf Inklusion testen müssen, arbeiten Sie natürlich hart, um NSArray zu vermeiden. Selbst wenn Sie sowohl Iterations- als auch Inklusionstests benötigen, sollten Sie wahrscheinlich immer noch ein NSSet auswählen. Wenn Sie Ihre Sammlung geordnet halten und auch auf Aufnahme prüfen müssen, sollten Sie zwei Sammlungen (eine NSArray- und eine NSSet-Sammlung) behalten, die jeweils dieselben Objekte enthalten.
NSDictionary ist langsamer zu erstellen als NSMapTable, da die Schlüsseldaten kopiert werden müssen. Dies wird durch eine schnellere Suche ausgeglichen. Natürlich haben die beiden unterschiedliche Fähigkeiten, so dass diese Bestimmung die meiste Zeit auf anderen Faktoren beruhen sollte.
Normalerweise verwenden Sie ein Set, wenn die Zugriffsgeschwindigkeit von entscheidender Bedeutung ist und die Reihenfolge keine Rolle spielt oder auf andere Weise (durch ein Prädikat oder einen Sortierdeskriptor) bestimmt wird. Core Data verwendet beispielsweise Mengen, wenn auf verwaltete Objekte über eine To-Many-Beziehung zugegriffen wird
Nur um ein bisschen davon hinzuzufügen, benutze ich set manchmal nur, um Duplikate aus dem Array zu entfernen, wie: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values