Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

28
Capitolo 7 Tavole hash Algoritmi e Strutture Dati

Transcript of Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Page 1: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Capitolo 7Tavole hash

Algoritmi e Strutture Dati

Page 2: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl2

Implementazioni Dizionario

- Liste e array

- Alberi di ricerca non bilanciati

- Alberi di ricerca bilanciati

- Tavole hash

O(n)

O(n)

O(log n)

O(1)

Tempo richiesto dall’operazione più costosa:

…ma a certe condizioni!

Page 3: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl3

Tavole ad accesso diretto

Idea:– Supponiamo che a ciascun elemento è associata

una chiave intera nell’intervallo [0,m-1]

– Il dizionario viene memorizzato in un array v di m celle

– L’elemento con chiave k è contenuto in v[k]

– Al più n≤m elementi nel dizionario

Sono dizionari basati sulla proprietà di accesso diretto alle celle di un array

Page 4: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl4

Implementazione

Page 5: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl5

Fattore di carico

Misuriamo il grado di riempimento di una tavola ad accesso diretto usando il fattore di carico

= nm

Esempio: tavola con i nomi di 100 studenti indicizzati da numeri di matricola a 6 cifre n=100 m=106 = 0,0001 = 0,01%Grande spreco di memoria!

Page 6: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl6

Pregi e difetti

– Tutte le operazioni richiedono tempo O(1)

Pregi:

– Le chiavi devono essere necessariamente interi in [0, m-1] (non possiamo accogliere un elemento con chiave m)

– Lo spazio utilizzato è proporzionale alla chiave più grande m, non al numero n di elementi: può esserci grande spreco di memoria!

Difetti:

Page 7: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl7

Tavole hash

Idea:– Chiavi prese da un universo totalmente

ordinato U (possono non essere numeri)

– Funzione hash: h: U [0, m-1] (funzione che trasforma chiavi in indici)

– Elemento con chiave k in posizione v[h(k)]

Per ovviare agli inconvenienti delle tavole ad accesso diretto ne consideriamo un’estensione: le tavole hash

Page 8: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl8

Collisioni

Le tavole hash possono soffrire del fenomeno delle collisioni.

Si ha una collisione quando si deve inserire nella tavola hash un elemento con chiave u, e nella tavola esiste già un elemento con chiave v tale che h(u)=h(v): il nuovo elemento andrebbe a sovrascrivere il vecchio!

Page 9: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl9

Funzioni hash perfette

u v h(u) h(v)

Una funzione hash si dice perfetta se è iniettiva, cioè per ogni u,v U:

Un modo per evitare il fenomeno delle collisioni è usare funzioni hash perfette.

NOTA: Ovviamente, deve essere |U| ≤ m

Page 10: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl10

Implementazione

Page 11: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl11

Esempio

Tavola hash con i nomi di 100 studenti aventi come chiavi numeri di matricola nell’insieme U=[234717, 235717]

Funzione hash perfetta: h(k) = k - 234717

n=100 m=1001 = 0,1 = 10%

Il vincolo m ≥ |U| necessario per avere una funzione hash perfetta è raramente conveniente (o possibile)…

Page 12: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl12

EsempioTavola hash con elementi aventi come chiavi lettere dell’alfabeto U={A,B,C,…}Funzione hash non perfetta (ma buona in pratica per m primo): h(k) = ascii(k) mod mAd esempio, per m=11: h(‘C’) = 67 mod 11=1h(‘N’)= 78 mod 11=1 h(‘C’) = h(‘N’) se volessimo inserire sia ‘C’ che ‘N’ nel dizionario avremmo una collisione!

Page 13: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl13

Uniformità delle funzioni hash

Per ridurre la probabilità di collisioni, una buona funzione hash dovrebbe essere in grado di distribuire in modo uniforme le chiavi nello spazio degli indici della tavola

Questo si ha ad esempio se la funzione hash gode della proprietà di uniformità semplice

Page 14: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl14

Uniformità semplice

Sia P(k) la probabilità che la chiave k sia presente nel dizionario e sia:

la probabilità che la cella i sia occupata.

Una funzione hash h gode dell’uniformità semplice se, per ogni intero i in [0,m-1]:

Page 15: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl15

EsempioSe U è l’insieme dei numeri reali in [0,1) e ogni chiave ha la stessa probabilità di essere scelta, allora è semplice dimostrare che la funzione hash:

soddisfa la proprietà di uniformità sempliceNOTA: Anche la funzione modulo soddisfa la proprietà di uniformità semplice quando U coincide con l’insieme dei numeri naturali e le chiavi sono equidistribuite

