Arti dari hashing terbuka dan hashing tertutup

94

Hashing Terbuka (Rangkaian Terpisah):

Dalam hashing terbuka, kunci disimpan dalam daftar tertaut yang dilampirkan ke sel tabel hash.

Hashing Tertutup (Pengalamatan Terbuka):

Dalam hashing tertutup, semua kunci disimpan di tabel hash itu sendiri tanpa menggunakan daftar tertaut.

Saya tidak dapat memahami mengapa mereka disebut terbuka, tertutup dan terpisah. Bisakah seseorang menjelaskannya?

hareendra reddy
sumber
Sebenarnya kami tidak pernah menyimpan kunci dalam tabel hash, kami mengambil tuple (Key, Value) dan menggunakan kunci tersebut untuk menghitung di mana nilai harus disimpan. Jadi sebenarnya kami menyimpan nilai di Tabel Hash
Tn. Suryaa Jha

Jawaban:

117

Penggunaan "tertutup" vs. "terbuka" mencerminkan apakah kita terkunci atau tidak untuk menggunakan posisi atau struktur data tertentu (ini adalah deskripsi yang sangat kabur, tapi mudah-mudahan sisanya membantu).

Misalnya, "buka" dalam "pengalamatan terbuka" memberi tahu kita indeks (alias. Alamat) di mana objek akan disimpan dalam tabel hash tidak sepenuhnya ditentukan oleh kode hash-nya. Sebaliknya, indeks dapat bervariasi bergantung pada apa yang sudah ada di tabel hash.

"Tertutup" dalam "hashing tertutup" mengacu pada fakta bahwa kita tidak pernah meninggalkan tabel hash; setiap objek disimpan langsung pada indeks dalam array internal tabel hash. Perhatikan bahwa ini hanya mungkin dengan menggunakan semacam strategi pengalamatan terbuka. Ini menjelaskan mengapa "hashing tertutup" dan "pengalamatan terbuka" adalah sinonim.

Bandingkan ini dengan hashing terbuka - dalam strategi ini, tidak ada objek yang benar-benar disimpan dalam larik tabel hash; alih-alih setelah sebuah objek di-hash, itu disimpan dalam daftar yang terpisah dari array internal tabel hash. "terbuka" mengacu pada kebebasan yang kita dapatkan dengan meninggalkan tabel hash, dan menggunakan daftar terpisah. Ngomong-ngomong, "daftar terpisah" mengisyaratkan mengapa hashing terbuka juga dikenal sebagai "rangkaian terpisah".

Singkatnya, "tertutup" selalu mengacu pada semacam jaminan ketat, seperti ketika kami menjamin bahwa objek selalu disimpan langsung di dalam tabel hash (hashing tertutup). Kemudian, kebalikan dari "tertutup" adalah "terbuka", jadi jika Anda tidak memiliki jaminan seperti itu, strategi tersebut dianggap "terbuka".

Ken Wayne VanderLinde
sumber
17
Kita harus menambahkan bahwa Open Hashing (Separate Chaining) tidak terbatas pada daftar tertaut, yang tidak ramah cache dan mendenegerasikan serangan tabrakan ke perilaku O (n / 2). Anda juga dapat menggunakan pohon atau susunan yang diurutkan untuk ember yang bertabrakan.
rurban
downvote karena informasi yang bertentangan: Anda mengatakan "open" dan "closed adalah sinonim, lalu di akhir:" kebalikan dari "closed" adalah "open"
Marwen Trabelsi
1
@MarwenTrabelsi Saya tidak pernah mengatakan bahwa "tertutup" dan "terbuka" adalah sinonim.
Ken Wayne VanderLinde
'Ini menjelaskan mengapa "hashing tertutup" dan "pengalamatan terbuka" adalah sinonim.'
Marwen Trabelsi
1
Dapatkah seseorang memberikan sumber yang membuktikan bahwa ini adalah etimologi sejarah yang benar?
Santropedro
3

Anda memiliki array yang disebut "tabel hash".

Dalam Open Hashing, setiap sel dalam larik menunjuk ke daftar yang berisi benturan. Hash telah menghasilkan indeks yang sama untuk semua item dalam daftar tertaut.

Dalam Hashing Tertutup Anda hanya menggunakan satu larik untuk semuanya. Anda menyimpan tabrakan dalam larik yang sama. Triknya adalah dengan menggunakan beberapa cara cerdas untuk melompat dari collision ke collision unitl Anda menemukan apa yang Anda inginkan. Dan lakukan ini dengan cara yang dapat direproduksi / ditentukan.

Anton Andreev
sumber
2

Nama pengalamatan terbuka mengacu pada fakta bahwa lokasi ("alamat") elemen tidak ditentukan oleh nilai hashnya. (Metode ini juga disebut hashing tertutup).

Dalam rangkaian terpisah , setiap kotak bersifat independen, dan memiliki semacam ADT (daftar, pohon pencarian biner, dll) entri dengan indeks yang sama. Dalam tabel hash yang baik, setiap kotak memiliki nol atau satu entri, karena kita membutuhkan operasi dari urutan O (1) untuk penyisipan, pencarian, dll.

Ini adalah contoh dari chaining terpisah menggunakan C ++ dengan fungsi sederhana hash menggunakan operator mod (jelas, fungsi hash yang buruk)

D. Pérez
sumber