2010-04-28 11 views
5

Sto cercando un'implementazione di hashtable in C che memorizza i suoi oggetti in array (bidimensionali) anziché in elenchi collegati. Ad esempio, se si verifica una collisione, l'oggetto che sta causando la collisione verrà memorizzato nel successivo indice di riga libera anziché spinto alla testa e al primo elemento di una lista collegata.Ricerca di un'implementazione di hashtable di array (vs elenco collegato) in C

In più, gli oggetti stessi devono essere copiati nella tabella hashtable, anziché fare riferimento ai puntatori. (gli oggetti non vivono per l'intera vita del programma ma la tabella lo fa).

So che un'implementazione di questo tipo potrebbe avere seri problemi di efficienza e non è il "metodo standard di hashing", ma poiché lavoro su un'architettura di sistema molto speciale ho bisogno di quelle caratteristiche.

grazie

+5

Dal momento che si hanno requisiti così insoliti e specifici per la sua implementazione, scommetterei che la soluzione migliore sarebbe scrivere da soli un'implementazione del genere. –

+0

+1, una domanda interessante comunque. –

risposta

6

Un super semplice implementazione:

char hashtable[MAX_KEY][MAX_MEMORY]; 
int counts[MAX_KEY] = {0}; 

/* Inserting something into the table */ 
SomeStruct* some_struct; 
int hashcode = compute_code(some_struct); 
int size = sizeof(SomeStruct); 
memcpy(hashtable[hashcode] + counts[hashcode] * size, some_struct, size); 
++counts[hashcode]; 

Non dimenticare di controllare contro MAX_MEMORY.

+0

wow, non ho mai pensato ad un approccio così semplice (e carino :)), se aggiungo alcune funzionalità ad esso, potrebbe davvero funzionare. molte grazie! – kingusiu

1

La mia ipotesi è che il sistema non consenta l'allocazione dinamica della memoria. Pertanto, sarà necessario definire limiti di array frontali ragionevoli per i dati (numero di oggetti totali e collisioni massime previste) e inoltre una funzione di hash personalizzata per i propri oggetti, quindi potrebbe essere meglio implementare la propria tabella hash.

+0

l'allocazione della memoria dinamica è consentita, ma il sistema è un'architettura multicore che funziona meglio se i dati condivisi sono memorizzati nella memoria * contigua *, ecco perché voglio utilizzare gli array. calcolare le collisioni massime previste è un buon suggerimento, grazie! – kingusiu

+0

@kingusiu: Una normale lista concatenata di hash può funzionare per te se la si mette insieme con un allocatore di pool, in modo che tutti gli oggetti vengano allocati da un pool contiguo. I collegamenti avanti e indietro non avrebbero nemmeno bisogno di essere puntatori: potevano semplicemente essere indici di pool. – caf

0

Non è in C ma in C++, ma date un'occhiata a Google Sparse Hash - potrebbe darvi qualche idea. Il requisito fondamentale è che l'oggetto da memorizzare abbia un modo di essere null.