Jawaban:
Jika urutan item dalam koleksi tidak penting, set menawarkan kinerja yang lebih baik untuk menemukan item dalam koleksi.
Alasannya adalah bahwa satu set menggunakan nilai hash untuk menemukan item (seperti kamus) sementara array harus mengulangi seluruh isinya untuk menemukan objek tertentu.
Gambar dari Dokumentasi Apple menggambarkannya dengan sangat baik:
Array
adalah sebuah memerintahkan (agar dipertahankan ketika Anda menambahkan) urutan elemen
[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
adalah daftar elemen yang berbeda (tidak ada duplikat) dan tidak berurutan
[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]
Jawaban terbaik untuk ini adalah dokumentasi Apple sendiri .
Perbedaan utamanya NSArray
adalah untuk koleksi yang dipesan dan NSSet
untuk koleksi yang tidak diurutkan .
Ada beberapa artikel di luar sana yang membahas tentang perbedaan kecepatan antara keduanya, seperti ini . Jika Anda mengulang melalui koleksi yang tidak diurutkan, NSSet
itu bagus. Namun, dalam banyak kasus, Anda perlu melakukan hal-hal yang hanya NSArray
dapat dilakukan, jadi Anda mengorbankan kecepatan untuk kemampuan tersebut.
NSSet
NSArray
Hanya itu yang benar-benar ada untuk itu! Beri tahu saya jika itu membantu.
NSSet
demi pengindeksan. Biasanya menggunakan dua struktur data yang berbeda untuk data yang sama. Atau Anda membangun dan mengindeks pada array tersebut :) Tapi lebih baik menggunakan DB yang sudah diimplementasikan.
NSSet
dan NSArray
, jawaban saya akurat dan lengkap. Ya, Anda dapat membangun struktur data lain, tetapi saya hanya membandingkan keduanya.
NSArray
dan beberapa fungsi dari NSSet
, jawaban yang benar bukanlah "menggunakan NSArray
dan mengorbankan kinerja". Jawabannya adalah menggabungkan keduanya atau menggunakan struktur data yang berbeda.
Sebuah array digunakan untuk mengakses item dengan indeksnya. Item apa pun dapat dimasukkan ke dalam array beberapa kali. Array menjaga urutan elemennya.
Satu set pada dasarnya digunakan hanya untuk memeriksa apakah item tersebut ada dalam koleksi atau tidak. Item tidak memiliki konsep urutan atau pengindeksan. Anda tidak dapat memiliki item dalam satu set dua kali.
Jika sebuah array ingin memeriksa apakah mengandung sebuah elemen, ia harus memeriksa semua itemnya. Set dirancang untuk menggunakan algoritme yang lebih cepat.
Anda bisa membayangkan satu set seperti kamus tanpa nilai.
Perhatikan bahwa array dan set bukanlah satu-satunya struktur data. Ada yang lainnya, misal Queue, Stack, Heap, Fibonacci's Heap. Saya akan merekomendasikan membaca buku tentang algoritma dan struktur data.
Lihat wikipedia untuk informasi lebih lanjut.
contains
operasinya O(n)
. Jumlah perbandingan jika tidak ada dalam array n
. Jumlah rata-rata perbandingan saat objek berada dalam larik adalah n/2
. Bahkan jika objeknya ditemukan, kinerjanya buruk.
NSArray
s memiliki keunggulan kecepatan lainnya dibandingkan NSSet
s. Seperti biasa, ini adalah pengorbanan.
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);
larik
04-12-2015 11: 05: 40,935 [598: 15730] (1, 2, 3, 4, 2, 1)
set
04-04-2015 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
Perbedaan utama telah diberikan dalam jawaban lain.
Saya hanya ingin mencatat bahwa karena cara set dan kamus diimplementasikan (yaitu menggunakan hash), seseorang harus berhati-hati untuk tidak menggunakan objek yang bisa berubah untuk kunci.
Jika kunci dimutasi maka hash (mungkin) juga akan berubah, menunjuk ke indeks / keranjang yang berbeda dalam tabel hash. Nilai asli tidak akan dihapus dan akan benar-benar diperhitungkan saat menghitung atau menanyakan struktur untuk ukuran / hitungannya.
Ini dapat menyebabkan beberapa bug sangat sulit ditemukan.
Di sini Anda dapat menemukan perbandingan yang cukup menyeluruh dari struktur data NSArray
dan NSSet
.
Kesimpulan singkat:
Ya, NSArray lebih cepat daripada NSSet karena hanya menahan dan mengulang. Lebih cepat 50% untuk membangun dan 500% lebih cepat untuk iterasi. Pelajaran: jika Anda hanya perlu mengulang konten, jangan gunakan NSSet.
Tentu saja, jika Anda perlu menguji inklusi, bekerja keras untuk menghindari NSArray. Bahkan jika Anda membutuhkan pengujian iterasi dan inklusi, Anda mungkin masih harus memilih NSSet. Jika Anda perlu menjaga agar koleksi Anda tetap teratur dan juga menguji penyertaan, Anda harus mempertimbangkan untuk menyimpan dua koleksi (NSArray dan NSSet), masing-masing berisi objek yang sama.
NSDictionary lebih lambat untuk dibuat daripada NSMapTable - karena perlu menyalin data kunci. Itu membuat ini dengan menjadi lebih cepat untuk mencari. Tentu saja, keduanya memiliki kemampuan yang berbeda sehingga seringkali penentuan ini harus dilakukan pada faktor-faktor lain.
Hanya untuk menambahkan sedikit saja saya menggunakan set kadang-kadang hanya untuk menghapus duplikat dari array seperti: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values