Esercizio 19tabelle hash con separate chaining
In questa pagina 4
Testo.
Parte A (esercizio di lezione). Si consideri una tabella hash con , e risoluzione delle collisioni tramite separate chaining. Far vedere la tabella dopo l'inserimento di entry con le seguenti chiavi: .
Parte B (scritto del 07/08/2026, parte 1, esercizio 3, 4 punti). Si consideri una mappa implementata mediante una hash table di dimensione , con gestione delle collisioni mediante liste concatenate. La funzione di hash è . Si inseriscano, nell'ordine indicato, le seguenti chiavi: . (a) Disegnare il contenuto finale della hash table dopo tutti gli inserimenti. (b) Indicare quali chiavi vengono confrontate durante la ricerca della chiave . (c) Qual è la complessità media e qual è la complessità al caso pessimo dell'operazione di ricerca in una hash table con concatenamento? Motivare brevemente la risposta. (d) Calcolare il load factor della hash table dopo tutti gli inserimenti.
Richiami
Con il separate chaining (vedi Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash →, Mappe e dizionariADT mappa (chiavi distinte) con get, put, remove, keySet/values/entrySet; famiglia mappa/mappa ordinata/dizionario (multimappa); applicazioni; implementazioni semplici ma poco efficienti (lista, array indicizzato dalle chiavi); dizionario realizzato con una mappa di liste.Mappe e dizionari →) l'entry va nel bucket , in coda alla lista. Il resto della divisione è il resto della divisione intera (come in : Notazione asintoticaDefinizioni di O, Omega, Theta e o piccolo con le costanti c ed n0; esempi con costanti esplicite; proprietà (polinomi, esponenziali, logaritmi, somme, implicazioni tra notazioni); sommatorie notevoli; terminologia (logaritmica, lineare, polinomiale, esponenziale).Notazione asintotica →; per i numeri interi Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →): si trova e si calcola . Si assume che in ogni lista le chiavi stiano nell'ordine di inserimento (se l'implementazione inserisce in testa, ogni lista risulta invertita: lo si dichiara).
Parte A
Si calcola per ciascuna chiave:
| 12 | 44 | 13 | 88 | 23 | 94 | 11 | 39 | 20 | |
|---|---|---|---|---|---|---|---|---|---|
| 41 | 137 | 44 | 269 | 74 | 287 | 38 | 122 | 65 | |
| 8 | 5 | 0 | 5 | 8 | 1 | 5 | 1 | 10 |
(ad esempio , .) Tabella finale:
| Bucket | Lista |
|---|---|
| 0 | |
| 1 | |
| 2, 3, 4 | vuoti |
| 5 | |
| 6, 7 | vuoti |
| 8 | |
| 9 | vuoto |
| 10 |
Collisioni nei bucket , e . Con ed il load factor è . Lunghezze dei bucket : , somma . Confronti per ritrovare ciascuna chiave (posizione nella lista): , , , , , , , , , in media confronti per una ricerca con successo.
Parte B
Indici: ; ; ; ; ; ; . Passaggi: , , , , , , . Con chiavi in bucket è quasi certo che ci siano collisioni: la probabilità che tutte finiscano in bucket diversi (hashing uniforme) è (Calcolo combinatorio per la probabilitàNegli spazi uniformi bisogna contare: principio di moltiplicazione, disposizioni con ripetizione n^k, disposizioni semplici n!/(n−k)!, permutazioni n!, combinazioni (n su k); estrazioni con e senza reinserimento e distribuzione ipergeometrica.Calcolo combinatorio per la probabilità →).
(a) Contenuto finale (ordine di inserimento in ogni lista):
| Bucket | Lista |
|---|---|
| 0 | |
| 1 | |
| 2 | vuoto |
| 3 | |
| 4 | |
| 5, 6 | vuoti |
Se invece ogni nuovo elemento fosse inserito in testa, le liste risulterebbero nel bucket e nel bucket .
(b) Ricerca di : ; si scandisce la lista del bucket e si confrontano nell'ordine le chiavi , , (la terza trova la chiave). Con l'inserimento in testa si confronterebbe solo . Le chiavi negli altri bucket non vengono toccate.
(c) Complessità. Detto il load factor:
- caso medio: sotto l'ipotesi di hashing uniforme: costo costante per calcolare e la scansione di un bucket di lunghezza media . Se la tabella cresce in modo da mantenere si ha ;
- caso pessimo: : tutte le chiavi possono finire nello stesso bucket e la chiave cercata può essere in fondo alla lista o assente.
Il valore medio per la lunghezza di un bucket è un Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →: ogni chiave cade in un dato bucket con probabilità , quindi le chiavi producono in media chiavi per bucket. Qui le lunghezze effettive sono (somma ), con media .
(d) Load factor: .
(Entrambe le tabelle sono state verificate con un programma.)
Errori comuni
- Applicare senza ridurre modulo (si ottengono indici fuori dalla tabella) o sbagliare il resto (controllare con ).
- Confrontare nella ricerca anche chiavi di altri bucket: si guarda solo il bucket .
- Dire che la ricerca è al caso pessimo: lo è in media.
- Definire il load factor come (rovesciato) o come lunghezza massima del bucket: è il rapporto entry/bucket, cioè la lunghezza media.
Versione ripasso
Testo. (A) , , chaining, chiavi . (B) , , chiavi : (a) tabella, (b) chiavi confrontate cercando , (c) complessità media e pessima della ricerca, (d) load factor.
- A (vedi Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash →): ⇒ , , , , ; .
- B(a): ⇒ , , , (ordine di inserimento).
- B(b): bucket : si confrontano , , .
- B(c): medio (uniform hashing), pessimo (tutte nello stesso bucket).
- B(d): .
- Calcoli di A: ; ; ; ; ; ; ; ; .
- Errori: modulo dimenticato; confronti fuori dal bucket; al caso pessimo; rovesciato.