HashSet Struktur data C # HashSet diperkenalkan di .NET Framework 3.5. Daftar lengkap anggota yang diimplementasikan dapat ditemukan di halaman MSDN HashSet .
- Di mana itu digunakan?
- Mengapa Anda ingin menggunakannya?
HashSet Struktur data C # HashSet diperkenalkan di .NET Framework 3.5. Daftar lengkap anggota yang diimplementasikan dapat ditemukan di halaman MSDN HashSet .
Jawaban:
A HashSet
memegang satu set objek, tetapi dengan cara yang memungkinkan Anda untuk dengan mudah dan cepat menentukan apakah suatu objek sudah di set atau tidak. Itu melakukannya dengan secara internal mengelola array dan menyimpan objek menggunakan indeks yang dihitung dari kode hash objek. Coba lihat di sini
HashSet
adalah koleksi tidak berurutan yang mengandung elemen unik. Ini memiliki operasi pengumpulan standar Tambahkan, Hapus, Berisi, tetapi karena menggunakan implementasi berbasis hash, operasi ini adalah O (1). (Berbeda dengan Daftar misalnya, yang O (n) untuk Berisi dan Hapus.) HashSet
Juga menyediakan operasi set standar seperti penyatuan , persimpangan , dan perbedaan simetris . Coba lihat di sini
Ada implementasi Sets yang berbeda. Beberapa membuat operasi penyisipan dan pencarian sangat cepat dengan elemen hashing. Namun, itu berarti bahwa urutan unsur-unsur ditambahkan hilang. Implementasi lain mempertahankan pesanan tambahan dengan biaya waktu berjalan yang lebih lambat.
The HashSet
kelas dalam C # berlaku untuk pendekatan pertama, sehingga tidak menjaga urutan elemen. Ini jauh lebih cepat daripada yang biasa List
. Beberapa tolok ukur dasar menunjukkan bahwa HashSet lumayan cepat ketika berhadapan dengan tipe primer (int, double, bool, dll.). Ini jauh lebih cepat ketika bekerja dengan objek kelas. Jadi intinya adalah HashSet cepat.
Satu-satunya kelemahan HashSet
adalah bahwa tidak ada akses oleh indeks. Untuk mengakses elemen, Anda dapat menggunakan enumerator atau menggunakan fungsi bawaan untuk mengonversikannya HashSet
menjadi List
dan mengulanginya. Coba lihat di sini
A HashSet
memiliki struktur internal (hash), di mana item dapat dicari dan diidentifikasi dengan cepat. The downside adalah bahwa iterasi melalui HashSet
(atau mendapatkan item dengan indeks) agak lambat.
Jadi mengapa seseorang ingin dapat mengetahui apakah suatu entri sudah ada dalam set?
Satu situasi di mana a HashSet
berguna adalah dalam mendapatkan nilai yang berbeda dari daftar tempat duplikat mungkin ada. Setelah item ditambahkan ke item HashSet
, cepat untuk menentukan apakah item ada ( Contains
operator).
Keuntungan lain dari HashSet
yang operasi Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Jika Anda terbiasa dengan bahasa kendala objek maka Anda akan mengidentifikasi operasi set ini. Anda juga akan melihat bahwa ini selangkah lebih dekat dengan implementasi UML yang dapat dieksekusi.
Sederhananya dan tanpa mengungkapkan rahasia dapur:
satu set secara umum, adalah koleksi yang tidak mengandung unsur duplikat, dan yang unsur-unsurnya tidak ada dalam urutan tertentu. Jadi, A HashSet<T>
mirip dengan generik List<T>
, tetapi dioptimalkan untuk pencarian cepat (melalui hashtable, seperti namanya) dengan biaya kehilangan pesanan.
Dari perspektif aplikasi, jika seseorang hanya perlu menghindari duplikat maka HashSet
apa yang Anda cari sejak itu adalah Pencarian, Masukkan dan Hapus kompleksitas adalah O (1) - konstan . Apa artinya ini tidak masalah berapa banyak elemen yang HashSet
memerlukan waktu yang sama untuk memeriksa apakah ada elemen seperti itu atau tidak, ditambah karena Anda memasukkan elemen pada O (1) juga membuatnya sempurna untuk hal semacam ini.