Jawaban ini merangkum bagian-bagian dari TAoCP Vol 3, Bab 6.4.
Asumsikan kita memiliki seperangkat nilai , n yang ingin kita simpan dalam array A ukuran m . Kami menggunakan fungsi hash h : V → [ 0 .. M ) ; biasanya, M ≪ | V | . Kami memanggil α = nVnAmh:V→[0..M)M≪|V| denganload factordariA. Di sini, kita akan mengasumsikan naturalm=M; dalam skenario praktis, kita memilikim«M, meskipun, dan harus memetakan kemdiri kita sendiri.α=nmAm=Mm≪Mm
Pengamatan pertama adalah bahwa bahkan jika memiliki karakteristik seragam-probabilitas dua nilai memiliki nilai hash yang sama tinggi; ini pada dasarnya adalah contoh dari paradoks ulang tahun yang terkenal . Oleh karena itu, kita biasanya harus berurusan dengan konflik dan dapat meninggalkan harapan O ( 1 ) waktu akses kasus terburuk.hO(1)
Bagaimana dengan kasus rata-rata? Mari kita asumsikan bahwa setiap kunci dari muncul dengan probabilitas yang sama. Jumlah rata-rata entri yang diperiksa C S n (pencarian berhasil) resp. C U n (pencarian yang gagal) tergantung pada metode resolusi konflik yang digunakan.[0..M)CSnCUn
Rantai
Setiap entri array berisi (pointer ke kepala) daftar tertaut. Ini adalah ide yang bagus karena panjang daftar yang diharapkan kecil ( ) meskipun probabilitas untuk tabrakan tinggi. Pada akhirnya, kita mendapatkan
C S n ≈1+αnm
Ini dapat ditingkatkan sedikit dengan menyimpan daftar (sebagian atau seluruhnya) di dalam tabel.
CSn≈ 1 + α2 dan CUn≈ 1 + α22.
Probing Linier
Ketika memasukkan (resp. Mencari nilai) , periksa posisi
h ( v ) , h ( v ) - 1 , … , 0 , m - 1 , … , h ( v ) + 1
dalam urutan ini hingga posisi kosong (resp . v ) ditemukan. Keuntungannya adalah kami bekerja secara lokal dan tanpa struktur data sekunder; Namun, jumlah akses rata-rata berbeda untuk α → 1 :
C S n ≈ 1v
h ( v ) , h ( v ) - 1 , … , 0 , m - 1 , … , h ( v ) + 1
vα → 1
Namun untuk
α<0,75, kinerjanya sebanding dengan chaining².
CSn≈ 12( 1 + 11 - α) dan CUn≈ 12( 1 + ( 11 - α)2) .
α < 0,75
Hashing ganda
Mirip dengan linear probing tetapi ukuran langkah pencarian dikendalikan oleh fungsi hash kedua yang coprime untuk . Tidak ada derivasi formal yang diberikan, tetapi pengamatan empiris menunjukkan
C S n ≈ 1M.
Metode ini telah diadaptasi oleh Brent; variannya diamortisasi meningkatkan biaya penyisipan dengan pencarian lebih murah.
CSn≈ 1αdalam( 11 - α) dan CUn≈ 11 - α.
Perhatikan bahwa menghapus elemen dari dan memperluas tabel memiliki berbagai tingkat kesulitan untuk metode masing-masing.
Intinya, Anda harus memilih implementasi yang beradaptasi dengan baik dengan kasus penggunaan khas Anda. Waktu akses yang diharapkan dalam dimungkinkan jika tidak selalu dijamin. Tergantung pada metode yang digunakan, menjaga α rendah sangat penting; Anda harus menukar waktu akses (yang diharapkan) dengan overhead ruang. Pilihan yang baik untuk h juga sangat penting.O ( 1 )αh
h
Hashtable