Kisah bahwa tabel hash diamortisasi adalah kebohongan penyederhanaan berlebihan. Θ(1)
Ini hanya berlaku jika:
- Jumlah data untuk hash per item sepele dibandingkan dengan jumlah K eys dan kecepatan hashing K ey cepat - .
- Jumlah C ollisions kecil - .
- Kami tidak memperhitungkan waktu akun yang dibutuhkan untuk R esize tabel hash - .k
c
r
String besar untuk hash
Jika asumsi pertama salah, waktu berjalan akan naik ke .
Ini benar untuk string besar, tetapi untuk string besar perbandingan sederhana juga akan memiliki waktu berjalan . Jadi hash tidak lebih lambat secara asimptot, meskipun hashing akan selalu lebih lambat daripada perbandingan sederhana, karena perbandingan memiliki awal memilih keluar ergo , dan hashing selalu harus hash string penuh , . Θ(k)
Θ(k)O(1)Ω(k)O(k)Ω(k)
Perhatikan bahwa bilangan bulat tumbuh sangat lambat. 8 byte dapat menyimpan nilai hingga ; 8 byte adalah jumlah yang sepele untuk hash.
Jika Anda ingin menyimpan bigints maka anggap saja itu sebagai string. 1018
Algoritma hash lambat
Jika hashing pengeluaran jumlah adalah non-sepele dibandingkan dengan penyimpanan data maka jelas asumsi menjadi tidak bisa dipertahankan.
Kecuali jika hash kriptografi digunakan, ini seharusnya tidak menjadi masalah.Θ(1)
Yang penting . Selama itu berlaku adalah pernyataan yang adil.n >> kΘ(1)
Banyak tabrakan
Jika fungsi hashing buruk, atau tabel hash kecil, atau ukuran tabel hash canggung tabrakan akan sering dan waktu berjalan akan pergi ke .
Fungsi hashing harus dipilih sehingga tabrakan jarang terjadi sementara masih secepat mungkin, ketika ragu-ragu memilih tabrakan yang lebih sedikit dengan mengorbankan hashing yang lebih lambat.
Aturan praktisnya adalah bahwa tabel hashing harus selalu kurang dari 75% penuh.
Dan ukuran tabel hashing seharusnya tidak memiliki korelasi dengan fungsi hashing.
Seringkali ukuran tabel hashing (relatif) prima. O(log(n))
Mengubah ukuran tabel hash
Karena tabel hash yang hampir penuh akan memberikan terlalu banyak tabrakan dan tabel hash (kosong) yang besar adalah pemborosan ruang, banyak implementasi yang memungkinkan tabel hash untuk tumbuh (dan menyusut!) Sesuai kebutuhan.
Pertumbuhan tabel dapat melibatkan salinan lengkap semua item (dan mungkin perombakan), karena penyimpanan harus kontinu untuk alasan kinerja.
Hanya dalam kasus-kasus patologis perubahan ukuran tabel hash menjadi masalah sehingga ukuran (mahal tapi jarang) diamortisasi di banyak panggilan.
Running time
Jadi waktu running sebenarnya dari tabel hash adalah .
Setiap , , rata-rata diasumsikan sebagai konstanta (kecil) dalam waktu berjalan diamortisasi dan dengan demikian kita mengatakan bahwa adalah pernyataan yang adil. Θ(kcr)
kcrΘ(1)
Untuk kembali ke pertanyaan Anda.
Maafkan saya karena parafrase, saya sudah mencoba untuk mengekstrak berbagai makna, jangan ragu untuk berkomentar jika saya melewatkan beberapa
Anda tampaknya khawatir tentang panjang output dari fungsi hash. Sebut ini ( umumnya dianggap jumlah item yang akan di-hash). akan menjadi karena m perlu mengidentifikasi entri dalam tabel hash secara unik.
Ini berarti bahwa m tumbuh sangat lambat. Pada 64 bit jumlah entri tabel hash akan mengambil porsi yang cukup besar dari RAM yang tersedia di seluruh dunia. Pada 128 bit itu akan jauh melebihi penyimpanan disk yang tersedia di planet bumi.
Memproduksi hash 128 bit tidak jauh lebih sulit daripada hash 32 bit, jadi tidak , waktu untuk membuat hash bukanlah (atau jika Anda mau). mnmlog(n)
O(m)O(log(n))
Fungsi hash melalui bit elemen akan memakan waktu waktu. log(n)Θ(log(n))
Tetapi fungsi hash tidak melalui bit elemen.
Per satu item (!!) hanya berlaku untuk data .
Juga panjang input (k) tidak ada hubungannya dengan jumlah elemen. Ini penting, karena beberapa algoritma non hashing harus memeriksa banyak elemen dalam koleksi untuk menemukan elemen (non) yang cocok.
Tabel hash hanya melakukan perbandingan 1 atau 2 per item yang sedang dipertimbangkan rata-rata sebelum mencapai kesimpulan. log(n)
O(k)
Mengapa tabel hash efisien untuk menyimpan elemen panjang variabel?
Karena terlepas dari panjang input ( ) panjang output ( ) selalu sama, tabrakan jarang terjadi dan waktu pencarian konstan.
Namun ketika panjang kunci tumbuh besar dibandingkan dengan jumlah item dalam tabel hash ( ) cerita berubah ...km
kn
Mengapa tabel hash efisien untuk menyimpan string besar?
Tabel hash tidak terlalu efisien untuk string yang sangat besar.
Jika (yaitu ukuran input agak besar dibandingkan dengan jumlah item dalam tabel hash) maka kita tidak bisa lagi mengatakan bahwa hash memiliki waktu berjalan yang konstan, tetapi harus beralih ke waktu berjalan dari terutama karena tidak ada awal. Anda harus hash kunci lengkap. Jika Anda hanya menyimpan sejumlah item terbatas, maka Anda mungkin jauh lebih baik menggunakan penyimpanan yang diurutkan, karena ketika membandingkan Anda dapat memilih keluar segera setelah perbedaan terlihat. not n>>kΘ(k)k1 ≠ k2
Namun, jika Anda mengetahui data Anda, Anda dapat memilih untuk tidak meng-hash kunci penuh, tetapi hanya bagian (dikenal atau diasumsikan) yang volatil darinya, memulihkan properti sembari tetap menjaga tabrakan tetap terkendali. Θ(1)
Konstanta Tersembunyi
Karena semua orang harus tahu berarti bahwa waktu per elemen yang diproses adalah konstan. Konstanta ini sedikit lebih besar untuk hashing daripada untuk perbandingan sederhana.
Untuk tabel kecil, pencarian biner akan lebih cepat daripada pencarian hash, karena misalnya 10 perbandingan biner mungkin lebih cepat daripada hash tunggal.
Untuk dataset kecil, alternatif untuk tabel hash harus dipertimbangkan.
Ada pada dataset besar yang tabel hash benar-benar bersinar.Θ(1)