kwb
19-12-2010, 17:19
Ciao a tutti, sto studiando le tabelle di hash e sono arrivato alla parte delle collisioni.
Vengono trattate le due risoluzioni più comuni: il chaining e l'open addressing
In quest'ultimo non mi è chiara una cosa, e vorrei vedere se ho ben capito come funziona il meccanismo:
Inserito un dato, viene calcolata una chiave di hash, la quale sarà l'indice del mio vettore dove memorizzerò la parola.
Qualora questa cella sia già occupata, provo a guardare se la successiva ( hash key +1 ) è occupata, se non lo è, inserisco li la mia parola.
Bene
Se funziona veramente così, quando poi io devo andare a prendere una parola dalla hash table, devo calcolarmi la mia hash key ( e questo si fa easy ) e poi però se c'è una collisione, come faccio a sapere se la mia parola è finita 1, 2 o 5 slot più avanti della sua reale hash key?
La soluzione più intelligente che mi viene in mente è quella dove, una volta arrivato alla cella, comparo il dato in input con quello che ho e se sono diversi eseguo la comparazione con la cella successiva fino a trovare il giusto dato...
Ok, ma se è così, non è più facile usare un chaining? Dove, la comparazione la devo fare obbligatoriamente se c'è più di una parola in quella cella?
Vengono trattate le due risoluzioni più comuni: il chaining e l'open addressing
In quest'ultimo non mi è chiara una cosa, e vorrei vedere se ho ben capito come funziona il meccanismo:
Inserito un dato, viene calcolata una chiave di hash, la quale sarà l'indice del mio vettore dove memorizzerò la parola.
Qualora questa cella sia già occupata, provo a guardare se la successiva ( hash key +1 ) è occupata, se non lo è, inserisco li la mia parola.
Bene
Se funziona veramente così, quando poi io devo andare a prendere una parola dalla hash table, devo calcolarmi la mia hash key ( e questo si fa easy ) e poi però se c'è una collisione, come faccio a sapere se la mia parola è finita 1, 2 o 5 slot più avanti della sua reale hash key?
La soluzione più intelligente che mi viene in mente è quella dove, una volta arrivato alla cella, comparo il dato in input con quello che ho e se sono diversi eseguo la comparazione con la cella successiva fino a trovare il giusto dato...
Ok, ma se è così, non è più facile usare un chaining? Dove, la comparazione la devo fare obbligatoriamente se c'è più di una parola in quella cella?