You are on page 1of 16

Bi 3: BNG BM (HASH TABLE)

Php bm c xut v hin thc trn my tnh t nhng nm 50 ca th k 20. N da trn tng: bin i gi tr kha thnh mt s (x l bm) v s dng s ny nh ch cho bng d liu. Cc php ton trn cc cu trc d liu nh danh sch, cy nh phn, phn ln c thc hin bng cch so snh cc phn t ca cu trc, do vy thi gian truy xut khng nhanh v ph thuc vo kch thc ca cu trc. Trong bi ny chng ta s kho st mt cu trc d liu mi c gi l bng bm (hash table). Cc php ton trn bng bm s gip hn ch s ln so snh, v v vy s c gng gim thiu c thi gian truy xut. phc tp ca cc php ton trn bng bm thng c bc l 0(1) v khng ph thuc vo kch thc ca bng bm. Cc khi nim chnh trn cu trc bng bm: Php bm hay hm bm (hash function) Tp kho ca cc phn t trn bng bm Tp a ch trn bng bm Php ton thm phn t vo bng bm Php ton xo mt phn t trn bng bm Php ton tm kim trn bng bm Thng thng bng bm c s dng khi cn x l cc bi ton c liu ln v c lu tr b nh ngoi. d

1. PHP BM (Hash Function) nh ngha: Trong hu ht cc ng dng, kho c dng nh mt phng thc truy xut d liu. Hm bm c dng nh x gi tr kha kho vo mt dy cc a ch ca bng bm (hnh 1).

Hnh 1 Kha c th l dng s hay s dng chui. Gi s c 2 kha phn bit ki v kj nu h(ki)=h(kj) th hm bm b ng . Mt hm bm tt phi tha mn cc iu kin sau: Tnh ton nhanh. Cc kho c phn b u trong bng. t xy ra ng . X l c cc loi kha c kiu d liu khc nhau Hm Bm s dng Phng php chia Dng s d: h(k) = k mod m k l kho, m l kch thc ca bng. Nh vy h(k) s nhn: 0,1,2,,m-1. Vic chn m s nh hng n h(k). Nu chn m=2p th gi tr ca h(k) s l p bit cui cng ca k trong biu din nh phn. Nu chn m=10p th gi tr ca h(k) s l p ch s cui cng trong biu din thp phn ca k. Trong 2 v d trn gi tr h(k) khng ph thuc y vo kha k m ch ph thuc vo p bt (p ch s) cui cng trong kha k. Tt nht ta nn chn m sao cho h(k) ph thuc y v kha k. Thng thng chn m l s nguyn t. VD: Bng bm c 4000 mc, chn m = 4093

Hm Bm s dng Phng php nhn h(k) = m*(k*A mod 1) k l kha, m l kch thc bng, A l hng s: 0 < A < 1 Chn m v A Theo Knuth th chn A bng gi tr sau: A=(
5

-1)/2=0.6180339887

m thng chn m = 2p VD: k=123456; m=10000 H(k)= 10000 (123456* 0.6180339887 mod 1) H(k)= 10000 (76300.0041089472 mod 1) H(k)= 10000 (0.0041089472) H(k)=41 Php bm ph qut (unisersal hashing) Vic chn hm bm khng tt c th dn n xc sut ng cao. Gii php: - La chn hm bm h ngu nhin. - Khi to mt tp cc hm bm H ph qut v t h c chn ngu nhin. Cho H l mt tp hp hu hn cc hm bm: nh x cc kha k t tp kha U vo min gi tr {0,1,2,, m-1}. Tp H l ph qut nu vi mi f H v 2 kho phn bit k1,k2 ta c xc sut: Pr{f(k1) = f(k2)} <= 1/m

2. BNG BM (Hash Table - Direct-address table)


Phn ny s trnh by cc vn chnh: - M t cu trc bng bm tng qut (thng qua hm bm, tp kha, tp a ch) - Cc php ton trn bng bm nh thm phn t (insert), loi b (remove), tm kim (search),

a. M t d liu

Tp kha K Gi s

Hm bm

Tp a ch M

