Ada beberapa teknik yang menjamin bahwa pencarian akan selalu membutuhkan operasi O (1), bahkan dalam kasus terburuk.
Bagaimana saya bisa menentukan apakah tabel hash memiliki peluang untuk memiliki operasi O (1), dan mungkin teknik mana yang digunakan pada fungsi hash saya?
Kasus terburuk terjadi ketika beberapa penyerang jahat (Mallory) sengaja memberi Anda data yang dipilih Mallory khusus untuk membuat sistem berjalan lambat.
Setelah Anda memilih beberapa fungsi hash tertentu, mungkin terlalu optimis untuk menganggap Mallory tidak akan pernah mengetahui fungsi hash mana yang Anda pilih. Setelah Mallory menemukan fungsi hash yang Anda pilih, jika Anda mengizinkan Mallory memberi Anda banyak data untuk dimasukkan ke tabel hash Anda menggunakan fungsi hash, maka Anda akan hancur: Mallory secara internal dapat dengan cepat menghasilkan miliaran item data, hash dengan Anda fungsi hash untuk menemukan item data mana yang cenderung bertabrakan, dan kemudian memberi Anda jutaan item data satu-dalam-seribu yang cenderung bertabrakan, yang mengarah ke pencarian yang berjalan jauh lebih lambat daripada O (1).
Semua teknik yang menjamin "O (1) pencarian bahkan dalam kasus terburuk" hindari masalah ini dengan melakukan sedikit kerja ekstra pada setiap penyisipan untuk menjamin bahwa, di masa depan, setiap pencarian yang mungkin dapat berhasil dalam O (1) waktu . Secara khusus, kami mengasumsikan (kasus terburuk) bahwa Mallory cepat atau lambat akan menemukan fungsi hash mana yang kami gunakan; tetapi dia hanya mendapat kesempatan untuk memasukkan beberapa item data sebelum kita memilih fungsi hash yang berbeda - tabulasi hashing atau hashing universal lainnya - yang kita pilih secara khusus sehingga semua data yang kita miliki sejauh ini dapat dilihat dalam 2 atau 3 probe - yaitu, O (1). Karena kami memilih fungsi ini secara acak, kami dapat yakin bahwa Mallory tidak akan tahu fungsi apa yang kami pilih untuk sementara waktu. Bahkan jika Mallorysegera memberi kita data bahwa, bahkan dengan fungsi hash baru ini, bertabrakan dengan data sebelumnya, kita kemudian dapat memilih fungsi hash baru yang baru sehingga, setelah mengulangi, semua data sebelumnya yang dia dan orang lain berikan kepada kita sekarang dapat dilihat di 2 atau 3 probe dalam kasus terburuk - yaitu, O (1) pencarian dalam kasus terburuk.
Ini cukup mudah untuk secara acak memilih fungsi hash baru dan mengulangi seluruh tabel cukup sering untuk menjamin bahwa setiap pencarian selalu O (1). Meskipun ini menjamin bahwa setiap pencarian selalu O (1), teknik-teknik ini, saat memasukkan item N ke dalam tabel hash yang sudah berisi item N-1, kadang-kadang dapat membutuhkan waktu O (N) untuk memasukkan itu. Namun, adalah mungkin untuk merancang sistem sedemikian rupa sehingga, bahkan ketika Mallory dengan sengaja memberi Anda data baru, dengan menggunakan fungsi hash baru, bertabrakan dengan data sebelumnya, sistem dapat menerima banyak item dari Mallory dan lainnya sebelum perlu melakukan O penuh (N) dibangun kembali. Teknik tabel hash yang memilih fungsi baru dan pengulangan untuk menjamin O (1) pencarian, bahkan dalam kasus terburuk, termasuk:
- jaminan hash cuckoo bahwa setiap pencarian kunci berhasil dengan paling banyak 2 perhitungan hash dan 2 pencarian tabel.
- hashing hopscotch menjamin bahwa setiap pencarian kunci berhasil setelah memeriksa sejumlah kecil H (mungkin H = 32) entri berturut-turut dalam tabel.
- dynamic perfect hashing - makalah 1994 oleh Dietzfelbinger adalah yang pertama saya baca yang menunjukkan bahwa, meskipun mengulangi "sering" untuk memastikan bahwa setiap pencarian kunci selalu berhasil dengan 2 perhitungan hash dan 2 pencarian, itu mungkin untuk melakukan pengulangan penuh sangat jarang sehingga meskipun setiap pengulangan penuh menggunakan waktu O (n), biaya rata-rata penyisipan dan penghapusan yang diharapkan adalah O (1) diamortisasi.
Struktur Data / Tabel Hash