Odpowiedzi:
Gdy kolejność elementów w kolekcji nie jest ważna, zestawy zapewniają lepszą wydajność wyszukiwania elementów w kolekcji.
Powodem jest to, że zestaw używa wartości skrótu do wyszukiwania elementów (takich jak słownik), podczas gdy tablica musi iterować po całej zawartości, aby znaleźć określony obiekt.
Obraz z Dokumentacji Apple opisuje to bardzo dobrze:
Array
to uporządkowana (kolejność jest zachowywana podczas dodawania) sekwencji elementów
[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
jest odrębną (bez duplikatów), nieuporządkowaną listą elementów
[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]
Najlepszą odpowiedzią na to jest własna dokumentacja Apple .
Główna różnica polega na tym, że NSArray
dotyczy kolekcji zamówionej i NSSet
nieuporządkowanej.
Istnieje kilka artykułów, które mówią o różnicy w prędkości między nimi, jak ten . Jeśli przeglądasz nieuporządkowaną kolekcję, NSSet
to świetnie. Jednak w wielu przypadkach musisz robić rzeczy, które tylko on NSArray
może zrobić, więc poświęcasz prędkość dla tych umiejętności.
NSSet
NSArray
Tak naprawdę to wszystko! Jeśli to pomoże, to daj mi znać.
NSSet
na rzecz indeksowania. Często używa się dwóch różnych struktur danych dla tych samych danych. Albo budujesz i indeksujesz na tej tablicy :) Ale wtedy lepiej jest użyć bazy danych, która ma już zaimplementowaną.
NSSet
i NSArray
, moja odpowiedź jest dokładna i kompletna. Tak, możesz budować inne struktury danych, ale ja tylko porównuję te dwie.
NSArray
i jakiejś funkcjonalności z NSSet
, poprawną odpowiedzią nie jest „używaj NSArray
i poświęć wydajność”. Odpowiedź brzmi: połącz oba lub użyj innej struktury danych.
Tablica służy do uzyskiwania dostępu do elementów według ich indeksu. Dowolny element można wstawić do tablicy wielokrotnie. Tablice zachowują kolejność swoich elementów.
Zestaw jest używany w zasadzie tylko do sprawdzenia, czy przedmiot jest w kolekcji, czy nie. Pozycje nie mają pojęcia kolejności ani indeksowania. Nie możesz mieć elementu w zestawie dwukrotnie.
Jeśli tablica chce sprawdzić, czy zawiera element, musi sprawdzić wszystkie jej elementy. Zestawy są zaprojektowane do korzystania z szybszych algorytmów.
Możesz sobie wyobrazić zbiór jak słownik bez wartości.
Zauważ, że tablica i zbiór nie są jedynymi strukturami danych. Istnieją inne, np. Queue, Stack, Heap, Fibonacci's Heap. Poleciłbym przeczytać książkę o algorytmach i strukturach danych.
Więcej informacji można znaleźć w Wikipedii .
contains
operacji to O(n)
. Liczba porównań, gdy nie ma w tablicy, wynosi n
. Średnia liczba porównań, gdy obiekt znajduje się w tablicy, wynosi n/2
. Nawet jeśli obiekt zostanie znaleziony, wydajność jest okropna.
NSArray
s mają inne zalety szybkości w stosunku do NSSet
s. Jak zawsze, to kompromis.
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);
tablica
04.12.2015 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)
zestaw
04.12.2015 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
Główne różnice zostały już podane w innych odpowiedziach.
Chciałbym tylko zauważyć, że ze względu na sposób implementacji zestawów i słowników (tj. Za pomocą skrótów), należy uważać, aby nie używać obiektów mutowalnych dla kluczy.
Jeśli klucz jest zmutowany, to hash (prawdopodobnie) również się zmieni, wskazując na inny indeks / zasobnik w tablicy hash. Oryginalna wartość nie zostanie usunięta i będzie faktycznie brana pod uwagę przy wyliczaniu lub pytaniu struktury o jej rozmiar / liczbę.
Może to prowadzić do naprawdę trudnych do zlokalizowania błędów.
Tutaj można znaleźć dość dokładne porównanie struktur NSArray
i NSSet
danych.
Krótkie wnioski:
Tak, NSArray jest szybszy niż NSSet pod względem prostego trzymania i iteracji. Zaledwie 50% szybciej przy konstruowaniu i aż o 500% szybciej przy iteracji. Lekcja: jeśli potrzebujesz tylko iterować zawartość, nie używaj NSSet.
Oczywiście, jeśli chcesz przeprowadzić testy pod kątem włączenia, ciężko pracuj, aby uniknąć NSArray. Nawet jeśli potrzebujesz zarówno iteracji, jak i testów włączenia, prawdopodobnie nadal powinieneś wybrać zestaw NSSet. Jeśli chcesz zachować porządek w swojej kolekcji i przetestować ją pod kątem włączenia, powinieneś rozważyć przechowywanie dwóch kolekcji (NSArray i NSSet), z których każda zawiera te same obiekty.
NSDictionary jest wolniejszy w tworzeniu niż NSMapTable - ponieważ musi skopiować kluczowe dane. Nadrabia to szybszym wyszukiwaniem. Oczywiście te dwie osoby mają różne możliwości, więc w większości przypadków to ustalenie powinno opierać się na innych czynnikach.
Zwykle używasz zestawu, gdy szybkość dostępu jest najważniejsza, a kolejność nie ma znaczenia lub jest określana w inny sposób (za pomocą predykatu lub deskryptora sortowania). Na przykład dane podstawowe używają zestawów, gdy dostęp do obiektów zarządzanych uzyskuje się za pośrednictwem relacji to-many
Żeby dodać trochę tego, używam czasami seta tylko po to, aby usunąć duplikaty z tablicy, takie jak: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values