K: tp cc kho (set of keys) M: tp cc da ch (set of addresses). h(k): hm bm dng nh x mt kho k t tp cc kho K thnh mt a ch tng ng trong tp M. b. Cc php ton trn bng bm Khi to (Initialize): Khi to bng bm, cp pht vng nh hay qui nh s phn t (kch thc) ca bng bm Kim tra rng (Empty): kim tra bng bm c rng hay khng? Ly kch thc ca bng bm (Size): Cho bit s phn t hin c trong bng bm Tm kim (Search): Tm kim mt phn t trong bng bm theo kho k ch nh trc. Thm mi phn t (Insert): Thm mt phn t vo bng bm. Sau khi thm s phn t hin c ca bng bm tng thm mt n v. Loi b (Remove): Loi b mt phn t ra khi bng bm, v s phn t s gim i mt. Sao chp (Copy): To mt bng bm mi t mt bng bm c c. X l cc kha trong bng bm (Traverse): x l ton b kha trong bng bm theo th t a ch t nh n ln.

Cc Bng bm thng dng: Vi mi loi bng bm cn thit phi xc nh tp kha K, xc nh tp a ch M v xy dng hm bm h cho ph hp. *) Bng bm vi phng php kt ni trc tip: mi a ch ca bng bm tng ng mt danh sch lin kt. Cc phn t b xung t c kt ni vi nhau trn mt danh sch lin kt. *) Bng bm vi phng php kt ni hp nht: bng bm ny c ci t bng danh sch k, mi phn t c hai trng: trng key cha kha ca phn t v trng next ch phn t k b xung t. Cc phn t b xung t c kt ni nhau qua trng kt ni next. *) Bng bm vi phng php d tun t: Khi thm phn t vo bng bm nu b ng th s d a ch k tip cho n khi gp a ch trng u tin th thm phn t vo a ch ny. *) Bng bm vi phng php d bc hai: v d khi thm phn t vo bng bm ny, nu bm ln u b xung t th s d n a chi mi, ln d th i s xt phn t cch i2 cho n khi gp a ch trng u tin th thm phn t vo a ch ny. *) Bng bm vi phng php bm kp: bng bm ny dng hai hm bm khc nhau, bm ln u vi hm bm th nht nu b xung t th xt a ch khc bng hm bm th hai. u im ca cc Bng bm: Bng bm l mt cu trc dung ha gia thi gian truy xut v dung lng b nh: - Nu khng c s gii hn v b nh th chng ta c th xy dng bng bm vi mi kha ng vi mt a ch vi mong mun thi gian truy xut tc thi. - Nu dung lng b nh c gii hn th t chc mt s kha c cng a ch, khi tc truy xut s gim. Bng bm dc ng dng nhiu trong thc t, rt thch hp khi t chc d liu c kch thc ln v c lu tr b nh ngoi.

