Significato di hashing aperto e hash chiuso


94

Hashing aperto (concatenamento separato):

Nell'hashing aperto, le chiavi vengono archiviate in elenchi collegati allegati alle celle di una tabella hash.

Hashing chiuso (indirizzamento aperto):

Nell'hashing chiuso, tutte le chiavi vengono archiviate nella tabella hash stessa senza l'uso di elenchi collegati.

Non riesco a capire perché siano chiamati aperti, chiusi e separati. Qualcuno può spiegarlo?


In realtà non memorizziamo mai le chiavi nelle tabelle hash, prendiamo una tupla (Key, Value) e usiamo la chiave per calcolare dove deve essere memorizzato il valore. Quindi in realtà memorizziamo i valori nella tabella hash
Mr. Suryaa Jha

Risposte:


117

L'uso di "chiuso" e "aperto" riflette se siamo o meno vincolati all'utilizzo di una certa posizione o struttura dati (questa è una descrizione estremamente vaga, ma si spera che il resto aiuti).

Ad esempio, "open" in "open addressing" ci dice che l'indice (noto anche come indirizzo) in cui un oggetto verrà memorizzato nella tabella hash non è completamente determinato dal suo codice hash. Invece, l'indice può variare a seconda di ciò che è già nella tabella hash.

Il "closed" in "closed hashing" si riferisce al fatto che non abbandoniamo mai la tabella hash; ogni oggetto viene memorizzato direttamente in un indice nell'array interno della tabella hash. Notare che questo è possibile solo utilizzando una sorta di strategia di indirizzamento aperta. Questo spiega perché "hashing chiuso" e "indirizzamento aperto" sono sinonimi.

Confrontalo con l'hashing aperto: in questa strategia, nessuno degli oggetti è effettivamente memorizzato nell'array della tabella hash; una volta che un oggetto è stato sottoposto ad hashing, invece, viene memorizzato in un elenco separato dall'array interno della tabella hash. "aperto" si riferisce alla libertà che otteniamo abbandonando la tabella hash e utilizzando un elenco separato. A proposito, "elenco separato" suggerisce perché l'hashing aperto è anche noto come "concatenamento separato".

In breve, "closed" si riferisce sempre a una sorta di garanzia rigorosa, come quando garantiamo che gli oggetti siano sempre archiviati direttamente all'interno della tabella hash (hashing chiuso). Quindi, l'opposto di "chiuso" è "aperto", quindi se non hai tali garanzie, la strategia è considerata "aperta".


17
Dovremmo aggiungere che Open Hashing (Separate Chaining) non è limitato agli elenchi collegati, che non sono compatibili con la cache e denegerano sugli attacchi di collisione al comportamento O (n / 2). È inoltre possibile utilizzare alberi o array ordinati per i bucket in collisione.
Rurban

downvote a causa delle informazioni contrastanti: hai detto "aperto" e "chiuso sono sinonimi, quindi alla fine:" l'opposto di "chiuso" è "aperto"
Marwen Trabelsi

1
@MarwenTrabelsi Non ho mai detto che "chiuso" e "aperto" siano sinonimi.
Ken Wayne VanderLinde

"Questo spiega perché" hashing chiuso "e" indirizzamento aperto "sono sinonimi."
Marwen Trabelsi

1
Qualcuno può fornire una fonte che dimostri che questa è l'etimologia storica corretta?
Santropedro

3

Hai un array che è la "tabella hash".

In Hashing aperto ogni cella dell'array punta a un elenco contenente le collisioni. L'hashing ha prodotto lo stesso indice per tutti gli elementi nell'elenco collegato.

In Hashing chiuso si utilizza un solo array per tutto. Memorizzi le collisioni nello stesso array. Il trucco è usare un modo intelligente per passare da una collisione all'altra finché non trovi quello che vuoi. E fallo in modo riproducibile / deterministico.


2

Il nome di indirizzamento aperto si riferisce al fatto che la posizione ("indirizzo") dell'elemento non è determinata dal suo valore hash. (Questo metodo è anche chiamato hashing chiuso).

In concatenamento separato , ogni bucket è indipendente e ha una sorta di ADT (elenco, alberi di ricerca binari, ecc.) Di voci con lo stesso indice. In una buona tabella hash, ogni bucket ha zero o una voce, perché abbiamo bisogno di operazioni di ordine O (1) per inserimento, ricerca, ecc.

Questo è un esempio di concatenamento separato usando C ++ con una semplice funzione hash usando l'operatore mod (chiaramente, una cattiva funzione hash)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.