Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo...

31
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua con le celle h'(k)+1, h'(k)+2, ecc. fino ad arrivare alla cella m-1, dopo di che si continua con le celle 0,1,ecc. fino ad aver percorso circolarmente tutta la tavola. m i k h i k h mod ] ) ( ' [ ) , (

Transcript of Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo...

Page 1: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Ispezione lineare

La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo

L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua con le celle h'(k)+1, h'(k)+2, ecc. fino ad arrivare alla cella m-1, dopo di che si continua con le celle 0,1,ecc. fino ad aver percorso circolarmente tutta la tavola.

mikhikh mod])('[),(

Page 2: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

L’ispezione lineare è facile da implementare ma soffre del problema dell’addensamento primario:

“i nuovi elementi inseriti nella tavola tendono ad addensarsi attorno agli elementi già presenti”

Una cella libera preceduta da t celle occupate ha probabilità (t +1)/m di venir occupata dal prossimo elemento inserito.

Quindi sequenze consecutive di celle occupate tendono a diventare sempre più lunghe.

Page 3: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Ispezione quadratica La funzione hash h(k, i) si ottiene da una funzione hash ordinaria h'(k) ponendo

I valori di m, c1 e c2 non possono essere qualsiasi ma debbono essere scelti opportunamente in modo che la sequenza di ispezione percorra tutta la tavola.

Un modo per fare ciò è suggerito nel problema 11-3 del libro.

dove c1 e c2 sono due costanti con c2 ≠ 0. micickhikh mod])('[),( 2

21

Page 4: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Osserviamo che se h'( j) = h'(k) anche le due sequenze di ispezione coincidono.

Questo porta ad un fenomeno di addensamento secondario (meno grave dell’addensamento primario).

L’addensamento secondario è dovuto al fatto che il valore iniziale h'(k) determina univocamente la sequenza di ispezione e pertanto abbiamo soltanto m sequenze di ispezione distinte.

Page 5: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Problema 11-3 del libro:Consideriamo la seguente procedura:

j = h'(k)i = 0while i < m and “T[j] non è la cella cercata” i = i+1 j = ( j+ i ) mod m

Dimostrare che la sequenza delle j che viene generata è una sequenza di ispezione quadratica.

Page 6: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Dobbiamo dimostrare che esistono due costanti c1 e c2 con c2 ≠ 0 tali che

sia una invariante del ciclo.

Per i = 0

Per i = 1

Per i = 2

Per i = 3

Calcoliamo i primi valori di h:

micickhikhj mod])('[),( 221

)(' khj

mkhj mod]1)('[

mkhj mod]21)('[

mkhj mod]321)('[

Page 7: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

e in generale

Quindi

mikhj mod]21)('[

miikh

mii

khj

mod2

1

2

1)('

mod2

)1()('

2

Page 8: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Doppio hashLa funzione hash h(k,i) si ottiene da due funzione hash ordinarie h1(k) ed h2(k) ponendo

Perché la sequenza di ispezione percorra tutta la tavola il valore di h2(k) deve essere relativamente primo con m (esercizio 11.4-3 del libro).

Possiamo soddisfare questa condizione in diversi modi.

mkihkhikh mod)]()([),( 21

Page 9: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Possiamo scegliere m = 2p potenza di 2 ed

h2(k) = 2 h'(k) + 1

con h'(k) funzione hash qualsiasi per una tavola di dimensione m' = m/2 = 2p-1.Un altro modo è scegliere m primo e scegliere h2(k) che ritorna sempre un valore minore di m.

Un esempio è:

h1(k) = k mod m e h2(k) = 1 + (k mod m')

dove m' è minore di m (di solito m' = m-1).

Page 10: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Con l’hash doppio abbiamo (m2) sequenze di ispezione distinte.

Questo riduce notevolmente i fenomeni di addensamento e rende il comportamento della funzione hash molto vicino a quello ideale dell’hash uniforme.

Page 11: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Analisi dell’indirizzamento aperto

Valutiamo la complessità media di Search in funzione del fattore di carico α = n/m.

Assumiamo l’ipotesi di hash uniforme, ossia che ogni permutazione di 0,1,..., m-1 sia ugualmente probabile come ordine di ispezione.

Notiamo che con l’indirizzamento aperto n ≤ m e quindi 0 ≤ α ≤ 1.

Page 12: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Proprietà: Assumendo l’ipotesi di hash uniforme, il numero medio di celle ispezionate nella ricerca di una chiave k non presente in una tavola hash con indirizzamento aperto è m se α = 1 e al più 1/(1-α) se α < 1.

Dimostrazione: Se α = 1 non ci sono celle vuote e la ricerca termina dopo aver ispezionato tutte le m celle.

Page 13: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Se α < 1 la ricerca termina con la prima cella vuota incontrata durante la sequenza di ispezione.

Siccome ci sono n celle occupate la probabilità che la prima cella ispezionata risulti occupata e che quindi si debba ispezionare anche la successiva è α = n/m.

Per l’ipotesi di hash uniforme la prima cella ispezionata può essere con uguale probabilità una qualsiasi delle m celle.

Page 14: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

La probabilità che si debba ispezionare una terza cella è la probabilità α = n/m che la prima cella risulti occupata moltiplicata per la probabilità (n-1)/(m-1) che anche la seconda cella risulti occupata, ossia

In generale la probabilità che si debba ispezionare la i-esima cella della sequenza è

2

1

1

m

n

m

n

1

1

1

1

1

i

im

in

m

n

m

n

Page 15: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Dunque noi ispezioniamo una prima cella con probabilità 1, una seconda cella con probabilità α, una terza cella con probabilità minore di α2, una quarta con probabilità minore di α3 e così via.

Il numero atteso di celle ispezionate è quindi minore di

1

1

1

0

1

0

132

i

im

i

i

m

Page 16: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Conseguenza : Assumendo l’ipotesi di hash uniforme, il numero medio di celle ispezionate quando inseriamo una nuova chiave in una tavola hash con indirizzamento aperto è m se = 1 e al più 1/(1-α) se α < 1.

Page 17: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Proprietà: Assumendo l’ipotesi di hash uniforme, il numero medio di celle ispezionate nella ricerca di una chiave k presente in una tavola hash con indirizzamento aperto è (m+1)/2 se α = 1 e al più 1/α ln [1/(1-α)] se α < 1.

Dimostrazione: Se α = 1 la chiave cercata può trovarsi, con uguale probabilità, nella prima, seconda, ..., ultima cella e quindi il numero medio di celle ispezionate è

2

1

2

)1(111

mmm

mi

m

m

i

Page 18: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Se α < 1 la ricerca ispeziona le stesse celle visitate quando la chiave cercata è stata inserita nella tavola.

Supponiamo che la chiave cercata sia stata inserita dopo altre i chiavi. Il numero medio di celle ispezionate è al più 1/(1-α) =1/(1-i/m), ossia m/(m – i).

Mediando su tutte le n chiavi presenti nella tavola otteniamo:

m

nmk

n

i

n

i kimn

m

im

m

n 1

1

0

1

0

1111

Page 19: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Possiamo maggiorare la sommatoria con un integrale ottenendo

1

1ln

1ln

1

))ln((ln1

1111

1

nm

m

nmm

dxxk

m

nm

m

nmk

Page 20: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Ecco una tavola dei valori di 1/α ln [1/(1-α)]

α 1/ ln [1/(1-)]

0.3 1.19

0.9 2.56

0.95 3.15

0.7 1.72

0.5 1.39

0.99 4.65

Page 21: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Alberi

Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice.

Alberi liberi : grafi non orientati connessi e senza cicli.

Alberi ordinati : alberi radicati con un ordine tra i figli di un nodo.

Page 22: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

f

ch

ea

d

g b

=

f

c

h

e

ad

g

blibero f

c h

ea

d

gb

radicato

f

c h

ea

d

gb

1

1321

21

ordinato

1

3211

21

f

ch

ea

d

g b

Page 23: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Alberi binari

Alberi posizionali : alberi radicati in cui ad ogni figlio di un nodo è associata una posizione.

Le posizioni che non sono occupate da un nodo sono posizioni vuote (nil).

Alberi k-ari : alberi posizionali in cui ogni posizione maggiore di k è vuota.

Alberi binari : alberi k-ari con k = 2.

Il figlio in posizione 1 si dice figlio sinistro e quello in posizione 2 si dice figlio destro.

Page 24: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

c

b d

a e…

… …

posizionale

c

b d

a e

k-ario (k = 4)

…f

Page 25: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Alberi binari

Il modo più conveniente per descrivere gli alberi binari è mediante la seguente.

Definizione ricorsiva di albero binario:

a) l’insieme vuoto Ø è un albero binario;

b) se Ts e Td sono alberi binari ed r è un nodo allora la terna ordinata (r, Ts ,Td ) è un albero binario.

