Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Hasıtotablazatokhasıtotablazatok angolul: hash tables,hasıtas: hashing
Ha nagy mennyisegu adatbol gyakorlatilag csak kevesethasznalunk, akkor nem erdemes minden adatnak helyetfoglalni, elegendo csak a leggyakrabban hasznaltaknak. Astruktura, amely lehetove teszi ezt, es megoldja az adatokbeszurasat, kereseset, torleset, az a hasıtotablanak (hashtablanak) nevezett szerkezet. Egy adat helyet a tablabanaz adott adat kulcsara alkalmazott hasıtofuggveny (hashfuggveny) adja meg.
Nem tevesztendo ossze a kriptografiabanhasznalt hasıtassal! Errol lasd:
Kriptografiai hashfuggveny
Cryptographic hash function
1
Kozvetlen cımzesu tablazatok
U kulcsunivezum, T tomb (T0, T1, . . . , Tm−1): kozvetlen cımzesutablazat
A tablazat minden helye – res – megfelel U egy kulcsanak.
2
Muveletek
Kozvetlen-cımzesu-kereses(T, k)
1. return Tk
Kozvetlen-cımzesu-beszuras(T, x)
1. Tkulcs[x] := x
Kozvetlen-cımzesu-torles(T, x)
1. Tkulcs[x] := nil
3
hasıtotablazatok
h hasıtofuggveny alapjan a k kulcsu elem a h(k) helyrekerul.
h : U −→ {0, 1, . . . ,m− 1}
h(k) a kulcs hasıtott erteke
utkozes, ha k 6= l es h(k) = h(l).
4
Muveletek
Lancolt-hasıto-kereses(T, k)
1. a k kulcsu elem keresese a Th(k) listaban
Lancolt-hasıto-beszuras(T, x)
1. x beszurasa a Th(kulcs[x]) lista elejere
Lancolt-hasıto-torles(T, x)
1. x torlese a Th(kulcs[x]) listabol
5
hasıtofuggvenyek
m res, a kulcsok egyenletes eloszlasuak, es 0 ≤ k < 1,akkor
h(k) = bkmc — egyenletes hasıtas
A kulcsok termeszetes szamokkal valo abrazolasaN = {0, 1, 2, . . . , }ASCII-kod haznalata: pt: (112, 116)
pt abrazolhato pl. 112·128+116 = 14 452 (128-as szamrendszerben)
• osztasos modszer
h(k) = k mod m (C-ben h(k) = k%m)
pl. m = 14, k = 135, akkor h(k) = 9 (mert: 14 · 9 + 9 = 135).
m = 2p nem tul jo,m jo, ha nem kozeli prımszam kettohatvanyhoz
2000 kulcsnal pl. m = 701, tehat h(k) = k mod 701.
6
• szorzasos modszer
0 < A < 1, h(k) =⌊m(kA mod 1)
⌋, ahol
kA mod 1 = kA− bkAc.
Knuth javaslata: A ≈√5− 1
2≈ 0, 6180339887 . . .
• univerzalis hasıtas
a hasıtofuggvenyt veletlenul, az aktualisan tarolando kul-csoktol fuggetlenul valasztjuk
7
Nyılt cımzes
az elemeket a hasıtotablaban taroljukkiprobalas: ha a hasıtofuggveny nyujtotta hely foglalt, ad-dig keresunk, mıg ures helyet talalunk
hasıtofuggveny:
h : U × {0, 1, . . . ,m− 1} → {0, 1, . . . ,m− 1}
fontos, hogy a
h(k, 0), h(k, 1), . . . , h(k,m− 1)
kiprobalasi sorozat a 0, 1, 2, . . . ,m− 1 permutacioja legyen
Pelda.m = 13, a beszurando elemek: 20, 30, 33, 17, 25, 51
20 maradek 7
| | | | | | |20| | | | |0 1 2 3 4 5 6 7 8 9 10 11 12
30 maradek 4
| | | |30| | |20| | | | |0 1 2 3 4 5 6 7 8 9 10 11 12
8
33 maradek 7, foglalt, tehat i = 1, maradek 8.
| | | |30| | |20|33| | | |0 1 2 3 4 5 6 7 8 9 10 11 12
17 maradek 4, foglalt, tehat i = 1, maradek 5.
| | | |30|17| |20|33| | | |0 1 2 3 4 5 6 7 8 9 10 11 12
25 maradek 12
| | | |30|17| |20|33| | | |250 1 2 3 4 5 6 7 8 9 10 11 12
51 maradek 12, de foglalt, ezert i = 1, es a maradek 0.
51| | | |30|17| |20|33| | | |250 1 2 3 4 5 6 7 8 9 10 11 12
9
Hasıto-beszur(T, k)
1. i := 0
2. repeat j := h(k, i)
3. if Tj = nil
4. then Tj := k
5. return
6. else i := i + 1
7. until i = m
8. error ”tulcsordulas”
Hasıto-keres(T, k)
1. i := 0
2. repeat j := h(k, i)
3. if Tj = k
4. then return j
5. i := i + 1
6. until Tj = nil vagy i = m
7. return nil
kiprobalasi modszerek:• linearis kiprobalas• negyzetes kiprobalas• dupla hasıtas
10
• linearis kiprobalaskozonseges hasıtofuggveny : h′ : U → {0, 1, . . . ,m− 1},legyen
h : U × {0, 1, . . . ,m− 1} → {0, 1, . . . ,m− 1}
h(k, i) =(h′(k) + i
)mod m
A kiprobalas a kovetkezo reseken tortenik:
Th′(k), Th′(k)+1, . . . , Tm−1, T0, T1, . . . , Th′(k)−1
• negyzetes kiprobalas
h(k, i) =(h′(k) + c1i + c2i
2)mod m, c2 6= 0
• dupla hasıtas
h(k, i) =(h1(k) + ih2(k)
)mod m,
ahol h1, h2 kisegıto hasıtofuggvenyek
11
Pelda. Az abran levo elemeket a kovetkezo sorrendbenszurtuk be:
79, 69, 72, 50, 98, 14.
12
Legyen h(k) = (h1(k) + ih2(k))mod 13, ahol
h1(k) = kmod 13
h2(k) = 1 + (kmod 11)
Kezdetben i = 0. Utkozeskor noveljuk.
h1(79) = 1, tehat 79 bekerul az 1. helyreh1(69) = 4, tehat 69 bekerul az 4. helyreh1(72) = 7, tehat 72 bekerul az 7. helyreh1(50) = 11, tehat 50 bekerul az 11. helyreh1(98) = 7, de a 7. hely foglalt, exert:
h2(98) = 11, es i = 1
h(98) = (h1(98) + h2(98))mod 13 =
= (7 + 11)mod 13 = 5,
tehat 98 bekerul az 5. helyreh1(14) = 1, de az 1. hely foglalt, exert:
h2(14) = 4, es i = 1
h(14) = (h1(14) + h2(14))mod 13 = (1 + 4)mod 13 = 5,de az 5. hely foglalt, ezert i = 2 esetreh(14) = 1 + 2 · 4 = 9, tehat 14 a 9. helyre kerul
13
h2(k) es m relatıv prımekpl. m prım, es
h1(k) = k mod m
h2(k) = 1 + (k mod m′)
ahol m′ = m− 1 vagy m− 2.
Tokeletes hasıtas
ha a kereseshez szukseges memoriaolvasasok szama kons-tans, azaz O(1)
otlet: ketszıntu hasıtas, lancolas helyett egy masodlagoshasıtotablat hasznalunk
a j-edik reshez az Sj masodlagos hasıtotabla tartozik, hj
hasıtofuggvennyel, mj merettel (amely a lehetseges kulc-sok szamanak negyzete)
14
h(k) =((ak + b) mod p
)mod m,
Peldankban a = 3, b = 42, p = 101,m = 9
hj(k) =((ajk + bj) mod p
)mod mj
15
Tehath(k) =
((3k + 42) mod 101
)mod 9
es
hj(k) =((ajk + bj) mod p
)mod mj
azaz
h0(k) =((0 · k + 0) mod 101
)mod 1
h2(k) =((10k + 18) mod 101
)mod 4
h7(k) =((23k + 88) mod 101
)mod 9
Helyezzuk el a 37-et!
h(37) =((3·37+42) mod 101
)mod 9 = (153 mod 101) mod 9 =
= 52 mod 9 = 7, tehat a 7. masodlagos tablaba kerul.
h7(37) =((23·37+88) mod 101
)mod 9 = (939 mod 101) mod 9 =
= 30 mod 9 = 3, tehat a 4. helyre kerul.
16
hasıtotablazatok – pelda
#include<stdio.h>
int m,T[50];
int beszur(int k){
int j,i=0;
do {j=(k+i) % m;
if (T[j]==-1){
T[j]=k;
return 0;
}
else i++;
} while (i!=m);
printf( "tulcsodulas");
};
int keres(int k){
int j,i=0;
do {j=(k+i) % m;
if (T[j]==k)
return j;
else i++;
}while ((T[j]!=-1) && (i!=m));
return -1;
};
17
void main(){
int i;
m=13;
for (i=0;i<m;i++){
T[i]=-1;
};
beszur(20); beszur(30); beszur(33);
beszur(17); beszur(19);
for (i=0;i<m;i++){
printf("%d ", T[i]);
};
printf("\nKereses \n%d %d %d %d %d %d\n",
keres(30), keres(17), keres(19), keres(20),
keres(33), keres(67));
};
Eredmeny:−1,−1,−1,−1, 30, 17, 19, 29, 33,−1,−1,−1,−14, 5, 6, 7, 8,−1
18