Page 16: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl16

Risoluzione delle collisioni

1. Liste di collisione (n≥m, ≥1). Gli elementi sono contenuti in liste esterne alla tabella: v[i] punta alla lista degli elementi tali che h(k)=i

2. Indirizzamento aperto (n ≤ m, ≤ 1). Tutti gli elementi sono contenuti nella tabella: se una cella è occupata, se ne cerca un’altra libera

Nel caso in cui non si possano evitare le collisioni, dobbiamo trovare un modo per risolverle. Due metodi classici sono i seguenti:

Page 17: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl17

Ipotesi di lavoro

• Da questo momento in poi, ai soli fini esemplificativi, ammetteremo la possibilità che le chiavi primarie non siano associate in modo univoco agli elementi, e supporremo che gli elementi contengono una chiave secondaria di disambiguazione

Page 18: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl18

Liste di collisione

Esempio di tabella hash basata sulla funzione hash h(k) = ascii(k) mod 11

e su liste di collisione, contenente le lettere della parola:PRECIPITEVOLISSIMEVOLMENTE

Page 19: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl19

Implementazione

NOTA: Ho variato la specifica delle operazioni per adeguarmi al fatto che le chiavi non sono univoche

Page 20: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl20

Indirizzamento aperto

Supponiamo di voler inserire un elemento con chiave k e la sua posizione “naturale” h(k) sia già occupata.

L’indirizzamento aperto consiste nell’occupare un’altra cella, anche se potrebbe spettare di diritto a un’altra chiave.

Cerchiamo la cella vuota (se c’è) scandendo le celle secondo una sequenza di indici:

c(k,0), c(k,1), c(k,2),…c(k,m-1)

Page 21: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl21

Metodi di scansione: scansione lineare

c(k,i) = ( h(k) + i ) mod mper 0 ≤ i < m

Scansione lineare:

Page 22: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl22

EsempioInserimenti in tavola hash basata sulla funzione hash h(k)=ascii(k) mod 31e su indirizzamento aperto con scansione lineare delle lettere della parola:

PRECIPITEVOLISSIMEVOLMENTE

4,8 celle scandite in media per inserimento

Page 23: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl23

Il problema dell’agglomerazione primaria

• La scansione lineare provoca effetti di agglomerazione primaria, cioè lunghi gruppi di celle consecutive occupate che rallentano la scansione: infatti, più cresce la dimensione di un gruppo di celle contigue occupate, e più tale insieme di celle tenderà a crescere!

Page 24: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl24

Metodi di scansione: scansione quadratica

c(k,i) = ( h(k) + c1i +c2i2) mod mper 0 ≤ i < m

Scansione quadratica: risolve il problema dell’agglomerazione primaria

Si può dimostrare che per c1=c2=0.5e m potenza di 2 viene scandita tuttala tavola

Page 25: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl25

Metodi di scansione: hashing doppio

c(k,i) = h1(k) + i·h2(k) mod m

L’hashing doppio riduce il problema:

per 0 ≤ i < m, h1 e h2 funzioni hash

• La scansione quadratica risolve il problema dell’agglomerazione primaria, ma provoca invece agglomerazione secondaria: coppie di chiavi collidenti generano la stessa sequenza di scansione!

Page 26: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl26

EsempioInserimenti in tavola hash basata basata sulla funzione hash h1(k)=ascii(k) mod 31 h2(k)=ascii(k) mod 30 e su indirizzamento aperto con hashing doppio delle lettere della parola:PRECIPITEVOLISSIMEVOLMENTE

3,1 celle scandite in media per inserimento

Page 27: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl27

Analisi del costo di scansione• Nel caso peggiore, O(n)• Nel caso medio, un’operazione di ricerca

di una chiave, assumendo che le chiavi siano prese con probabilità uniforme da U, costa:

dove =n/m (fattore di carico)

Page 28: Capitolo 7 Tavole hash Algoritmi e Strutture Dati.

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati

Copyright © 2004 - The McGraw - Hill Companies, srl28

• La proprietà di accesso diretto alle celle di un array consente di realizzare dizionari con operazioni in tempo O(1) indicizzando gli elementi usando le loro stesse chiavi (purché siano intere)

• L’array può essere molto grande se lo spazio delle chiavi è grande

• Per ridurre questo problema si possono usare funzioni hash che trasformano chiavi (anche non numeriche) in indici

• Usando funzioni hash possono aversi collisioni• Tecniche classiche per risolvere le collisioni sono liste di

collisione e indirizzamento aperto

Riepilogo