Page 26: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

L’albero vuoto Ø si rappresenta graficamente con quadratino nero

Per rappresentare l’albero T = (r, Ts , Td) si disegna un nodo etichettato r e sotto di esso le due rappresentazioni dei sottoalberi Ts e Td , con Ts alla sinistra di Td

r

TsTd

Page 27: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

L’albero:

T = (c, (b, (d, Ø, Ø), (a, (f, Ø, Ø), Ø)), (g, (e, Ø, Ø), Ø))

si rappresenta graficamente:

c

b g

ad

f

e

Page 28: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Nella memoria l’albero:

T = (c, (b, (d, Ø, Ø), (a, (f, Ø, Ø), Ø)), (g, (e, Ø, Ø), Ø))

si rappresenta nel modo seguente:

p

left right

cnil

key gnil

b

enilnil

anil

fnilnil

dnilnil

Page 29: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Alberi binari di ricerca

Un albero binario di ricerca è un albero binario in cui la chiave di ogni nodo è maggiore o uguale delle chiavi dei nodi del sottoalbero sinistro e minore o uguale delle chiavi dei nodi del sottoalbero destro.

Ad esempio: 7

3 9

61

4

8

Page 30: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Operazioni sugli alberi binari di ricerca

Stampa della lista ordinata dei nodi:

Stampa(x) if x ≠ nil Stampa(x.left) print x Stampa(x.right)

Page 31: Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo Lesplorazione inizia dalla cella h(k,0) = h'(k) e continua.

Complessità: T(0) = c T(n) = T(k)+b+T(n-k-1)

Verifichiamo per sostituzione che

T(n) = (c + b) n + c

T(0) = c = (c + b)0 + c

T(n) = T(k) + b + T(n-k-1) =

= (c + b)k +c+b+(c + b)(n-k-1)+c

= (c +b)n +c