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 HashSetmemegang 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
HashSetadalah 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.) HashSetJuga 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 HashSetkelas 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 HashSetadalah bahwa tidak ada akses oleh indeks. Untuk mengakses elemen, Anda dapat menggunakan enumerator atau menggunakan fungsi bawaan untuk mengonversikannya HashSetmenjadi Listdan mengulanginya. Coba lihat di sini
A HashSetmemiliki 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 HashSetberguna adalah dalam mendapatkan nilai yang berbeda dari daftar tempat duplikat mungkin ada. Setelah item ditambahkan ke item HashSet, cepat untuk menentukan apakah item ada ( Containsoperator).
Keuntungan lain dari HashSetyang 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 HashSetapa yang Anda cari sejak itu adalah Pencarian, Masukkan dan Hapus kompleksitas adalah O (1) - konstan . Apa artinya ini tidak masalah berapa banyak elemen yang HashSetmemerlukan 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.