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 →) l'entry va nel bucket , in coda alla lista. 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 è .
Parte B
Indici: ; ; ; ; ; ; .
(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.
(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.