powrót
Ćwiczenia 14 - Haszowanie
Adresowanie bezpośrednie
D-A-SEARCH(T,k)
return T[k]
D-A-INSERT(T,x)
T[x.key] = x
D-A-DELETE(T,x)
T[x.key] = NIL
Tablice z haszowaniem
U - zbiór kluczy
m - wielkość tablicy T
T[0,...,m - 1]
T[i] = NIL
h:U->{0,m - 1}
H-SEARCH(T,k)
return T[h(k)]
H-INSERT(T,x)
T[h(x.key)] = x
H-DELETE(T,x)
T[h(x.key)] = NIL
Funkcje haszujące
Haszowanie modularne
h(p)
return p MOD m
Haszowanie przez mnożenie
0 < A < 1
A = (sqrt(5) - 1) / 2
h(k)
return ⌊m(kA MOD 1)⌋
Metoda łańcuchowa (3 pkt termin: 20:00:00 pierwsza środa po zajęciach)
Main
T[0..9]
CH-H-INSERT(T,206)
CH-H-INSERT(T,142)
CH-H-INSERT(T,303)
WRITE(T) //0 0 142 303 0 0 206 0 0 0
CH-H-INSERT(T,213)
WRITE(T) //0 0 142 213->303 0 0 206 0 0 0
WRITE(CH-H-SEARCH(T,303)) //303
CH-H-DELETE(T,303)
WRITE(T) //0 0 142 213 0 0 206 0 0 0
WRITE(CH-H-SEARCH(T,213)) //213
CH-H-SEARCH(T,k)
x = T[h(k)]
while x ≠ NIL AND x.key ≠ k
x = x.next
return x
CH-H-INSERT(T,x)
p = h(x.key)
x.next = T[p]
T[p] = x
CH-H-DELETE(T,x)
p = h(x.key)
if T[p] = x
T[p] = x.next
else
y = T[p]
while y.next ≠ x
y = y.next
y.next = x.next
Adresowanie otwarte (3 pkt termin: 20:00:00 pierwsza środa po zajęciach)
Main
T[0..9]
OP-H-INSERT(T,206)
OP-H-INSERT(T,142)
OP-H-INSERT(T,303)
WRITE(T) //0 0 142 303 0 0 206 0 0 0
OP-H-INSERT(T,213)
WRITE(T) //0 0 142 303 213 0 206 0 0 0
WRITE(OP-H-SEARCH(T,303)) //303
OP-H-DELETE(T,303)
WRITE(T) //0 0 142 DEL 213 0 206 0 0 0
WRITE(OP-H-SEARCH(T,213)) //213
OP-H-SEARCH(T,k)
i = 0
repeat
j = h(k,i)
if T[j] = k
return j
i = i + 1
until T[j] = NIL OR i = m
return NIL
OP-H-INSERT(T,k)
i = 0
repeat
j = h(k,i)
if T[j] = NIL OR T[j] = DELETED
T[j] = k
return j
else
i = i + 1
until i = m
error "tablica przepełniona"
OP-H-DELETE(T,k)
i = 0
repeat
j = h(k,i)
if T[j] = k
T[j] = DELETED
return j
i = i + 1
until T[j] = NIL OR i = m
return NIL
Funkcje haszujące
Adresowanie liniowe
h(k,i)
return (h'(k) + i) MOD m
Adresowanie kwadratowe
h(k,i)
return (h'(k) + c1i + c2i2) MOD m
Adresowanie dwukrotne
h(k,i)
return (h1(k) + ih2(k)) MOD m