

Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Esercizi svolti sulle tabelle hash
Tipologia: Esercizi
1 / 3
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!


I metodi possibili sono 2, quello della divisione e quello della moltiplicazione. Per gestire le collisioni invece i metodi sono 3. La scansione lineare, la scansione quadratica e il doppio hashing. È possibile usare qualsiasi combinazione dei primi 2 metodi con gli altri 3; qui di seguito verranno spiegati tutti i metodi ma non tutte le combinazione essendo superfluo, visto che il comportamento dei vari metodi non cambia a seconda della combinazione utilizzata.
Si consideri una tabella (array) di dimensione m = 6. Si inseriscano in essa le seguenti chiavi (nell’ordine indicato) 44, 38, 56, 72, 84, 62 con la scansione lineare ed il metodo di divisione. 0 1 2 3 4 5 72 84 44 38 56 62 Il metodo della divisione è dato dalla seguente formula: h^ (^ k )=^ k mod m dove k è la chiave che si vuole inserire nella tabella e m^ è la dimensione della tabella (in questo caso 6). Cominciamo ad inserire le chiavi nell’ordine dato: h ( 44 )= 44 mod 6 = (^2) la chiave 44 andrà nella posizione 2 della tabella h ( 38 )= 38 mod 6 = (^2) la chiave 38 andrebbe nella posizione 2 che però è già occupata dalla chiave 44, questa è una collisione che va risolta (in questo caso) con la scansione lineare. La scansione lineare ha la seguente formula: c^ (^ k , i )=^ ( h ( k )+( t ⋅ i ))mod m dove h^ ( k )è la posizione trovata con il precedente metodo (in questo caso il metodo della divisione) , t^ è il “passo” che se non è specificato è uguale a 1 e i^ è numero che andremo ad incrementare se troveremo la prossima posizione occupata, 0 ≤ i < m. Calcoliamo la posizione di 38 con la scansione lineare, partiamo da i uguale a 1 perché il caso in cui i (^) è uguale a 0 lo abbiamo calcolato (quando abbiamo usato il metodo della divisione). c ( 38 , 1 )=( 2 +( 1 ⋅ 1 ))mod 6 = (^3) la posizione di 38 sarà quindi 3 visto che è libera Ora calcoliamo le chiavi rimanenti: h ( 56 )= 56 mod 6 = (^2) dobbiamo ancora usare la scansione lineare c ( 56 , 1 )=( 2 +( 1 ⋅ 1 ))mod 6 = (^3) la posizione 3 è occupata quindi incrementiamo i c ( 56 , 2 )=( 2 +( 1 ⋅ 2 ))mod 6 = (^4) la posizione 4 è libera possiamo inserirci la chiave 56 h ( 72 )= 72 mod 6 = (^0) la posizione 0 è libera, questa volta non dobbiamo usare la scansione lineare perché non abbiamo collisioni. h ( 84 )= 84 mod 6 = (^0) la posizione 0 è occupata, usiamo la scansione lineare c ( 84 , 1 )=( 0 +( 1 ⋅ 1 ))mod 6 = (^1) la posizione 1 è libera possiamo inserirci la chiave 84 h ( 62 )= 62 mod 6 = (^2) posizione 2 occupata ⇒ (^) scansione lineare con i = 1 c ( 62 , 1 )=( 2 +( 1 ⋅ 1 ))mod 6 = (^3) posizione 3 occupata ⇒ (^) scansione lineare con i = 2 c ( 62 , 2 )=( 2 +( 1 ⋅ 2 ))mod 6 = (^4) posizione 4 occupata ⇒ (^) scansione lineare con i = 3 c ( 62 , 3 )=( 2 +( 1 ⋅ 3 ))mod 6 = (^5) la posizione 5 è libera possiamo inserirci la chiave 62 Con la scansione lineare (solamente se il passo è uguale a 1) vengono controllate tutte le posizioni una dopo l’altra partendo da quella trovata con il metodo della divisione (o della moltiplicazione).
Consideriamo una tabella di dimensione m = 5. Inserire le chiavi 12, 47, 28, 25, 56 nell’ordine appena dato con il metodo della moltiplicazione (con α = 0. 21 ) e quello del doppio hashing con h 1 (^) ( k )= 2 ( k mod 3 + 1 ). 0 1 2 3 4 56 25 12 28 47 Il metodo della moltiplicazione è il seguente: si moltiplica la chiave che si vuole inserire per un dato valore α^ (in questo caso α^ =^0 ,^21 , 0 < α < 1 ), poi si prende la parte frazionaria del risultato è la si moltiplica per la dimensione della tabella (in questo caso 5), la parte intera del risultato della seconda moltiplicazione sarà la posizione della chiave nella tabella. Cominciamo: h ( 12 )= 12 ⋅ 0 , 21 = 2 , 52 ⇒ 0 , 52 ⋅ 5 = 2 , 6 ⇒ (^2) inseriamo la chiave 12 in posizione 2 h ( 47 )= 47 ⋅ 0 , 21 = 9 , 87 ⇒ 0 , 87 ⋅ 5 = 4 , 35 ⇒ (^4) inseriamo la chiave 47 in posizione 4 h ( 28 )= 28 ⋅ 0 , 21 = 5 , 88 ⇒ 0 , 88 ⋅ 5 = 4 , 4 ⇒ (^4) posizione 4 già occupata dobbiamo usare il doppio hashing per gestire la collisione. Il doppio hashing usa una funzione di supporto creata appositamente (che qui chiamiamo h 1 (^) ( k )) e la seguente formula: c ( k , i )=( h ( k )+ i ⋅ h 1 ( k ))mod m dove h (^ k ) è la posizione trovata occupata dal metodo utilizzato (che in questo caso è quello della moltiplicazione, ma vale anche per quello della divisione), h 1 (^) ( k ) è la funzione di supporto scelta, k è la chiave da inserire e i^ è numero che andremo ad incrementare se troveremo la prossima posizione occupata, 0 ≤ i < m. Inseriamo la chiave 28 con il doppio hashing: c ( 28 , 1 )=( 4 + 1 ⋅( 2 ⋅( 28 mod 3 + 1 )))mod 5 =( 4 + 2 ⋅( 2 ))mod 5 = 3 la posizione 3 è libera quindi ci mettiamo la chiave 28 Continuiamo con le altre chiavi: h ( 25 )= 25 ⋅ 0 , 21 = 5 , 25 ⇒ 0 , 25 ⋅ 5 = 1 , 25 ⇒ (^1) la posizione 1 è libera possiamo inserire 25 h ( 56 )= 56 ⋅ 0 , 21 = 11 , 76 ⇒ 0 , 76 ⋅ 5 = 3 , 8 ⇒ (^3) posizione occupata ⇒ (^) doppio hashing c ( 56 , 1 )=( 3 + 1 ⋅( 2 ⋅( 56 mod 3 + 1 )))mod 5 =( 3 + 2 ⋅( 3 ))mod 5 = 4 posizione ancora occupata incrementiamo di 1 i c ( 56 , 2 )=( 3 + 2 ⋅( 2 ⋅( 56 mod 3 + 1 )))mod 5 =( 3 + 2 ⋅ 2 ⋅( 3 ))mod 5 = 0 posizione 0 libera possiamo inserirci la chiave 56 Abbiamo inserito tutte le chiavi date, ma era possibile inserire qualsiasi sequenza di 5 chiavi con le funzioni hash descritte? La risposta è affermativa se la dimensione della tabella è prima (cioè non ha fattori in comune) con i valori che può assumere la funzione di supporto h 1^ ( k ). h 1 (^) ( k )= 2 ( k mod 3 + 1 ) e visto che ogni chiave va calcolata modulo 3 i casi possibili saranno: ( ) 2 ( 2 1 ) 6
1 1 1 = + =
h k h k h k In questo caso la dimensione è 5 e i valori di h 1^ ( k ) sono, come abbiamo visto, 2, 4 e 6 quindi è possibile inserire qualsiasi sequenza di 5 chiavi con le funzioni hash sopra descritte.