5

collegamento relativo: http://en.wikipedia.org/wiki/Hopscotch_hashingCosa succede nelle tabelle hash Hopscotch quando sono presenti più collisioni hash effettive di sizeof (Neighborhood)?

Hopscotch tabelle hash sembrano grande, ma io non hanno trovato una risposta a questa domanda nella letteratura: che cosa succede se la mia taglia quartiere è N e (a causa di illeciti o estremamente sfortuna) I inserire N + 1 elementi che hanno tutti lo stesso hash allo stesso valore?

+1

Quanto è strano - il documento originale non risolve questo problema (penso che si assuma la scelta di una diversa funzione di hash?) E le implementazioni che ho visto finora non lo supportano correttamente. Sono molto curioso di sapere qual è il comportamento corretto! – templatetypedef

risposta

2

Nell'originale article è scritto quel tavolo deve essere ridimensionata:

Infine, si noti che se più di un numero costante di elementi viene eseguito l'hashing da h in un dato secchio, la tabella deve essere ridimensionato Fortunatamente, come dimostriamo, per una funzione di hash h universale , la probabilità che questo tipo di ridimensionamento si verifichi dato H = 32 è 1/32 !.

+0

Sì, ma anche una funzione di hash universale può avere più di | H | collisioni e nessuna quantità di ridimensionamento cambierà il vicinato di tali collisioni. – jemfinch

+0

Ecco la soluzione: mantieni una tabella hash basata su elenchi aggiuntivi e un bit "overflow" speciale nella parola "hop-information". Inserisci valori nella tabella hash aggiuntiva solo se non c'è spazio nel principale e imposta il bit 'overflow'. 'overflow' sarà piuttosto posteriore, quindi i tempi ammortizzati dovrebbero essere gli stessi –

+0

@jemfinch Informazioni sul ridimensionamento, quando ridimensiona l'hash puoi cambiare il numero di bucket che si traduce in una nuova hash, quindi è probabile che tu non abbia lo stesso numero di chiavi nello stesso secchio, giusto? –

1

Ci sono due casi in cui dobbiamo ridimensionare hash campana

  1. avete collisioni H per la data secchio
  2. il fattore di carico è davvero troppo grande per trovare il secchio libero. In pratica, dovresti impostare un massimo per il bucket gratuito di ricerca.

Data la funzione di hash universale, hai solo 1/32! possibilità di entrare nel caso # 1, in altre parole, se si inseriscono continuamente 2^35 elementi, allora si ha una possibilità di ridimensionamento a causa di collisioni.

Il caso # 2 è un motivo più popolare per ridimensionare, in pratica, si potrebbe fare riferimento a alcune implementazioni di secondo grado per il modo in cui decidono di ridimensionare [C# hashmap e Google hashmap sparse], non v'è alcun reale implementazione per sonda lineare a causa della sua svantaggio del cluster, cioè non può garantire una ricerca costante.