3. Cc phng php trnh xy ra ng 2.4.1. Bng bm vi phng php kt ni trc tip (Direct chaining Method) Bng bm c ci t bng cc danh sch lin kt, cc phn t trn bng bm c bm thnh M danh sch lin kt (t danh sch 0 n danh sch M1). Cc phn t b xung t ti a ch i c kt ni trc tip vi nhau qua danh sch lin kt i. Chng hn, vi M=10, cc phn t c hng n v l 9 s c bm vo danh sch lin kt i = 9. Khi thm mt phn t c kha k vo bng bm, hm bm f(k) s xc nh a ch i trong khong t 0 n M-1 ng vi danh sch lin kt i m phn t ny s c thm vo. Khi tm mt phn t c kha k vo bng bm, hm bm f(k) cng s xc nh a ch i trong khong t 0 n M-1 ng vi danh sch lin kt i c th cha phn t ny. Nh vy, vic tm kim phn t trn bng bm s c qui v bi ton tm kim mt phn t trn danh sch lin kt. minh ha ta xt bng bm c cu trc nh sau: - Tp kha K: tp s t nhin - Tp a ch M: gm 10 a ch (M={0, 1, , 9} - Hm bm h(key) = key % 10.

30, 50,60,11,21,31,

Hnh 1.6. bng bm vi phng php kt ni trc tip Hnh trn minh ha bng bm va m t. Theo hnh v, bng bm "bm" phn t trong tp kho K theo 10 danh sch lin kt khc nhau, mi danh sch lin kt gi l mt bucket: Bucket 0 gm nhng phn t c kha tn cng bng 0. Bucket i(i=0 | | 9) gm nhng phn t c kha tn cng bng i. Khi khi ng bng bm, con tr u ca cc bucket l NULL. Theo cu trc ny, vi tc v insert, hm bm h(k) s c dng tnh a ch ca kho k, tc l xc nh bucket cha phn t v t phn t cn chn vo bucket ny. Vi tc v search, hm bm s c dng tnh a ch v tm phn t trn bucket tng ng + i=h(k) => thuoc danh sach thu I (bucket[i] + tim kiem khoa K tren danh sach bucket[i] 7

Ci t bng bm dng phng php kt ni trc tip : a. Khai bo cu trc bng bm: #define M 100 struct nodes { int key; struct nodes *next }; typedef struct nodes *NODEPTR; //khai bao kieu con tro chi nut /*khai bao mang bucket chua M con tro dau cua Mbucket */ NODEPTR bucket[M]; BT: xay dung bang bam theo PP ket noi truc tiep b.Cc php ton: - Tnh gi tr hm bm: Gi s chng ta chn hm bm dng %: h(key)=key % M. - Php ton initbuckets: khi to cc bucket bng Null. - Php ton emmptybucket(b): kim tra bucket b c b rng khng? - Php ton emmpty: Kim tra bng bm c rng khng? - Php ton insert: Thm phn t c kha k vo bng bm. + i=h(k) + ktra bucket [i]: neu rong =>cc o nho cho bucket, gan khoa k them phan tu co khoa k vao ds theo thu tu tang dan. - Php ton remove: Xa phn t c kha k trong bng bm. - Php ton clear: Xa tt c cc phn t trong bng bm. - Php ton traversebucket: X l tt c cc phn t trong bucket b. - Php ton traverse: X l tt c cc phn t trong bng bm. - Php ton search:Tm kim mt phn t trong bng bm, nu khng tm thy hm ny tr v hm NULL, nu tm thy hm ny tr v a ch ca phn t c kha k. B1: Tm danh sch lin kt c th cha kha k b = h(k); p = bucket[b]; B2: Tm kha k trong danh sch lin kt p. 8

Nhn xt bng bm dng phng php kt ni trc tip: Bng bm dng phng php kt ni trc tip s "bm n phn t vo danh sch lin kt (M bucket). tc thc hin cc php ton trn bng hiu qu th cn chn hm bm sao cho bm u n phn t ca bng bm cho M bucket, lc ny trung bnh mi bucket s c n/M phn t. Chng hn, php ton search s thc hin vic tm kim tun t trn bucket nn thi gian tm kim lc ny c bc 0(n/M) ngha l, nhanh gp M ln so vi vic tm kim trn mt danh sch lin kt c n phn t. Nu chn M cng ln th tc thc hin cc php ton trn bng bm cng nhanh, tuy nhin li cng dng nhiu b nh. Do vy, cn iu chnh M dung ha gia tc truy xut v dung lng b nh. Nu chn M=n th nng xut tng ng vi truy xut trn mng (c bc O(1)), tuy nhin tn nhiu b nh. 2.4.2. Bng bm vi phng php kt ni hp nht M t: - Cu trc d liu: Tng t nh trong trng hp ci t bng phng php kt ni trc tip, bng bm trong trng hp ny c ci t bng danh sch lin kt dng mng, c M phn t. Cc phn t b xung t ti mt a ch c kt ni nhau qua mt danh sch lin kt. Mi phn t ca bng bm gm hai trng: Trng key: cha kha ca mi phn t Trng next: con tr ch n phn t k tip nu c xung t. - Khi ng: Khi khi ng, tt c trng key ca cc phn t trong bng bm c gn bi gi tr NullKey, cn tt c cc trng next c gn 1. - Thm mi mt phn t: Khi thm mi mt phn t c kha key vo bng bm, hm bm hkey) s xc nh a ch i trong khong t 0 n M-1. Nu cha b xung t th thm phn t mi vo a ch ny. Nu b xung t th phn t mi c cp pht l phn t trng pha cui mng. Cp nht lin kt next sao cho cc phn t b xung t hnh thnh mt danh sch lin kt. - Tm kim: Khi tm kim mt phn t c kha key trong bng bm, hm bm h(key) s gip gii hn phm vi tm kim bng cch xc nh a ch i trong khong t 0 n M-1, v vic tm kim phn t kha c kho key trong danh sch lin kt s xut pht t a ch i. 9

minh ha cho bng bm vi phng php kt ni hp nht, xt v d sau: Gi s, kho st bng bm c cu trc nh sau: - Tp kha K: tp s t nhin - Tp a ch M: gm 10 a ch (M={0, 1, , 9} - Hm bm f(key) = key % 10. VD: Key : 11 12 21 1 13 Hash: 1 Add 0 1 M-1 2 1 1 3 Add Key 0 1 2 3 8 9 Next

Key

Next

NullKey -1 NullKey -1 NullKey -1 NullKey -1

NullKey -1 11 12 13 9 -1 -1

NullKey -1 1 21 -1 8

Khai bo cu trc bng bm: #define NULLKEY 1 #define M 100 typedef struct node { int key; //khoa cua nut tren bang bam int next; //con tro chi nut ke tiep khi co xung dot } NODE; NODE hashtable[M]; //Khai bao bang bam

10

Ci t bng bm dng phng php kt ni hp nht: 2.4.3. Bng bm vi phng php d tun t M t: - Cu trc d liu: Bng bm trong trng hp ny c ci t bng danh sch k c M phn t, mi phn t ca bng bm l mt mu tin c mt trng key cha kho ca phn t. Khi khi ng bng bm th tt c trng key c gn NullKey; - Khi thm phn t c kho key vo bng bm, hm bm h(key) s xc nh a ch i trong khong t 0 n M-1: Nu cha b xung t th thm phn t mi vo a ch ny. Nu b xung t th hm bm li ln 1, hm h1 s xt a ch k tip, nu li b xung t th hm bm th hm bm li ln 2, hm h2 s xt a ch k tip na, , v qu trnh c th cho n khi no tm c a ch trng v thm phn t mi vo a ch ny. - Khi tm mt phn t c kho key trong bng bm, hm bm h(key) s xc nh a ch i trong khong t 0 n M-1, tm phn t kho key trong bng bm xut pht t a ch i. Hm bm li ln i c biu din bng cng thc sau: f(key)=(f(key)+i) %M vi f(key) l hm bm chnh ca bng bm. Lu a ch d tm k tip l a ch 0 nu d n cui bng. Gi s, kho st bng bm c cu trc nh sau: - Tp kha K: tp s t nhin - Tp a ch M: gm 10 a ch (M={0, 1, , 9} - Hm bm h(key) = key % 10.

11

Hnh th hin thm cc nut 32, 53, 22, 92, 17, 34, 24, 37, 56 vo bng bm. 0 NULL 0 NULL 0 NULL 0 NULL 0 56 1 NULL 1 NULL 1 NULL 1 NULL 1 NULL 2 32 3 53 2 32 3 53 2 32 3 53 4 22 5 92 2 32 3 53 4 22 5 92 6 34 7 17 2 32 3 53 4 22 5 92 6 34 7 17 8 24 9 37

4 NULL 4 22 5 NULL 5 92

6 NULL 6 NULL 6 34 7 NULL 7 NULL 7 17

8 NULL 8 NULL 8 NULL 8 24 9 NULL 9 NULL 9 NULL 9 37

Khai bo cu trc bng bm: #define NULLKEY 1 #define M 100 struct node { int key; //khoa cua nut tren bang bam }; struct node hashtable[M]; //Khai bao bang bam co M nut Ci t bng bm dng phng php d tuyn tnh:

2.4.4. Bng bm vi phng php d bc hai M t:

12

- Bng bm trong trng hp ny c ci t bng danh sch k c M phn t, mi phn t ca bng bm l mt mu tin c mt trng key cha kha cc phn t. - Khi khi ng bng bm th tt c trng key b gn NULLKEY. Khi thm phn t c kha key vo bng bm, hm bm h(key) s xc nh a ch i trong khong t 0 n M-1. Nu cha b xung t th thm phn t mi vo a ch i ny. Nu b xung t th hm bm li ln 1 h1 s xt a ch cch i l 12, nu li b xung t th hm bm li ln 2 h2 s xt a ch cch i 22 , , qu trnh c th cho n khi no tm c trng v thm phn t vo a ch ny. - Khi tm kim mt phn t c kha key trong bng bm th xt phn t ti a ch i=f(key), nu cha tm thy th xt phn t cch i 12, 22, , qu trnh c th cho n khi tm c kha (trng hp tm thy) hoc ri vo a ch trng (trng hp khng tm thy). - Hm bm li ln th i c biu din bng cng thc sau: fi(key)=( f(key) + i2 ) % M vi f(key) l hm bm chnh ca bng bm. Nu d n cui bng th tr v d li t u bng. Bng bm minh ha c cu trc nh sau: - Tp kha K: tp s t nhin - Tp a ch M: gm 10 a ch (M={0, 1, , 9} - Hm bm f(key) = key % 10.

Khai bo cu trc bng bm: #define NULLKEY 1 #define M 101 /* M la so nut co tren bang bam,du de chua cac nut nhap vao bang bam,chon M la so nguyen to */ 13

//Khai bao nut cua bang bam struct node { int key; //Khoa cua nut tren bang bam }; //Khai bao bang bam co M nut struct node hashtable[M]; int N; Ci t bng bm dng phng php d bc hai: Hm bm: Gi s chng ta chn hm bm dng%: f(key)=key %10. int hashfunc(int key) { return(key% 10); } Php ton initialize void initialize() { int i; for(i=0; i<M;i++) hashtable[i].key = NULLKEY; N=0; //so nut hien co khoi dong bang 0 } Php ton empty: int empty() { return(N ==0 ?TRUE :FALSE); } Php ton full: int full() { 14

return(N = = M-1 ?TRUE :FALSE); } Php ton search: Tm phn t c kha k trn bng bm,nu khng tm thy hm ny tr v tr M, nu tm thy hm ny tr v a ch tm thy. int search(int k) { int i, d; i = hashfuns(k); d = 1; while(hashtable[i].key!=k&&hashtable[i].key !=NULLKEY) { //Bam lai (theo phuong phap bac hai) i = (i+d) % M; d = d+2; } hashtable[i].key =k; N = N+1; return(i); } 2.4.5. Bng bm vi phng php bm kp M t: Phng php bm kp dng hai hm bm bt k, v d chn hai hm bm nh sau: h1(key)= key %M. h2(key) =(M-2)-key %(M-2).

Bng bm trong trng hp ny c ci t bng danh sch k c M phn t, mi phn t ca bng bm l mt mu tin c mt trng key lu kho cc phn t. - Khi khi ng bng bm, tt c trng key c gn NULLKEY. 15

- Khi thm phn t c kho key vo bng bm, th i=h1(key) v j=h2(key) s xc nh a ch i v j trong khong t 0 n M-1: Nu cha b xung t th thm phn t mi ti a ch i ny. Nu b xung t th hm bm li ln 1 h1 s xt a ch mi i+j, nu li b xung t th hm bm li ln 2 h2 s xt a ch i+2j, , qu trnh c th cho n khi no tm c a ch trng v thm phn t vo a chi ny. - Khi tm kim mt phn t c kho key trong bng bm, hm bm i=h1(key) v j=h2(key) s xc nh a ch i v j trong khong t 0 n M-1. Xt phn t ti a ch i, nu cha tm thy th xt tip phn t i+j, i+2j, , qu trnh c th cho n khi no tm c kho (trng hp tm thy) hoc b ri vo a ch trng (trng hp khng tm thy). Bng bm dng hai hm bm khc nhau, hm bm li ca phng php bm kp c tnh theo hai gi tr: i (kt qu hm bm th nht) v j (kt qa hm bm th hai) theo mt cng thc bt k. Nu d n cui bng th tr v d li t u bng. Bng bm minh ha c cu trc nh sau: - Tp kha K: tp s t nhin - Tp a ch M: gm 11 a ch (M={0, 1, , 10} - Chn hm bm f1(key)=key % 11 v f2(key)=9-key %9. Khai bo #define NULLKEY 1 #define M 101 /*M la so nut co tren bang bam,du de chua cac nut nhap vao bang bam,chon M la so nguyen to */ struct node { int key;//khoa cua nut tren bang bam }; struct node hashtable[M]; //khai bao bang bam co M nut

16

You might also like