Tabel hash menyimpan pasangan kunci-nilai dengan melakukan hashing pada setiap kunci ke sebuah indeks array. Ini memungkinkan tabel langsung menuju lokasi yang mendekati posisi yang benar, alih-alih memeriksa setiap item yang tersimpan satu per satu.
Itulah sebabnya tabel hash sering kali mendekati untuk pencarian, penyisipan, dan penghapusan secara rata-rata. Syaratnya penting: fungsi hash harus menyebarkan kunci dengan cukup baik, dan tabel tetap memerlukan aturan untuk menangani tabrakan.
Apa yang Dilakukan Tabel Hash
Tabel hash menyimpan pasangan kunci-nilai seperti "name" -> "Ada" atau 42 -> "blue". Tabel ini memiliki dua bagian utama:
- sebuah array slot atau bucket
- sebuah fungsi hash yang memetakan setiap kunci ke salah satu slot tersebut
Jika array memiliki slot, Anda bisa membayangkan fungsi hash menghasilkan indeks dari sampai .
Untuk contoh bilangan bulat kecil, aturannya bisa berupa
Maka kunci masuk ke slot karena .
Fungsi hash nyata dirancang dengan lebih hati-hati, terutama untuk string dan himpunan data yang lebih besar. Namun gagasan intinya tetap sama: hitung sebuah indeks dengan cepat, lalu periksa item yang disimpan di sana.
Mengapa Tabrakan Hash Tidak Bisa Dihindari
Tabrakan terjadi ketika dua kunci yang berbeda dipetakan ke slot yang sama.
Ini hal yang normal karena tabel biasanya memiliki lebih sedikit slot daripada jumlah kemungkinan kunci. Dengan
kunci , , dan semuanya dipetakan ke slot . Jadi meskipun fungsi bekerja persis seperti yang didefinisikan, tabel tetap memiliki konflik yang harus diselesaikan.
Jadi tabel hash tidak menjanjikan slot yang unik untuk setiap kunci. Yang dijanjikan adalah cara cepat untuk mempersempit pencarian, asalkan tabrakan ditangani dengan baik.
Contoh Langkah demi Langkah: Satu Tabel, Satu Tabrakan
Misalkan sebuah tabel memiliki slot dan menggunakan
Masukkan kunci , , dan .
Pertama, masuk ke slot karena .
Berikutnya, juga di-hash ke slot , sehingga terjadi tabrakan.
Lalu masuk ke slot , jadi penyisipan itu tidak mengalami tabrakan.
Pola yang berguna selalu sama:
- Hash kuncinya.
- Pergi ke slot yang disarankan.
- Jika kunci yang berbeda sudah ada di sana, terapkan aturan tabrakan.
Setelah pola itu jelas, dua strategi utama penanganan tabrakan akan lebih mudah dipahami.
Chaining Vs. Open Addressing
Chaining menyimpan bucket di setiap slot
Dalam chaining, setiap slot menyimpan kumpulan kecil entri, bukan hanya satu.
Jika dan sama-sama di-hash ke slot , bucket mungkin menyimpan
Untuk mencari kunci , tabel langsung menuju bucket dan membandingkan hanya entri yang ada di bucket tersebut.
Chaining secara konsep sederhana, dan penghapusan biasanya lebih mudah daripada pada open addressing. Konsekuensinya, bucket yang panjang membuat operasi menjadi lebih lambat.
Open addressing tetap berada di dalam array
Dalam open addressing, setiap slot array menampung paling banyak satu entri. Jika slot asal penuh, tabel akan memeriksa slot lain menurut aturan tetap.
Salah satu aturan yang umum adalah linear probing: jika slot terisi, coba , lalu , lalu , dan kembali ke awal jika diperlukan.
Ini menghindari daftar bucket terpisah, tetapi slot-slot penuh yang berdekatan dapat membentuk cluster. Detail lain adalah pencarian dan penghapusan harus mengikuti aturan probing yang sama seperti saat penyisipan.
Kapan Klaim Itu Masuk Akal
Tabel hash sering dijelaskan memiliki pencarian, penyisipan, dan penghapusan secara rata-rata. Pernyataan kasus rata-rata itu bergantung pada beberapa syarat:
- fungsi hash menyebarkan kunci dengan cukup baik
- load factor tetap terkendali
- strategi penanganan tabrakan diimplementasikan dengan benar
Load factor adalah rasio
Jika tabel menjadi terlalu penuh, tabrakan menjadi lebih sering, dan performa memburuk. Itulah sebabnya banyak implementasi mengubah ukuran array saat mulai terisi.
Performa kasus terburuk tetap bisa menurun mendekati jika terlalu banyak kunci menumpuk di area yang sama.
Kesalahan Umum pada Tabel Hash
Menganggap tabrakan berarti fungsi hash gagal
Tidak. Tabrakan memang diharapkan. Pertanyaan yang sebenarnya adalah apakah tabel menanganinya secara efisien.
Menganggap berlaku tanpa syarat
biasanya adalah pernyataan kasus rata-rata, bukan janji untuk setiap input dan setiap saat.
Mencampuradukkan hashing di sini dengan enkripsi
Fungsi hash dalam konteks struktur data dasar terutama digunakan untuk pengindeksan cepat, bukan kerahasiaan. Keduanya memiliki tujuan yang berbeda.
Lupa membandingkan kunci yang sebenarnya
Dua kunci bisa memiliki hasil hash yang sama. Setelah sampai di bucket atau posisi probe yang tepat, tabel tetap harus memeriksa apakah kuncinya benar-benar cocok.
Kapan Tabel Hash Digunakan
Tabel hash digunakan ketika pencarian cepat berdasarkan kunci itu penting. Contoh umum meliputi dictionary, symbol table, cache, indexing, dan menghitung frekuensi dalam data.
Struktur ini sangat cocok ketika pencarian tepat berdasarkan kunci lebih penting daripada menjaga item tetap dalam urutan terurut. Jika Anda memerlukan penelusuran berurutan, range query, atau nilai terdekat, struktur lain mungkin lebih baik.
Coba Contoh Tabrakan yang Mirip
Ambil array kecil dengan slot dan gunakan . Masukkan beberapa kunci seperti , , , dan . Lalu selesaikan tabrakan sekali dengan chaining dan sekali dengan linear probing.
Satu latihan itu membuat gagasan utamanya cepat menjadi konkret: tabrakan tidak bisa dihindari, dan aturan tabrakan mengubah cara tabel berperilaku. Jika Anda ingin langkah lanjutan yang berguna, coba versi Anda sendiri dengan ukuran tabel yang berbeda dan lihat bagaimana tabrakannya berubah.
Butuh bantuan mengerjakan soal?
Unggah pertanyaanmu dan dapatkan solusi terverifikasi langkah demi langkah dalam hitungan detik.
Buka GPAI Solver →