2011-11-20 23 views
8

Vorrei prima menzionare che ho esaminato altre domande che chiedevano la stessa cosa su questo sito e su altri siti. Spero di ottenere una buona risposta, perché il mio obiettivo è duplice:Come creare una tabella hash

  1. Per prima cosa, vorrei imparare come creare una tabella hash.
  2. In secondo luogo, trovo che molte risposte su Stack Overflow tendono ad assumere un certo livello di conoscenza su un argomento che spesso non è presente, specialmente per i nuovi tipi. Detto questo, spero di modificare il mio messaggio principale per includere una spiegazione del processo un po 'più approfondito una volta che me ne accorgo.

sul corso principale:

Come li capisco finora, una tabella hash è un array di liste (o una struttura dati simile), che spera di, in modo ottimale, ha il minor numero di collisioni il più possibile per preservare la sua lodevole complessità O (1). Quanto segue è il mio processo in corso:

Così il mio primo passo è quello di creare un array di puntatori:

Elem ** table; 
table = new Elem*[size];//size is the desired size of the array 

Il secondo passo è quello di creare una funzione di hashing (molto semplice).

int hashed = 0; 
hashed = (atoi(name.c_str()) + id) % size; 
//name is a std string, and id is a large integer. Size is the size of the array. 

mio terzo passo sarebbe quello di creare qualcosa per rilevare le collisioni, che è la parte che sono attualmente a.

Ecco alcuni pseudo-codice:

while(table[hashedValue] != empty) 
    hashedValue++ 

else 
    put in the list at that index. 

E 'relativamente poco elegante, ma io sono ancora al "che cosa è questo" stadio. Sopportami.

C'è qualcos'altro? Ho perso qualcosa o fatto qualcosa in modo errato?

Grazie

+1

Sembra OK, una specie di. Gli indici di valore hash in un array fisso e ogni elemento dell'array è un elenco di valori effettivi. –

risposta

3

maniglia non trovando slot vuoti e il ridimensionamento della tabella.

1

Ti manca una definizione per Elem. Non è banale, in quanto dipende dal fatto che si desideri una tabella di hash chaining o hash.

+0

Oh scusa, ho una definizione che non ho fornito.È una lista collegata. – Joshua

+0

@Joshua: quindi il rilevamento delle collisioni, supponendo che non si voglia archiviare i duplicati, è solo questione di percorrere quella lista. –

0

Una funzione di hash produce lo stesso valore per gli stessi dati. Il controllo della collisione, tuttavia, modifica quel valore, il che significa che il valore dell'hash non dipende solo dall'input, ma anche dalla presenza di altri elementi nella mappa hash. Questo è un male, dato che non sarai mai in grado di accedere effettivamente all'elemento che hai inserito prima attraverso il suo nome, solo attraverso l'iterazione sulla mappa.

In secondo luogo, il controllo di collisione è vulnerabile agli errori di overflow/intervallo, poiché si aumenta semplicemente il valore hash senza confrontarsi con la dimensione della mappa (sebbene, come ho detto prima, non si dovrebbe nemmeno farlo).

+0

Immagino di non aver fornito abbastanza informazioni, mi dispiace. L'oggetto che ho hashing ha un nome e un id privati, quindi sono entrambi sempre presenti nell'oggetto. – Joshua

+0

@Joshua: Non è quello che intendevo. Nel controllo della collisione, si modifica il valore hash se il punto calcolato non è libero (e finché il punto successivo non è libero). Ciò significa che, in base al carico della mappa hash, per la stessa dimensione dell'array, l'elemento potrebbe essere inserito in posizioni diverse se un altro elemento inserito prima generava lo stesso valore hash (cioè, quando si verifica una collisione). Questo non ti permetterà di accedere all'elemento attraverso la stessa chiave con cui lo hai inserito. – Xeo

Problemi correlati