You are on page 1of 90

TRNG I HC LT

KHOA CNG NGH THNG TIN

NGUYN TH THANH BNH

BI GING TM TT

CU TRC D LIU V THUT GII 2


Dnh cho sinh vin ngnh cng ngh thng tin
(Lu hnh ni b)

Lt 2008

LI NI U
p ng nhu cu hc tp ca cc bn sinh vin, nht l sinh vin chuyn ngnh
cng ngh thng tin, Khoa Cng Ngh Thng Tin Trng i Hc Lt chng ti
tin hnh bin son cc gio trnh, bi ging chnh trong chng trnh hc
Ti liu ny c son theo cng chi tit mn Cu Trc D Liu V Thut Gii 2
ca Khoa Cng Ngh Thng Tin Trng i Hc Lt. Mc tiu ca n nhm gip cc
bn sinh vin chuyn ngnh c mt ti liu c ng dng lm ti liu hc tp.
Mc d rt c gng nhiu trong qu trnh bin son gio trnh, song khng khi cn
nhiu thiu st v hn ch. Rt mong nhn c s ng gp kin qu bu ca sinh
vin v cc bn c gio trnh ngy mt hon thin hn.
Lt, ngy 30 thng 06 nm 2008

Mc lc
Chng I: Cy ............................................................................................................................... 4
I. Cc thut ng c bn trn cy ................................................................................................ 4
1. nh ngha ......................................................................................................................... 4
2. Th t cc nt trong cy.................................................................................................... 5
3. Cc th t duyt cy quan trng........................................................................................ 6
4. Cy c nhn v cy biu thc ............................................................................................ 6
II. Cy nh phn (Binary Trees)................................................................................................... 8
1. nh ngha ......................................................................................................................... 8
2. Vi tnh cht ca cy nh phn........................................................................................... 9
3. Biu din cy nh phn ...................................................................................................... 9
4. Duyt cy nh phn ............................................................................................................ 9
5. Ci t cy nh phn ........................................................................................................ 10
IV. Cy tm kim nh phn (Binary Search Trees) .................................................................... 12
1. nh ngha ........................................................................................................................ 12
2. Ci t cy tm kim nh phn .......................................................................................... 13
V. Cy nh phn tm kim cn bng (Cy AVL) ....................................................................... 21
1. Cy nh phn cn bng hon ton..................................................................................... 21
2. Xy dng cy nh phn cn bng hon ton..................................................................... 21
3. Cy tm kim nh phn cn bng (cy AVL).................................................................... 22
Bi tp........................................................................................................................................ 32
Chng II: Th ....................................................................................................................... 35
I. Cc nh ngha ................................................................................................................... 35
III. Biu din th.................................................................................................................... 36
1. Biu din th bng ma trn k...................................................................................... 37
2. Biu din th bng danh sch cc nh k.................................................................... 38
IV. Cc php duyt th (traversals of Graph)........................................................................ 38
1. Duyt theo chiu su (Depth-first search) ........................................................................ 38
2. Duyt theo chiu rng (breadth-first search).................................................................... 40
V. Mt s bi ton trn th................................................................................................... 43
1. Bi ton tm ng i ngn nht t mt nh ca th .................................................. 43
2. Bi ton tm bao ng chuyn tip. .................................................................................. 47
3. Bi ton tm cy bao trm ti thiu (minimum-cost spanning tree)................................. 48
Bi tp........................................................................................................................................ 53
Chng III: Bng Bm ............................................................................................................... 55
I. Phng php bm................................................................................................................. 55
II. Cc hm bm ..................................................................................................................... 57
1. Phng php chia ............................................................................................................. 57
2. Phng php nhn ............................................................................................................ 57
3. Hm bm cho cc gi tr kho l xu k t ...................................................................... 58
III. Cc phng php gii quyt va chm.................................................................................. 59
1. Phng php nh a ch m........................................................................................... 59
2. Phng php to dy chuyn............................................................................................ 62
IV. Ci t bng bm a ch m............................................................................................... 63
V. Ci t bng bm dy chuyn.............................................................................................. 66
VI. Hiu qu ca cc phng php bm.................................................................................... 69
2

Bi tp........................................................................................................................................ 71
Chng IV: Mt s phng php thit k thut gii............................................................... 73
I. Phng php chia tr........................................................................................................ 73
1. M u.............................................................................................................................. 73
2. Tm kim nh phn............................................................................................................ 74
3. Bi ton Min-Max ............................................................................................................ 75
4. Thut ton QuickSort........................................................................................................ 76
II. Phng php quay lui ........................................................................................................... 79
1. M u.............................................................................................................................. 79
2. Bi ton lit k dy nh phn di n .............................................................................. 80
3. Bi ton lit k cc hon v............................................................................................... 80
4. Bi ton duyt th theo chiu su (DFS)...................................................................... 81
III. Phng php tham lam ........................................................................................................ 83
1. M u.............................................................................................................................. 83
2. Bi ton ngi du lch ...................................................................................................... 84
3. Thut ton Prim - Tm cy bao trm nh nht ................................................................. 86
4. Bi ton chic ti sch ...................................................................................................... 86
Bi tp........................................................................................................................................ 87
Ti liu tham kho....................................................................................................................... 89

Chng I

Cy
Mc tiu
Sau khi hc xong chng ny, sinh vin phi:
-

Nm vng khi nim v cy (trees).

Ci t c cy v thc hin cc php ton trn cy.

Kin thc c bn cn thit


hc tt chng ny, sinh vin phi nm vng k nng lp trnh cn bn nh:
-

Kiu con tr (pointer)

Cc cu trc iu khin, lnh vng lp.

Lp trnh theo tng module (chng trnh con) v cch gi chng trnh con
.

Lp trnh qui v gi qui.

Kiu d liu tru tng danh sch

Ni dung
Trong chng ny chng ta s nghin cu cc vn sau:
-

Cc thut ng c bn.

Kiu d liu tru tng Cy

Cy nh phn

Cy tm kim nh phn

Cy nh phn tm kim cn bng AVL

I. Cc thut ng c bn trn cy
Cy l mt tp hp cc phn t gi l nt (nodes) trong c mt nt c phn bit
gi l nt gc (root). Trn tp hp cc nt ny c mt quan h, gi l mi quan h cha
- con (parenthood), xc nh h thng cu trc trn cc nt. Mi nt, tr nt gc, c
duy nht mt nt cha. Mt nt c th c nhiu nt con hoc khng c nt con no.
Mi nt biu din mt phn t trong tp hp ang xt v n c th c mt kiu no
bt k, thng ta biu din nt bng mt k t, mt chui hoc mt s ghi trong vng
trn. Mi quan h cha con c biu din theo qui c nt cha dng trn nt con
dng di v c ni bi mt on thng. Mt cch hnh thc ta c th nh ngha
cy mt cch qui nh sau:
1. nh ngha
-

Mt nt n c l mt cy. Nt ny cng chnh l nt gc ca cy.

Gi s ta c n l mt nt n c v k cy T1,.., Tk vi cc nt gc tng ng l
n1,.., nk th c th xy dng mt cy mi bng cch cho nt n l cha ca cc nt
4

n1,.., nk. Cy mi ny c nt gc l nt n v cc cy T1,.., Tk c gi l cc cy


con. Tp rng cng c coi l mt cy v gi l cy rng k hiu.
V d: xt mc lc ca mt quyn sch. Mc lc ny c th xem l mt cy

Hnh I.1: Cy mc lc sch


Nt gc l sch, n c ba cy con c gc l C1, C2, C3. Cy con th 3 c gc C3 l
mt nt n c trong khi hai cy con kia (gc C1 v C2) c cc nt con.
Nu n1,.., nk l mt chui cc nt trn cy sao cho ni l nt cha ca nt ni+1, vi i=1..k1, th chui ny gi l mt ng i trn cy (hay ngn gn l ng i) t n1 n nk.
di ng i c nh ngha bng s nt trn ng i tr 1. Nh vy di
ng i t mt nt n chnh n bng khng.
Nu c ng i t nt a n nt b th ta ni a l tin bi (ancestor) ca b, cn b gi l
hu du (descendant) ca nt a. R rng mt nt va l tin bi va l hu du ca
chnh n. Tin bi hoc hu du ca mt nt khc vi chnh n gi l tin bi hoc
hu du thc s. Trn cy nt gc khng c tin bi thc s. Mt nt khng c hu
du thc s gi l nt l (leaf). Nt khng phi l l ta cn gi l nt trung gian
(interior). Cy con ca mt cy l mt nt cng vi tt c cc hu du ca n.
Chiu cao ca mt nt l di ng i ln nht t nt ti l. Chiu cao ca cy
l chiu cao ca nt gc. su ca mt nt l di ng i t nt gc n nt .
Cc nt c cng mt su i ta gi l cc nt c cng mt mc i. Theo nh ngha ny
th nt gc mc 0, cc nt con ca nt gc mc 1.
V d: i vi cy trong hnh I.1 ta c nt C2 c chiu cao 2. Cy c chiu cao 3. nt
C3 c chiu cao 0. Nt 2.1 c su 2. Cc nt C1,C2,C3 cng mc 1.
2. Th t cc nt trong cy
Nu ta phn bit th t cc nt con ca cng mt nt th cy gi l cy c th t, th
t qui c t tri sang phi. Nh vy, nu k th t th hai cy sau l hai cy khc
nhau:

Hnh I.2: Cy c th t khc nhau

Trong trng hp ta khng phn bit r rng th t cc nt th ta gi l cy khng c


th t. Cc nt con cng mt nt cha gi l cc nt anh em rut (siblings). Quan h
"tri sang phi" ca cc anh em rut c th m rng cho hai nt bt k theo qui tc:
nu a, b l hai anh em rut v a bn tri b th cc hu du ca a l "bn tri" mi hu
du ca b.
3. Cc th t duyt cy quan trng
Duyt cy l mt qui tc cho php i qua ln lt tt c cc nt ca cy mi nt ng
mt ln, danh sch lit k cc nt (tn nt hoc gi tr cha bn trong nt) theo th t
i qua gi l danh sch duyt cy. C ba cch duyt cy quan trng: Duyt tin t
(preorder), duyt trung t (inorder), duyt hu t (posorder).
-

Cy rng th danh sch duyt cy l rng v n c coi l biu thc duyt tin
t, trung t, hu t ca cy.

Cy ch c mt nt th danh sch duyt cy gm ch mt nt v n c coi


l biu thc duyt tin t, trung t, hu t ca cy.

Ngc li: gi s cy T c nt gc l n v c cc cy con l T1,..,Tn th:


Biu thc duyt tin t ca cy T l lit k nt n k tip l biu thc duyt
tin t ca cc cy T1, T2, .., Tn theo th t .
Biu thc duyt trung t ca cy T l biu thc duyt trung t ca cy T1
k tip l nt n ri n biu thc duyt trung t ca cc cy T2,.., Tn theo
th t .
Biu thc duyt hu t ca cy T l biu thc duyt hu t ca cc cy T1,
T2,.., Tn theo th t ri n nt n.

V d: cho cy nh trong hnh I.3

Hnh I.3: cy nh phn


Biu thc duyt

tin t: A B C D E F H K L
trung t: C B E D F A K H L
hu t: C E F D B K L H A

4. Cy c nhn v cy biu thc


Ta thng lu tr kt hp mt nhn (label) hoc cn gi l mt gi tr (value) vi mt
nt ca cy. Nh vy nhn ca mt nt khng phi l tn nt m l gi tr c lu
gi ti nt . Nhn ca mt nt i khi cn c gi l kha ca nt, tuy nhin hai
khi nim ny l khng ng nht. Nhn l gi tr hay ni dung lu tr ti nt, cn
kho ca nt c th ch l mt phn ca ni dung lu tr ny. Chng hn, mi nt cy
6

cha mt record v thng tin ca sinh vin (m SV, h tn, ngy sinh, a ch,...) th
kho c th l m SV hoc h tn hoc ngy sinh tu theo gi tr no ta ang quan tm
n trong gii thut.
V d: Cy biu din biu thc (a+b)*(a-c) nh trong hnh I.4.

Hnh I.4: Cy biu din th t (a+b)*(a-c)


-

y n , n ,.., n l cc tn nt v *,+,-,a,b,c l cc nhn.

Qui tc biu din mt biu thc ton hc trn cy nh sau:

Mi nt l c nhn biu din cho mt ton hng.


Mi nt trung gian biu din mt ton t.

Hnh I.5: Cy biu din biu thc E1 E2


-

Gi s nt n biu din cho mt ton t hai ngi ( chng hn + hoc * ), nt


con bn tri biu din cho biu thc E1, nt con bn phi biu din cho biu
thc E2 th nt n biu din biu thc E1 E2, xem hnh I.5. Nu l php ton
mt ngi th nt cha php ton ch c mt nt con, nt con ny biu din cho
ton hng ca .

Khi chng ta duyt mt cy biu din mt biu thc ton hc v lit k nhn
ca cc nt theo th t duyt th ta c:
Biu thc dng tin t (prefix) tng ng vi php duyt tin t ca cy.
Biu thc dng trung t (infix) tng ng vi php duyt trung t ca cy.
Biu thc dng hu t (posfix) tng ng vi php duyt hu t ca cy.

V d: i vi cy trong hnh I.4 ta c:


- Biu thc tin t: *+ab-ac
- Biu thc trung t: a+b*a-c
- Biu thc hu t: ab+ac-*
7

Ch
-

Cc biu thc ny khng c du ngoc.

Cc php ton trong biu thc ton hc c th c tnh giao hon nhng khi ta
biu din biu thc trn cy th phi tun th theo biu thc cho. V d biu
thc a+b, vi a,b l hai s nguyn th r rng a+b=b+a nhng hai cy biu din
cho hai biu thc ny l khc nhau (v cy c th t).

Hnh I.6: Cy biu din biu thc a+b v b+a


-

Ch c cy pha bn tri ca hnh I.6 mi ng l cy biu din cho biu thc


a+b theo qui tc trn.

Nu ta gp mt dy cc php ton c cng u tin th ta s kt hp t tri


sang phi. V d a+b+c-d = ((a+b)+c)-d.

II. Cy nh phn (Binary Trees)


1. nh ngha
Cy nh phn l cy rng hoc l cy m mi nt c ti a hai nt con. Hn na cc
nt con ca cy c phn bit th t r rng, mt nt con gi l nt con tri v mt
nt con gi l nt con phi. Ta qui c v nt con tri bn tri nt cha v nt con phi
bn phi nt cha, mi nt con c ni vi nt cha ca n bi mt on thng. V d
cc cy trong hnh I.7.

Hnh I.7: Hai cy c th t ging nhau nhng l hai cy nh phn khc nhau
Ch rng, trong cy nh phn, mt nt con ch c th l nt con tri hoc nt con
phi, nn c nhng cy c th t ging nhau nhng l hai cy nh phn khc nhau. V
d hnh I.7 cho thy hai cy c th t ging nhau nhng l hai cy nh phn khc
nhau. Nt 2 l nt con tri ca cy a/ nhng n l con phi trong cy b/. Tng t nt
5 l con phi trong cy a/ nhng n l con tri trong cy b/.

2. Vi tnh cht ca cy nh phn


Gi h v n ln lt l chiu cao v s phn t ca cy nh phn. Ta c cc tnh cht
sau:
-

S nt mc i<=2i+1. Do s nt ti a ca n l 2h-1

S nt ti a trong cy nh phn l 2h-1, hay n<=2h-1. Do chiu cao ca


n: n>=h>=log2(n+1)

3. Biu din cy nh phn


Ta chn cu trc ng biu din cy nh phn:

Trong : Lchild, Rchild ln lt l cc con tr ch n nt con bn tri v nt con bn


phi. N s bng rng nu khng c nt con.
Nt l c dng

4. Duyt cy nh phn
Ta c th p dng cc php duyt cy tng qut duyt cy nh phn. Tuy nhin v
cy nh phn l cu trc cy c bit nn cc php duyt cy nh phn cng n gin
hn. C ba cch duyt cy nh phn thng dng (xem kt hp vi hnh I.8):
-

Duyt tin t (Node-Left-Right): duyt nt gc, duyt tin t con tri ri


duyt tin t con phi.

Duyt trung t (Left-Node-Right): duyt trung t con tri ri n nt gc


sau l duyt trung t con phi.

Duyt hu t (Left-Right-Node): duyt hu t con tri ri duyt hu t con


phi sau l nt gc.

HnhI.8

Ch rng danh sch duyt tin t, hu t ca cy nh phn trng vi danh sch duyt
tin t, hu t ca cy khi ta p dng php duyt cy tng qut. Nhng danh sch
duyt trung t th khc nhau.
V d

Hnh I.9
Cc danh sch duyt cy nh phn

Cc danh sch duyt cy tng qut

Tin t:

ABDHIEJCFKLGM

ABDHIEJCFKLGM

Trung
t:

HDIBJEAKFLCGM

HDIBJEAKFLCMG

Hu t:

HIDJEBKLFMGCA

HIDJEBKLFMGCA

5. Ci t cy nh phn
Tng t cy tng qut, ta cng c th ci t cy nh phn bng con tr bng cch
thit k mi nt c hai con tr, mt con tr tr nt con tri, mt con tr tr nt con
phi, trng Data s cha nhn ca nt.
typedef TData;
typedef struct Tnode
{
TData Data;
TNode* left,right;
};
typedef TNode* TTree;
Vi cch khai bo nh trn ta c th thit k cc php ton c bn trn cy nh phn
nh sau :
To cy rng
Cy rng l mt cy l khng cha mt nt no c. Nh vy khi to cy rng ta ch
cn cho cy tr ti gi tr NULL.
void MakeNullTree(TTree *T)
10

{
(*T)=NULL;
}
Kim tra cy rng
int EmptyTree(TTree T)
{
return T==NULL;
}
Xc nh con tri ca mt nt
TTree LeftChild(TTree n)
{
if (n!=NULL) return n->left;
else return NULL;
}
Xc nh con phi ca mt nt
TTree RightChild(TTree n)
{
if (n!=NULL) return n->right;
else return NULL;
}
Kim tra nt l:
Nu nt l nt l th n khng c bt k mt con no c nn khi con tri v con
phi ca n cng bng NULL
int IsLeaf(TTree n)
{
if(n!=NULL)
return(LeftChild(n)==NULL)&&(RightChild(n)==NULL);
else return NULL;
}
Xc nh s nt ca cy
int nb_nodes(TTree T)
{
11

if(EmptyTree(T)) return 0;
else return 1+nb_nodes(LeftChild(T))+ nb_nodes(RightChild(T));
}
Cc th tc duyt cy: tin t, trung t, hu t
Th tc duyt tin t
void PreOrder(TTree T)
{
cout<<T->Data;
if (LeftChild(T)!=NULL) PreOrder(LeftChild(T));
if (RightChild(T)!=NULL)PreOrder(RightChild(T));
}
Th tc duyt trung t
void InOrder(TTree T)
{
if (LeftChild(T)=!NULL)InOrder(LeftChild(T));
cout<<T->data;
if (RightChild(T)!=NULL) InOrder(RightChild(T));
}
Th tc duyt hu t
void PosOrder(TTree T)
{
if (LeftChild(T)!=NULL) PosOrder(LeftChild(T));
if (RightChild(T)!=NULL)PosOrder(RightChild(T));
cout<<T->data;
}
IV. Cy tm kim nh phn (Binary Search Trees)
1. nh ngha
Cy tm kim nh phn (TKNP) l cy nh phn m kho ti mi nt cy ln hn kho
ca tt c cc nt thuc cy con bn tri v nh hn kho ca tt c cc nt thuc cy
con bn phi.
Lu : d liu lu tr ti mi nt c th rt phc tp nh l mt record chng hn,
trong trng hp ny kho ca nt c tnh da trn mt trng no , ta gi l
trng kho. Trng kho phi cha cc gi tr c th so snh c, tc l n phi ly
gi tr t mt tp hp c th t.
12

V d: hnh I.10 minh ho mt cy TKNP c kho l s nguyn (vi quan h th t


trong tp s nguyn).

Hnh I.10: V d cy tm kim nh phn

Qui c: Cng nh tt c cc cu trc khc, ta coi cy rng l cy TKNP


Nhn xt:
-

Trn cy TKNP khng c hai nt cng kho.

Cy con ca mt cy TKNP l cy TKNP.

Khi duyt trung t (InOrder) cy TKNP ta c mt dy c th t tng. Chng


hn duyt trung t cy trn ta c dy: 5, 10, 15, 17, 20, 22, 30, 35, 42.

2. Ci t cy tm kim nh phn
Cy TKNP, trc ht, l mt cy nh phn. Do ta c th p dng cc cch ci t
nh trnh by trong phn cy nh phn. S khng c s khc bit no trong vic ci
t cu trc d liu cho cy TKNP so vi cy nh phn, nhng tt nhin, s c s khc
bit trong cc gii thut thao tc trn cy TKNP nh tm kim, thm hoc xo mt nt
trn cy TKNP lun m bo tnh cht cu cy TKNP.
Mt cch ci t cy TKNP thng gp l ci t bng con tr. Mi nt ca cy nh l
mt mu tin (record) c ba trng: mt trng cha kho, hai trng kia l hai con tr
tr n hai nt con (nu nt con vng mt ta gn con tr bng NULL)
Khai bo nh sau
typedef <kiu d liu ca kho> KeyType;
typedef struct BSNode
{
KeyType Key;
BSNode* Left,Right;
}
typedef BSNode* BSTree;
Khi to cy TKNP rng
13

Ta cho con tr qun l nt gc (Root) ca cy bng NULL.


void MakeNullTree(BSTree &Root)
{
Root=NULL;
}
Tm kim mt nt c kha cho trc trn cy TKNP
tm kim 1 nt c kho x trn cy TKNP, ta tin hnh t nt gc bng cch so snh
kho ca nt gc vi kho x.
-

Nu nt gc bng NULL th khng c kho x trn cy.

Nu x bng kho ca nt gc th gii thut dng v ta tm c nt cha


kho x.

Nu x ln hn kho ca nt gc th ta tin hnh (mt cch qui) vic tm kho


x trn cy con bn phi.

Nu x nh hn kho ca nt gc th ta tin hnh (mt cch qui) vic tm


kho x trn cy con bn tri.

V d: tm nt c kho 30 trong cy trong hnh I.10


-

So snh 30 vi kho nt gc l 20, v 30 > 20 vy ta tm tip trn cy con bn


phi, tc l cy c nt gc c kho l 35.

So snh 30 vi kho ca nt gc l 35, v 30 < 35 vy ta tm tip trn cy con


bn tri, tc l cy c nt gc c kho l 22.

So snh 30 vi kho ca nt gc l 22, v 30 > 22 vy ta tm tip trn cy con


bn phi, tc l cy c nt gc c kho l 30.

So snh 30 vi kho nt gc l 30, 30 = 30 vy n y gii thut dng v ta


tm c nt cha kho cn tm.

Hm di y tr v kt qu l con tr tr ti nt cha kho x hoc NULL nu khng


tm thy kho x trn cy TKNP.
BSTree Search(KeyType x,BSTree Root)
{
if(Root == NULL)
return NULL; //khng tm thy kho x
else if (Root->Key == x) /* tm thy kho x */
return Root;
else if (Root->Key < x)
//tm tip trn cy bn phi
return Search(x,Root->right);
14

else
{
tm tip trn cy bn tri
}
return Search(x,Root->left);
}
Thut ton tm kim dng lp, tr v con tr cha d liu cn tm v ng thi gi li
nt cha ca n nu tm thy, ngc li tr v rng.
BSTree SearchLap(BSTree Root, KeyType Item, BSTree &Parent)
{
BSTree LocPtr = Root;
Parent = NULL;
while (LocPtr != NULL)
{
if (Item==LocPtr->Key)
return (LocPtr);
else
{
Parent = LocPtr;
if (Item > LocPtr->Key)
LocPtr = LocPtr->RChild;
else LocPtr = LocPtr->LChild;
}
return(NULL);
}
}
Nhn xt: gii thut ny s rt hiu qu v mt thi gian nu cy TKNP c t chc
tt, ngha l cy tng i "cn bng".
Thm mt nt c kha cho trc vo cy TKNP
Theo nh ngha cy tm kim nh phn ta thy trn cy tm kim nh phn khng c
hai nt c cng mt kho. Do nu ta mun thm mt nt c kho x vo cy TKNP
th trc ht ta phi tm kim xc nh c nt no cha kho x cha. Nu c th gii
thut kt thc (khng lm g c!). Ngc li, s thm mt nt mi cha kho x ny.
15

Vic thm mt kho vo cy TKNP l vic tm kim v thm mt nt, tt nhin, phi
m bo cu trc cy TKNP khng b ph v. Gii thut c th nh sau:
Ta tin hnh t nt gc bng cch so snh kha cu nt gc vi kho x.
-

Nu nt gc bng NULL th kho x cha c trn cy, do ta thm mt nt mi


cha kho x.

Nu x bng kho ca nt gc th gii thut dng, trng hp ny ta khng thm


nt.

Nu x ln hn kho ca nt gc th ta tin hnh (mt cch qui) gii thut ny


trn cy con bn phi.

Nu x nh hn kho ca nt gc th ta tin hnh (mt cch qui) gii thut ny


trn cy con bn tri.

V d: thm kho 19 vo cy trong hnh I.11


-

So snh 19 vi kho ca nt gc l 20, v 19 < 20 vy ta xt tip n cy bn


tri, tc l cy c nt gc c kho l10.

So snh 19 vi kho ca nt gc l 10, v 19 > 10 vy ta xt tip n cy bn


phi, tc l cy c nt gc c kho l 17.

So snh 19 vi kho ca nt gc l 17, v 19 > 17 vy ta xt tip n cy bn


phi. Nt con bn phi bng NULL, chng t rng kho 19 cha c trn cy, ta
thm nt mi cha kho 19 v nt mi ny l con bn phi ca nt c kho l
17, xem hnh I.11

Hnh I.11: Thm kho 19 vo cy hnh I.10


Th tc sau y tin hnh vic thm mt kho vo cy TKNP.
void InsertNode(KeyType x, BSTree &Root )
{
if (Root == NULL)
{ /* thm nt mi cha kho x */
Root = new BSNode;
16

Root->Key = x;
Root->left = NULL;
Root->right = NULL;
}
else if (x < Root->Key) InsertNode(x,Root->left);
else if (x>Root->Key)InsertNode(x,Root->right);
}
Th tc lp thm mt nt vo cy
int InsertNodeLap(BSTree &Root, KeyType Item)
{
BSTree LocPtr, Parent;
if (SearchLap(Root, Item, Parent))
{
cout << \n c ptu <<Item<< trong cy ! ;
return -1;
}
else
{
If (LocPtr=CreateNode())==NULL)
return 0;
LocPtr->Key = Item;
LocPtr->LChild = NULL;
LocPtr->RChild = NULL;
if (Parent == NULL)
Root = LocPtr; // cy rng
else if (Item < Parent->Data)
Parent->LChild = LocPtr;
else Parent->RChild = LocPtr;
return 1;
}
}
Xa mt nt c kha cho trc ra khi cy TKNP
17

Gi s ta mun xo mt nt c kho x, trc ht ta phi tm kim nt cha kho x trn


cy.

Hnh I.12

Vic xo mt nt nh vy, tt nhin, ta phi bo m cu trc cy TKNP khng b ph


v.
-

Nu khng tm thy nt cha kho x th gii thut kt thc.

Nu tm gp nt N c cha kho x, ta c ba trng hp sau


-

Nu N l l ta thay n bi NULL.

N ch c mt nt con ta thay n bi nt con ca n.

N c hai nt con ta thay n bi nt ln nht trn cy con tri ca n (nt


cc phi ca cy con tri) hoc l nt b nht trn cy con phi ca n
(nt cc tri ca cy con phi). Trong gii thut sau, ta thay x bi kho
ca nt cc tri ca cy con bn phi ri ta xo nt cc tri ny. Vic
18

xo nt cc tri ca cy con bn phi s ri vo mt trong hai trng


hp trn.

Hnh I.12

Gii thut xo mt nt c kho nh nht


Hm di y tr v kho ca nt cc tri, ng thi xo nt ny.
KeyType DeleteMin (BSTree &Root )
{
KeyType k;
if (Root->left == NULL)
{
k=Root->key;
Root = Root->right;
return k;
}
else return DeleteMin(Root->left);
}
Th tc xa mt nt c kho cho trc trn cy TKNP
void DeleteNode(KeyType x, BSTree &Root)
{
if (Root != NULL)
if (x < Root->Key) DeleteNode(x,Root->left)
else if (x > Root->Key)
DeleteNode(x,Root->right)
else if ((Root->left==NULL) && (Root->right==NULL))
Root =NULL;
else if (Root->left == NULL)
Root = Root->right
19

else if (Root->right==NULL)
Root = Root->left
else Root->Key = DeleteMin(Root->righ)
}

Th tc lp xa mt node ra khi cy
int DeleteNode (BSTree &Root, KeyType Item)
{
BSTree x, Parent, xSucc, SubTree;
if((x=SearchLap(Root,Item,Parent)) == NULL)
return 0; //khng thy Item
else
{
if((x->left!=NULL)&&(x->right != NULL))
// nt c hai con
{
xSucc = x->right;
Parent = x;
while (xSucc->left != NULL)
{
Parent = xSucc;
xSucc = xSucc->left;
}
x->Key = xSucc->Key;
x = xSucc;
}
// a nt 2 con v nt c ti a 1 con
SubTree = x->left;
if (SubTree == NULL)
SubTree = x->right;
if (Parent == NULL)
Root = SubTree; // xa nt gc
else if (Parent->left == x)
20

Parent->left = SubTree;
else Parent->right = SubTree;
delete x;
return 1;
}
}
V. Cy nh phn tm kim cn bng (Cy AVL)
1. Cy nh phn cn bng hon ton
nh ngha
Cy nh phn cn bng hon ton (CBHT) l cy nh phn m i vi mi nt ca n,
s nt ca cy con tri chnh lch khng qu 1 so vi s nt ca cy con phi.
V d:

Hnh I.13
2. Xy dng cy nh phn cn bng hon ton
Tree CreateTreeCBHT(int n)
{
Tree Root;
int nl, nr;
KeyType x;
if (n<=0) return NULL;
nl = n/2; nr = n-nl-1;
Input(x);//nhp phn t x
if ((Root =CreateNode()) == NULL)
return NULL;
Root->Key = x;
Root->left = CreateTreeCBHT(nl);
Root->right = CreateTreeCBHT(nr);
return Root;
}
21

3. Cy tm kim nh phn cn bng (cy AVL)


Trn cy nh phn tm kim BST c n phn t m l cy CBHT, php tm kim mt
phn t trn n s thc hin rt nhanh: trong trng hp xu nht, ta ch cn thc hin
log2n php so snh. Nhng cy CBHT c cu trc km n nh trong cc thao tc cp
nht cy, nn n t c s dng trong thc t. V th, ngi ta tn dng tng cy
cn bng hon ton xy dng mt cy nh phn tm kim c trng thi cn bng yu
hn, nhng vic cn bng li ch xy ra phm vi cc b ng thi chi ph cho vic
tm kim vn t mc O(log2n). l cy tm kim cn bng.
nh ngha
Cy nh phn tm kim gi l cy nh phn tm kim cn bng (gi tt l cy AVL) nu
ti mi nt ca n, cao ca cy con tri v cao ca cy con phi chnh lch nhau
khng qu 1.
R rng mt cy nh phn tm kim cn bng hon ton l cy cn bng, nhng iu
ngc li l khng ng. Chng hn cy nh phn tm kim trong v d sau l cn bng
nhng khng phi l cn bng hon ton.
V d:

Hnh I.14

Cy cn bng AVL vn thc hin vic tm kim nhanh tng ng cy cn bng


hon ton v vn c cu trc n nh hn hn cy cn bng.
Ch s cn bng v vic cn bng li cy AVL
nh ngha: ch s cn bng (CSCB) ca mt nt p l hiu ca chiu cao cy con phi
v cy con tri ca n.
K hiu:
hl(p) hay hl l chiu cao ca cy con tri ca p.
hr(p) hay hr l chiu cao ca cy con phi ca p.
EH = 0, RH = 1, LH = -1
CSCB(p) = EH

hR(p) = hL(p) :2 cy con cao bng nhau

CSCB(p) = RH

hR(p) > hL(p) : cy lch phi

CSCB(p) = LH

hR(p) < hL(p) : cy lch tri

Vi mi nt ca cy AVL, ngoi cc thuc tnh thng thng nh cy nh phn, ta cn


lu thm thng tin v ch s cn bng trong cu trc ca mt nt. Ta c nh ngha
cu trc mt nt nh sau:
22

typedef ..... ElementType; /* Kiu d liu ca nt */


typedef struct AVLTN

{
ElementType Data;
int Balfactor; //Ch s cn bng
struct AVLTN * Lchild, *Rchild;

} AVLTreeNode;
typedef AVLTreeNode *AVLTree;
Vic thm hay hy mt nt trn cy AVL c th lm cy tng hay gim chiu
cao, khi ta cn phi cn bng li cy. gim ti a chi ph cn bng li cy, ta ch
cn bng li cy AVL phm vi cc b.
Cc trng hp mt cn bng
Ngoi cc thao tc thm v hy i vi cy cn bng, ta cn c thm thao tc c bn
l cn bng li cy AVL trong trng hp thm hoc hy mt nt ca n. Khi
lch gia chiu cao cy con phi v tri s l 2. Do trng hp cy lch tri v phi
tng ng l i xng nhau, nn ta ch xt trng hp cy AVL lch tri.
Trng hp a: cy con T1 lch tri

Hnh I.15

Trng hp b: cy con T1 lch phi

Hnh I.16
23

Trng hp c: cy con T1 khng lch

Hnh I.17

Cn bng li trng hp a: ta cn bng li bng php quay n left-left ta c:

Hnh I.18

Cn bng li trng hp b:

Hnh I.19
Cn bng li bng php quay kp left-right, ta c kt qu nh sau:

24

Hnh I.20
Ci t
//Php quay n Left Left
void RotateLL(AVLTree &T)
{
AVLTree T1 = T->Lchild;
T->Lchild = T1->Rchild;
T1->Rchild = T;
switch (T1->Balfactor)
{
case LH: T->Balfactor = EH;
T1->Balfactor = EH; break;
case EH: T->Balfactor = LH;
T1->Balfactor = RH; break;
}
T = T1;
return ;
}
// Php quay n Right Right
void RotateRR (AVLTree &T)
{
AVLTree T1 = T->Rchild;
T->Rchild = T1->Lchild;
T1->Lchild = T;
switch (T1->Balfactor)
25

{
case RH: T->Balfactor = EH;
T1->Balfactor = EH; break;
case EH: T->Balfactor = RH;
T1->Balfactor = LH; break;
}
T = T1;
return ;
}
//Php quay kp Left Right
void RotateLR(AVLTree &T)
{
AVLTree T1 = T->Lchild, T2 = T1->Rchild;
T->Lchild = T2->Rchild; T2->Rchild = T;
T1->Rchild = T2->Lchild; T2->Lchild = T1;
switch (T2->Balfactor)
{
case LH: T->Balfactor = RH;
T1->Balfactor = EH; break;
case EH: T->Balfactor = EH;
T1->Balfactor = EH; break;
case RH: T->Balfactor = EH;
T1->Balfactor = LH; break;
}
T2->Balfactor = EH;
T = T2;
return ;
}
//Php quay kp Right-Left
void RotateRL(AVLTree &T)
{
AVLTree T1 = T->RLchild, T2 = T1->Lchild;
26

T->Rchild = T2->Lchild; T2->Lchild = T;


T1->Lchild = T2->Rchild; T2->Rchild = T1;
switch (T2->Balfactor)
{
case LH: T->Balfactor = EH;
T1->Balfactor = RH; break;
case EH: T->Balfactor = EH;
T1->Balfactor = EH; break;
case RH: T->Balfactor = LH;
T1->Balfactor = EH; break;
}
T2->Balfactor = EH;
T = T2;
return ;
}
Ci t cc thao tc cn bng li
//Cn bng li khi cy b lch tri
int LeftBalance(AVLTree &T)
{
AVLTree T1 = T->Lchild;
switch (T1->Balfactor)
{
case LH : RotateLL(T);
return 2; //cy T khng b lch
case EH : RotateLL(T);
return 1;//cy T b lch phi
case RH : RotateLR(T); return 2;
}
return 0;
}
//Cn bng li khi cy b lch phi
int RightBalance(AVLTree &T)
27

{
AVLTree T1 = T->Rchild;
switch (T1->Balfactor)
{
case LH : RotateRL(T);
return 2; //cy T khng lch
case EH : RotateRR(T);
return 1; //cy T lch tri
case RH : RotateRR(T); return 2;
}
return 0;
}
Chn mt phn t vo cy AVL
Vic chn mt phn t vo cy AVL xy ra tng t nh trn cy nh phn tm kim.
Tuy nhin sau khi chn xong, nu chiu cao ca cy thay i ti v tr thm vo, ta cn
phi ngc ln gc kim tra xem c nt no b mt cn bng hay khng. Nu c, ta
ch cn phi cn bng li nt ny.
AVLTree CreateAVL()
{
AVLTree Tam= new AVLTreeNode;
if (Tam == NULL)
cout << \nLi !;
return Tam;
}
int InsertNodeAVL( AVLTree &T, ElementType x)
{
int Kqua;
if (T)
{
if(T->Data==x)
return 0; // c nt trn cy
if (T-> Data > x)
{
28

//chn nt vo cy con tri


Kqua = InsertNodeAVL(T->Lchild,x);
if (Kqua < 2) return Kqua;
switch (T->Balfactor)
{
case LH: LeftBalance(T);
return 1;//T lch tri
case EH: T->Balfactor=LH;
return 2;//T khng lch
caseRH:T->Balfactor=EH;
return 1;//T lch phi
}
}
else // T-> Data < x
{
Kqua= InsertNodeAVL(T->Rchild,x);
if (Kqua < 2) return Kqua;
switch (T->Balfactor)
{
case LH: T->Balfactor = EH;
return 1;
case EH:T->Balfactor=RH;
return 2;
case RH : RightBalance(T);
return 1;
}
}
else //T==NULL
{
if ((T = CreateAVL()) == NULL)
return 1;
T->Data = x;
29

T->Balfactor = EH;
T->Lchild = T->Rchild = NULL;
return 2;
}
}
Xa mt phn t ra khi cy AVL
Vic xa mt phn t ra khi cy AVL din ra tng t nh i vi cy nh phn tm
kim, ch khc l sau khi hy, nu cy AVL b mt cn bng, ta phi cn bng li cy.
Vic cn bng li cy c th xy ra phn ng dy chuyn.
int DeleteAVL(AVLTree &T, ElementType x)
{
int Kqua;
if (T== NULL) return 0; // khng c x trn cy
if (T-> Data > x)
{
Kqua = DeleteAVL(T->Lchild,x);// tm v xa x trn cy con tri ca T
if (Kqua < 2) return Kqua;
switch (T->Balfactor)
{
case LH : T->Balfactor = EH;
return 2; //trc khi xa T lch tri
case EH : T->Balfactor = RH;
return 1;//trc khi xa T khng lch
case RH : return RightBalance(T);
// trc khi xa T lch phi
}
}
else if (T-> Data < x)
{
Kqua = DeleteAVL(T->Rchild,x);// tm v xa x trn cy con tri ca T
if (Kqua < 2) return Kqua;
switch (T->Balfactor)
30

{
case LH : return LeftBalance(T);//trc khi xa T lch tri
case EH : T->Balfactor = LH;
return 1;

//trc khi xa T khng lch

case RH : T->Balfactor = EH;


return 2; //trc khi xa T lch phi
}
}
else //T->Data== x
{
AVLTree p = T;
if (T->Lchild == NULL)
{
T = T->Rchild; Kqua = 2;
}
else

if (T->Rchild == NULL)

{
T = T->Lchild; Kqua = 2;
}
else // T c hai con
{
Kqua = TimPhanTuThayThe(p,T->Rchild);
//Tm phn t thay th P xa trn nhnh phi cu T
if (Kqua < 2) return Kqua;
switch (T->Balfactor)
{
case LH : return LeftBalnce(T);
case EH : T->Balfactor = LH;
return 2;
case RH : T->Balfactor = EH;
return 2;
}
}
31

delete p;
return Kqua;
}
}
// Tm phn t thay th
int TimPhanTuThayThe(AVLTree &p, AVLTree &q)
{
int Kqua;
if (q->Lchild)
{
Kqua = TimPhanTuThayThe(p, q->Lchild);
if (Kqua < 2) return Kqua;
switch (q->Balfactor)
{
case LH : q->Balfactor = EH;
return 2;
case EH : q->Balfactor = RH;
return 1;
case RH : return RightBalance(q);
}
}
Else
{
p->Data = q->Data;
p = q;
q = q->Rchild;
return 2;
}
}
Bi tp
1. Xut ra theo th t: gia, u, cui cc phn t trn cy nh phn sau:

32

A
P

E
M

T
D

2. Tm cy nh phn tha ng thi hai iu kin kt xut sau:


-

Theo th t u NLR ca n l dy k t sau:


A, B, C, D, E, Z, U, T, Y

Theo th t gia LNR ca n l dy k t sau:


D, C, E, B, A, U, Z, T, Y

3. Biu din mi biu th s hc di y trn cy nh phn, t rt ra dng


biu thc hu t ca chng:
-

a/(b*c)

5 + 4a3 3a2 + 7

(a + b) * (c - d)

Sa+b

Vit thut ton vchng trnh:


-

Chuyn mt biu thc s hc k hiu ln cy nh phn (c kim tra biu thc


cho c hp c php khng ?)

Xut ra biu thc s hc di dng: trung t, hu t, tin t

4. Xy dng cy tm kim nh phn BST t mi b mc d liu u vo nh


sau:
-

1,2,3,4,5

5,4,3,2,1

fe, cx, jk, ha, ap, aa, by, my, da

8,9,11,15,19,20,21,7,3,2,1,5,6,4,13,10,12,17,16,18. Sau xa ln lt cc nt
sau: 2,10,19,8,20

5. Vit chng trnh vi cc chc nng sau:


-

Nhp t bn phm cc s nguyn vo mt cy nh phn tm kim (BST) m nt


gc c tr ti bi con tr Root.

Xut cc phn t trn cy BST trn theo th t: u, gia, cui.


33

Tm v xa (nu c th) phn t trn cy Root c d liu trng vi mt mc d


liu Item cho trc c nhp t bn phm.

Sp xp n mc d liu (c ci t bng DSLK) bng phng php cy nh


phn tm kim BSTSort.

Yu cu: vit cc thao tc trn bng 2 phng php quy v lp


6. Tng t bi 5 nhng trong mi nt c thm trng parent tr ti cha
ca n.
7. Cho cy nh phn T. Vit chng trnh cha cc hm ctcdng xc nh:
-

Tng s nt ca cy.

S nt ca cy mc k.

S nt l.

Chiu cao ca cy.

Kim tra xem cy T c phi cy cn bng hon ton hay khng?

S nt c ng hai con khc rng

S nt c ng mt con khc rng

S nt c kha nh hn x trn cy nh phn hoc cy BST

S nt c kha ln hn x trn cy nh phn hoc cy BST

Duyt theo chiu rng

Duyt theo chiu su

o nhnh tri v phi ca mt cy nh phn.

8. Vit chng trnh thc hin cc thao tc c bn trn cy AVL: chn mt


nt, xa mt nt, to cy AVL, hy cy AVL.
9. Vit chng trnh cho php to, thm, bt, tra ca, sa cha t in.

34

Chng II

Th
Mc tiu
Sau khi hc xong chng ny, sinh vin nm vng v ci t c cc kiu d liu
tru tng th v vn dng gii nhng bi ton thc t.
Kin thc c bn cn thit
hc tt chng ny sinh vin cn phi nm vng k nng lp trnh c bn nh:
-

Kiu mu tin, kiu mng, kiu con tr.

Cc cu trc iu khin, lnh vng lp.

Lp trnh hm, th tc, cch gi hm.

Ni dung
Trong chng ny chng ta s nghin cu mt s kiu d liu tru tng c bn nh
sau:
-

Cc khi nim c bn

Kiu d liu tru tng th

Biu din th

Cc php duyt th

Mt s bi ton trn th

I. Cc nh ngha
Mt th G bao gm mt tp hp V cc nh v mt tp hp E cc cung tng ng,
k hiu G = (V, E). Cc nh cn c gi l nt (node) hay im (point). Cc cung
ni gia hai nh, hai nh ny c th trng nhau. Hai nh c cung ni nhau gi l hai
nh k (adjacency). Mt cung ni gia hai nh v, w c th coi nh l mt cp im
(v, w). Nu cp ny c th t th ta c cung c th t, ngc li th l cung khng c
th t. Nu cc cung trong th G c th t th G gi l th c hng (directed
graph). Nu cc cung trong th G khng c th t th th G gi l th v
hng (undirected graph). Trong cc phn sau ny ta dng t th ni n th
ni chung, khi no cn phn bit r ta s dng th c hng hay th v hng.
Hnh I.1a cho ta mt v d v th c hng, hnh I.1.b cho ta v d v th v
hng. Trong cc th ny th cc vng trn c nh s biu din cc nh, cn
cc cung c biu din bng on thng c hng (trong I.1a) hoc khng c hng
(trong I.1b).

35

Thng thng trong mt th, cc nh biu din cho cc i tng cn cc cung


biu din cho mi quan h gia cc i tng . Chng hn cc nh c th biu din
cho cc thnh ph cn cc cung biu din cho ng giao thng ni gia cc thnh
ph.
Mt ng i (path) trn th l mt dy tun t cc nh v1, v2, ..vn sao cho (vi, vi+1)
l mt cung trn th (i=1,,n-1). ng i ny l ng i t v1 n vn v i qua
cc nh v2, .., vn-1. nh v1 gi l nh u, vn cn gi l nh cui, di ng i
ny bng (n-1). Trng hp c bit dy ch c mt nh v th ta coi l ng i t
n n chnh n v di bng 0. V d dy 1, 2, 4 trong th I.1.a l mt ng i
t nh 1 n nh 4, ng i ny c di bng 2.
ng i gi l ng i n nu mi nh trn ng i u khc nhau, ngoi tr
nh u v nh cui c th trng nhau. Mt ng i c nh u v nh cui trng
nhau gi l mt chu trnh. Mt chu trnh n l mt ng i n c nh u v nh
cui trng nhau v c di t nht l 1. V d trong hnh I.1a th 3,2,4,3 to thnh
mt chu trnh c di 3. Trong hnh I.1b th 1,3,4,2,1 l mt chu trnh c di bng
4.
Trong nhiu ng dng ta thng kt hp cc gi tr (value) hay nhn (label) vi cc
nh hoc cc cnh, lc ny ta c th c nhn. Nhn kt hp vi cc nh hoc cnh
c th biu din tn, gi, khong cch Ni chung nhn c th c kiu tu . Hnh I.2
cho ta mt v d v mt th c nhn. y, nhn l cc gi tr s nguyn biu din
cho gi cc vn chuyn mt tn hng gia cc thnh ph 1, 2, 3, 4 chng hn.

th con ca mt th G = (V, E) l mt th G = (V, E) trong :


-

V V v

E gm tt c cc cnh (v, w) E sao cho v, w V

III. Biu din th


Mt s cu trc d liu c th dng biu din th. Vic chn cu trc d liu no
l tu thuc vo cc php ton trn cc cung v nh ca th. Hai cu trc thng

36

gp l biu din th bng ma trn k (adjacency matrix) v biu din th bng


danh sch cc nh k (adjacency list).
1. Biu din th bng ma trn k
Ta dng mt mng hai chiu, chng hn mng A, kiu boolean biu din cc nh
k. Nu th c n nh th ta dng mng A kch thc n x n. Gi s cc nh c
nh s 1..n th A[i,j] = true, nu c cnh ni gia hai nh i v j, ngc li A[i,j] =
false. R rng nu th G l th c hng th ma trn k s l ma trn i xng.
Chng hn th I.1b c biu din ma trn k nh sau:

Ta cng c th biu din true l 1 cn false l 0. Vi cch biu din ny th th


hnh I.1a c biu din ma trn k nh sau:

Trn th c nhn th ma trn k c th dng lu tr nhn ca cc cung chng hn


cung gia i v j c nhn a th A[i,j] = a. V d ma trn k ca th hnh I.2 l:

37

y cc cp nh khng c cnh ni th ta trng, nhng trong cc ng dng ta c


th phi gn cho n mt gi tr c bit no phn bit vi cc gi tr c ngha
khc. Chng hn nh trong bi ton tm ng i ngn nht, cc gi tr s nguyn biu
din cho khong cch gia hai thnh ph th cp thnh ph khng c cnh ni ta gn
cho n khong cch bng , cn khong cch t mt nh n chnh n l 0.
Bi tp: Hy vit th tc nhp liu mt ma trn k biu din cho mt th. D liu
u vo l s nh V, s cnh E v cc cnh ni hai nh.
Cch biu din th bng ma trn k cho php kim tra mt cch trc tip hai nh
no c th k nhau khng. Nhng n phi mt thi gian duyt qua ton b mng
xc nh tt c cc cnh trn th. Thi gian ny c lp vi s cnh v s nh ca
th. Ngay c khi s cnh ca th rt nh th ta vn phi dng mt ma trn nxn
lu tr. Do vy, nu ta cn lm vic thng xuyn vi cc cnh ca th th ta c th
phi dng cch biu din khc cho ph hp hn.
2. Biu din th bng danh sch cc nh k.
Trong cch biu din ny, ta s lu tr cc nh k vi mt nh i trong mt danh sch
lin kt theo mt th t no . Nh vy ta cn mt mng HEAD mt chiu c n phn
t biu din cho th c n nh. HEAD[i] l con tr tr ti danh sch cc nh k
vi nh i. V d th hnh I.1a c th biu din nh sau:

Mng HEAD

Bi tp: vit th tc nhp d liu cho th biu din bng danh sch k.
IV. Cc php duyt th (traversals of Graph)
Trong khi gii nhiu bi ton c m hnh ha bng th, ta cn i qua cc nh v
cc cung ca th mt cch c h thng. Vic i qua cc nh ca th mt cch c
h thng nh vy gi l duyt th. C hai php duyt th ph bin l duyt
theo chiu su, v duyt theo chiu rng.
1. Duyt theo chiu su (Depth-first search)
Gi s ta c th G = (V, E) vi cc nh ban u c nh du l cha duyt
(unvisited). T mt nh v no ta bt u duyt nh sau: nh du v duyt, vi
mi nh w cha duyt k vi v, ta thc hin qui qu trnh trn cho w. S d cch
duyt ny c tn l duyt theo chiu su v n s duyt theo mt hng no su
nht c th c. Gii thut duyt theo chiu su mt th c th c trnh by nh
sau, trong ta dng mt mng mark c n phn t nh du cc nh ca th l
duyt hay cha.
38

//nh du cha duyt tt c cc nh


for (v =0; v <n; v++) mark[v]=unvisited;
//duyt theo chiu su t nh nh s 0
for (v = 0; v<n; v++)
if (mark[v] == unvisited)
dfs(v); //duyt theo chiu su nh v
Th tc dfs trong gii thut trn c th c vit nh sau:
void dfs(vertex v) // v thuc [0..n]
{
vertex w;
mark[v]=visited;
for (mi nh w l nh k vi v)
if (mark[w] == unvisited)
dfs(w);
}

Hnh I.3

V d: duyt theo chiu su th trong hnh I.3. Gi s ta bt u duyt t nh A,


tc l dfs(A). Gii thut s nh du A c duyt, ri chn nh u tin trong
danh sch cc nh k vi A, l G. Tip tc duyt G, G c hai nh k l B v C,
theo th t th nh k tip c duyt l nh B. B c mt nh k l A, nhng A
c nh du duyt nn php duyt dfs(B) hon tt. By gi gii thut s
tip tc vi nh k vi G m cn cha duyt l C. C khng c nh k nn php duyt
dfs(C) kt thc vy dfs(A) cng kt thc. Cn li 3 nh cha c duyt l D, E, F.
V d duyt theo chiu su th hnh I.4 bt u t nh A: duyt A, A c cc nh
k l B, C, D, theo t t th B uc duyt. B c mt nh k cha c duyt l F,
nn F c duyt. F c cc nh k cha c duyt l D, G, theo th t th ta
duyt D. D c cc nh k cha c duyt l C, E, G, theo th t th C c
duyt. Cc nh k vi C u c duyt nn gii thut tip tc vi E. E c mt
nh k cha duyt l G, vy ta duyt G. Lc ny tt c cc node u c duyt
xong. Vy th t nh c duyt l ABFDCEG.
39

Hnh I.4

2. Duyt theo chiu rng (breadth-first search)


Gi s ta c th G vi cc nh ban u c nh du l cha duyt (unvisited).
T mt nh v no ta bt u duyt nh sau: nh du v c duyt, k n l
duyt tt c cc nh k vi v. Khi ta duyt mt nh v ri n nh w th cc nh k
ca v c duyt trc cc nh k ca w, v vy ta dng mt hng i lu tr cc
node theo th t c duyt c th duyt cc nh k vi chng. Ta cng dng
mng mt chiu mark nh du mt node duyt hay cha, tng t nh duyt
theo chiu su. Gii thut duyt theo chiu rng c vit nh sau:
//nh du cha duyt tt c cc nh
for (v = 0; v<n; v++) mark[v] = unvisited;
//n l s nh ca th
//duyt theo chiu rng t nh nh s 0
for (v = 0; v<n; v++)
if (mark[v] == unvisited)
bfs(v);
Th tc bfs vit nh sau:
void bfs(vertex v) // v thuoc [1..n]
{
QUEUE of vertex Q;
vertex x,y;
mark[v] = visited;
ENQUEUE(v,Q); //push cac dinh ke voi v vao Q
while !(EMPTY_QUEUE(Q))
{
x = Pop(Q); //ly x ra khoi Q
for (mi nh y k vi x)
{
if (mark[y-1] == unvisited)
40

{
mark[y-1] = visited; {duyt y}
ENQUEUE(y,Q);
}
}
}
}
V d duyt theo chiu rng th hnh I.3. Gi s bt u duyt t A. A ch c mt
nh k G, nn ta duyt G. K n duyt tt c cc nh k vi G, l B, C. Sau
duyt tt c cc nh k vi B, C theo th t . Cc nh k vi B, C c duyt,
nn ta tip tc duyt cc nh cha c duyt. Cc nh cha c duyt l D, E, F.
Duyt D, k n duyt E, cui cng duyt F. Vy th t cc nh c duyt l:
AGBCDFE.
V d duyt theo chiu rng th hnh I.4. Gi s bt u duyt t A. Duyt A, k
n duyt tt c cc nh k vi A, l B, C, D theo th t . K tip duyt cc nh
k ca B, C, D theo th t . Vy cc node c duyt tip theo l F, E, G. C th
minh ha hot ng ca hng i trong php duyt trn nh sau:
Duyt A c ngha l nh du visited v a n vo hng i:

K n duyt tt c cc nh k vi nh u hng m cha c duyt, tc l ta loi


A khi hng i, duyt B, C, D v a chng vo hng i, by gi hng i cha cc
nh B, C, D.

K n ly B ra khi hng i v cc nh k vi B m cha c duyt, l F, s


c duyt, F c y vo hng i.

41

K n th C c ly ra khi hng i v cc nh k vi C m cha c duyt s


c duyt. Khng c nh no nh vy, nn bc ny khng thm nh no c
duyt.

K n th D c ly ra khi hng i v duyt cc nh k cha duyt ca D, tc l


E, G c duyt. E, G c a vo hng i.

Tip tc, F c ly ra khi hng i. Khng c nh no k vi F m cha c


duyt. Vy khng duyt thm nh no.

42

Tng t nh F, E ri n G c ly ra khi hng. Hng tr thnh rng v thut gii


kt thc.
V. Mt s bi ton trn th
Phn ny s gii thiu vi mt s bi ton quan trng trn th, nh bi ton tm
ng i ngn nht, bi ton tm bao ng chuyn tip, cy bao trm ti thiu
1. Bi ton tm ng i ngn nht t mt nh ca th
Cho th G vi tp cc nh V v tp cc cnh E ( th c hng hoc v hng).
Mi cnh ca th c mt nhn, l mt gi tr khng m, nhn ny cn gi l gi
(cost) ca cnh. Cho trc mt nh v xc nh, gi l nh ngun. Vn l tm
ng i ngn nht t v n cc nh cn li ca G, tc l cc ng i t v n cc
nh cn li vi tng cc gi (cost) ca cc cnh trn ng i l nh nht. Ch rng
nu th c hng th ng i ny l c hng.
Ta c th gii bi ton ny bng cch xc nh mt tp hp S cha cc nh m
khong cch ngn nht t n n ngun v bit. Khi u S = {v}, sau mi bc
ta s thm vo S cc nh m khong cch t n n v l ngn nht. Vi gi thit mi
cung c mt gi tr khng m th ta lun lun tm c mt ng i ngn nht nh
vy m ch i qua cc nh tn ti trong S. chi tit ha thut gii, gi s G c n
nh v nhn trn mi cung c lu trong mng hai chiu C, tc C[i,j] l gi (c th
xem nh di) ca cung (i,j), nu i, j khng ni nhau th C[i,j] = (VC). Ta dng
mng mt chiu L c n phn t lu di ca ng i ngn nht t mi nh ca
th n v. Khi u khong cch ny chnh l di cnh (v, i), tc l L[i] = C[v,i].
Ti mi bc ca gii thut th L[i] s c cp nht li lu di ng i ngn
nht t nh v n nh i, ng i ny ch i qua cc nh c trong S.
Di y l m t gii thut Dijkstra gii bi ton trn.
K hiu:
L(v): ch nhn ca nh v, tc l cn trn ca chiu di ng i ngn nht
t s0 n v.
d(s0, v): chiu di ng i ngn nht t s0 n v.
m(s, v): trong s ca cnh (s,v).
M t
Input: G, s0
Output: d(s0, v), vi mi v khc s0
43

Khi ng:
L(v) = , v s0; //nhn tm thi
S = Rng;
Bc 0
d(s0, s0) = L(s0) = 0;
S = {s0}; //s0 c nhn chnh thc
Bc 1
-

Tnh li nhn tm thi L(v), vi v S


Nu v k vi s0 th
L(v) = Min{L(v), L(s0) + m(s0, v)};

Tm s1 S v k vi s0 sao cho:
L(s1) = Min{L(v): v S}; // khi d(s0, s1) = L(s1)

S = S {s1}; //S = {s0, s1}, s1 c nhn chnh thc

Bc 2
-

Tnh li nhn tm thi L(v), vi v S


Nu v k vi s1 th
L(v) = Min{L(v), L(s1) + m(s1, v)};

Tm s2 S v k vi s1 sao cho:
L(s2) = Min{L(v): v S}; // khi d(s0, s2) = L(s2)

Nu L(s2) = Min{L(sj), L(sj)+m(sj, s2)} th ng i t s0 n s2 qua sj l b


nht, v sj l nh k trc s2
-

S = S {s2}; //S = {s0, s1, s2}, s2 c nhn chnh thc

...
Bc i
-

Tnh li nhn tm thi L(v), vi v S


Nu v k vi si-1 th
L(v) = Min{L(v), L(si-1) + m(si-1, v)};

Tm si S v k vi sj, j [0,i-1] sao cho:


L(si) = Min{L(v): v S}; // khi d(s0, si) = L(si)

Nu L(si) = Min{L(sj), L(sj)+m(sj, si)} th ng i t s0 n si qua sj l b


nht, v sj l nh k trc si
-

S = S {s2}; //S = {s0, s1, s2...si}, si c nhn chnh thc


44

Ci t thut ton Dijkstra


ci t thut gii d dng, ta gi s cc nh ca th c nh s t 1 n n, tc
l V = {1,..,n} v nh ngun l 1. Nu mun lu tr li cc nh trn ng i ngn
nht c th xy dng li ng i ny t nh ngun n cc nh khc, ta dng
mt mng ddnn. Mng ny s lu ddnn[u] = w vi u l nh trc nh w trong
ng i.
void Dijkstra(int v)
{
int dnnn[Max];//mng cha ng i ngn nht
int i, k, min, dht; //dht: nh hin ti
int DX[Max]; //nh du cc nh a vo S
int L[Max]; //L[i] cha chi ph ti nh i
for (i =1; i<=n; i++)
{
DX[i] = 0;
L[i] = VC; //VC: v cng
}
DX[v] = 1;
L[v] = 0;
dht = v;
int h = 1;
while(h<n-1)
{
min = CV;
for(int i=1; i<=n; i++)
{
if(DX[i] == 0)
{
if(L[dht] + C[dht][i] < L[i]) //tnh li nhn
{
L[i] = L[dht] + C[dht][i];
dnnn[i] = dht; // gn nh hin ti bng nh
trc i trn l trnh
45

}
if(L[i] < min) // chn nh k
{
min = L[i];
k = i;
}
}
//Ti mi bc lp h, tm c ng i ngn nht t s
//n k
Xuatddnn(v,k, ddnn);
cout<<\nTrong so: << L[k];
dht = k; // khi ng li dht
DX[dht] = 1; //a nt k vo tp nt xt
h++;
}
}
}
V d: p dng thut gii Dijkstra cho th hnh I.5

Hnh I.5
Kt qu khi p dng gii thut
Ln lp

L[2]

L[3]

L[4]

L[5]

Khi u

{1}

10

30

100

(1)

(1)

(1)
1

{1,2}

10

60

30

100

(1)

(2)

(1)

(1)

46

{1,2,4}

{1,2,3,4}

{1,2,3,4,5}

10

40

30

90

(1)

(4)

(1)

(4)

10

40

30

50

(1)

(4)

(1)

(3)

10

40

30

50

(1)

(4)

(1)

(3)

Mng ddnn c gi tr nh sau:

T kt qu trn ta c th suy ra rng ng i ngn nht t nh 1 n nh 3 l


143 c di l 40. ng i ngn nht t 1 n 5 l 1435 c di l
50.
Bi tp:
1. Vit th tc xut ng i Xuatdnnn(int v, int k, int ddnn[max]).
2. Ci t thut gii Dijkstra.
2. Bi ton tm bao ng chuyn tip.
Trong mt s trng hp ta ch cn xc nh c hay khng mt ng i ni gia hai
nh i,j bt k. By gi khong cch gia i, j l khng quan trng m ta ch cn bit i,j
c ni vi nhau bi mt cnh, ngc li C[i,j]=0 (c ngha l false). Lc ny mng
A[i,j] khng cho khong cch ngn nht gia i, j m n cho bit l c ng i t i
n j hay khng. A gi l bao ng chuyn tip trong th G c biu din ma trn k
l C. Gii thut tm bao ng chuyn tip hay cn gi gii thut Warshall.
int A[n,n], C[n,n]; //A l bao ng chuyn tip, C l ma trn k
void Warshall()
{
int i,j,k;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
A[i-1,j-1] = C[i-1,j-1];
for (k=1; k<=n; k++)
for (i=1; i<=n; i++)
if(A[i,k] != 0)
for (j=1; j<=n; j++)
47

if(A[k][j])
A[i,j] = 1;
}
3. Bi ton tm cy bao trm ti thiu (minimum-cost spanning tree)
Gi s ta c mt th v hng G = (V, E). th G gi l lin thng nu tn ti
ng i gia hai nh bt k. Bi ton tm cy bao trm ti thiu (hoc cy ph ti
thiu) l tm mt tp hp T cha cc cnh ca mt th lin thng C sao cho V cng
vi tp cc cnh ny cng l mt th lin thng, tc l (V, T) l mt th lin
thng. Hn na tng di ca cc cnh trong T l nh nht. Mt th hin ca bi
ton ny trong thc t l bi ton thit lp mng truyn thng, cc nh l cc
thnh ph cn cc cnh ca cy bao trm l ng ni mng gia cc thnh ph.
Gi s G c n nh c nh s t 1..n. Gii thut Prim gii bi ton ny nh sau:
tng
-

Bt u, tp khi to l U bng 1 nh no , nh 1 chng hn, U = {1}, T =


U.

Sau ta lp li cho n khi U = V, ti mi bc lp ta chn cnh nh nht


(u,v) sao cho u U, v V-U. Thm v vo U v (u, v) vo T. Khi thut gii kt
thc th (U,T) l mt cy ph ti tiu.

M t thut ton
Input: G=(V,E)
Output: T = (V, ?) l nh nht.
Khi ng:
-

U V

T = (U,.) = Rng; // th rng

U = {1};

Trong khi (U V)
Tm cnh (u,v) c trng s nh nht vi u U, v V. Thm nh v ny vo U,
thm (u,v) vo T
Ci t
tin hnh ci t thut ton, ta cn m t d liu. th c trng s c biu
din thnh mt ma trn k C[n,n].
Khi tm cnh c trng s nh nht ni mt nh trong U v mt nh ngoi U ti
mi bc, ta dng hai mng lu tr:
-

Mng closest[], vi i V\U th closest[i] U l nh k gn i nht.

Mng lowcost[i] lu trng s ca cnh (i, closest[i])


48

Mng daxet nh u nh c xt cha

Ti mi bc ta duyt mng lowcost tm nh closest[k] U sao cho trng s


(k, closest[k]) = lowcost[k] l nh nht. Khi tm c, ta in cnh (closest[k],k), cp
nht vo cc mng closest v lowcost, v c k thm vo U. Khi ta tm c mt
nh k cho cy bao trm, ta cho daxet[k] = DX l nh du xt.
#define VC 10000 //nh ngha gi tr v cng
#define DX 1 //nh ngha gi tr khi nh c xt
...
void Prim(MaTranKe C)
{
double lowcost[Max];
int closest[Max];
int daxet[Max];
int i,j,k,Min;
//bt u t nh s 1
for(i=2; i<=n; i++)
{
lowcost[i] = C[1][i];
closest[i] = 1;
daxet[i] = 0;
}
for(i=2; i<=n; i++)
{
Min = lowcost[2];
k = 2;
for(j=3; j<=n; j++)
{
if(!daxet[j] && lowcost[j] < Min)
{
Min = lowcost[j];
k = j;
}
}
49

daxet[k] = DX;
//Khi ng li chosest[], lowcost[]
for(j=2; j<=n; j++)
if(c[k][j]<lowcost[j] && !daxet[j])
{
lowcost[j] = c[k][j];
closest[j] = k
}
}
}
V d: p dng gii thut Prim tm cy bao trm ti thiu ca th lin thng hnh
I.6

Ma trn k:
1

VC

VC

VC

VC

VC

VC

VC

VC

VC

VC

Khi to
Mng lowcost
2

VC

VC

Mng closest
50

Mng daxet

Bc 1: tm c Min = 1, k = 3, mng lowcost v closest cp nht nh sau:


Mng lowcost
2

Mng closest

Mng daxet

Bc 2: tm c Min = 4, k = 6
Mng lowcost
2

Mng closest

Mng daxet

Bc 3: tm c Min = 2, k = 4
Mng lowcost
51

Mng closest

Mng daxet

Bc 4: tm c Min = 5, k = 2

Mng lowcost
2

Mng closest

Mng daxet

Bc 5: tm Min = 3, k = 5
Mng lowcost
2

Mng closest

Mng daxet
2

52

Bi tp
1. Vit biu din th I.7 bng:
-

Ma trn k.

Danh sch cc nh k.

2. Duyt th hnh I.7 (xt cc nh theo th t a,b,c...)


-

Theo chiu rng bt u t a.

Theo chiu su bt u t f

3. p dng gii thut Dijkstra cho th hnh I.7, vi nh ngun l a


4. Vit biu din th I.8 bng:

Ma trn k.

Danh sch cc nh k.

5. Duyt th hnh I.8 (xt cc nh theo th t A,B,C...)


-

Theo chiu rng bt u t A.

Theo chiu su bt u t B.

6. p dng gii thut Dijkstra cho th hnh I.8, vi nh ngun l A.


7. Tm cy bao trm ti thiu ca th hnh I.8 bng gii thut Prim.
8. Ci t th c hng bng ma trn k ri vit cc gii thut:
-

Duyt theo chiu rng.


53

Duyt theo chiu su.

Tm ng i ngn nht t mt nh cho trc (Dijkstra).

9. Ci t th c hng bng danh sch cc nh k ri vit cc gii thut duyt theo


chiu rng.

54

Chng III

Bng Bm
Mc tiu
Trong chng ny, chng ta s nghin cu bng bm. Bng bm l cu trc d liu
c s dng ci t KDL t in. Nh li rng, KDL t in l mt tp cc i
tng d liu c xem xt n ch vi ba php ton tm kim, xen vo v loi b.
ng nhin l chng ta c th ci t t in bi danh sch, hoc bi cy tm kim
nh phn. Tuy nhin bng bm l mt trong cc phng tin hiu qu nht ci t
t in.
Kin thc c bn cn thit
hc tt chng ny sinh vin cn phi nm vng k nng lp trnh c bn nh:
-

Cu trc mng, danh sch

Cc cu trc iu khin, lnh vng lp.

Lp trnh hm, th tc, cch gi hm.

Ni dung
Trong chng ny, chng ta s cp ti cc vn sau y:
-

Phng php bm v hm bm.

Cc chin lc gii quyt s va chm.

Ci t KDL t in bi bng bm.

I. Phng php bm
Vn c t ra l, chng ta c mt tp d liu, chng ta cn a ra mt cu trc
d liu (CTDL) ci t tp d liu ny sao cho cc php ton tm kim, xen, loi c
thc hin hiu qu. Trong cc chng trc, chng ta trnh by cc phng php
ci t KDL tp ng (t in l trng hp ring ca tp ng khi m chng ta ch
quan tm ti ba php ton tm kim, xen, loi). Sau y chng ta trnh by mt k
thut mi lu gi mt tp d liu, l phng php bm.
Nu nh cc gi tr kho ca cc d liu l s nguyn khng m v nm trong khong
[0..SIZE-1], chng ta c th s dng mt mng data c c SIZE lu tp d liu .
D liu c kho l k s c lu trong thnh phn data[k] ca mng. Bi v mng cho
php ta truy cp trc tip ti tng thnh phn ca mng theo ch s, do cc php
ton tm kim, xen, loi c thc hin trong thi gian O(1). Song ng tic l, kho
c th khng phi l s nguyn, thng thng kho cn c th l s thc, l k t hoc
xu k t. Ngay c kho l s nguyn, th cc gi tr kho ni chung khng chy trong
khong [0..SIZE-1].
Trong trng hp tng qut, khi kho khng phi l cc s nguyn trong khong
[0..SIZE-1], chng ta cng mong mun lu tp d liu bi mng, li dng tnh u
vit cho php truy cp trc tip ca mng. Gi s chng ta mun lu tp d liu trong
mng T vi c l SIZE. lm c iu , vi mi d liu chng ta cn nh v
55

c v tr trong mng ti d liu c lu gi. Nu chng ta a ra c cch tnh


ch s mng ti lu d liu th chng ta c th lu tp d liu trong mng theo s
Hnh III.1.

Hnh III.1. Lc phng php bm.


Trong lc Hnh III.1, khi cho mt d liu c kho l k, nu tnh a ch theo k ta
thu c ch s i, 0 <= i <= SIZE-1, th d liu s c lu trong thnh phn mng
T[i].
Mt hm ng vi mi gi tr kho ca d liu vi mt a ch (ch s) ca d liu
trong mng c gi l hm bm (hash function). Phng php lu tp d liu theo
lc trn c gi l phng php bm (hashing). Trong lc II.1, mng T
c gi l bng bm (hash table).
Nh vy, hm bm l mt nh x h t tp cc gi tr kho ca d liu vo tp cc s
nguyn {0,1,, SIZE-1}, trong SIZE l c ca mng dng lu tp d liu, tc
l:
h : K {0,1,,SIZE-1}
vi K l tp cc gi tr kho. Cho mt d liu c kho l k, th h(k) c gi l gi tr
bm ca kho k, v d liu c lu trong T[h(k)].
Nu hm bm cho php ng cc gi tr kho khc nhau vi cc ch s khc nhau, tc
l nu k1 k2 th h(k1) h(k2), v vic tnh ch s h(k) ng vi mi kho k ch i
hi thi gian hng, th cc php ton tm kim, xen, loi cng ch cn thi gian O(1).
Tuy nhin, trong thc t mt hm bm c th nh x hai hay nhiu gi tr kho ti
cng mt ch s no . iu c ngha l chng ta phi lu cc d liu trong
cng mt thnh phn mng, m mi thnh phn mng ch cho php lu mt d liu !
Hin tng ny c gi l s va chm (collision). Vn t ra l, gii quyt s va
chm nh th no? Chng hn, gi s d liu d1 vi kho k1 c lu trong T[i], i =
h(k1); by gi chng ta cn xen vo d liu d2 vi kho k2, nu h(k2) = i th d liu d2
cn c t vo v tr no trong mng?
Nh vy, mt hm bm nh th no th c xem l tt. T nhng iu nu trn,
chng ta a ra cc tiu chun thit k mt hm bm tt nh sau:
56

1. Tnh c d dng v nhanh a ch ng vi mi kho.


2. m bo t xy ra va chm.
II. Cc hm bm
Trong cc hm bm c a ra di y, chng ta s k hiu k l mt gi tr kho
bt k v SIZE l c ca bng bm. Trc ht chng ta s xt trng hp cc gi tr
kho l cc s nguyn khng m. Nu khng phi l trng hp ny (chng hn, khi
cc gi tr kho l cc xu k t), chng ta ch cn chuyn i cc gi tr kho thnh
cc s nguyn khng m, sau bm chng bng mt phng php cho trng hp
kho l s nguyn.
C nhiu phng php thit k hm bm c xut, nhng c s dng nhiu
nht trong thc t l cc phng php c trnh by sau y:
1. Phng php chia
Phng php ny n gin l ly phn d ca php chia kho k cho c bng bm
SIZE lm gi tr bm: h(k) = k mod SIZE
Bng cch ny, gi tr bm h(k) l mt trong cc s 0,1,, SIZE-1. Hm bm ny
c ci t trong C++ nh sau:
unsigned int hash(int k, int SIZE)
{
return k % SIZE;
}
Trong phng php ny, bm mt kho k ch cn mt php chia, nhng hn ch c
bn ca phng php ny l hn ch xy ra va chm, chng ta cn phi bit cch
la chn c ca bng bm. Cc phn tch l thuyt ch ra rng, hn ch va chm,
khi s dng phng php bm ny chng ta nn la chn SIZE l s nguyn t, tt
hn l s nguyn t c dng c bit, chng hn c dng 4k+3. V d, c th chn
SIZE = 811, v 811 l s nguyn t v 811 = 4 . 202 + 3.
2. Phng php nhn
Phng php chia c u im l rt n gin v d dng tnh c gi tr bm, song
i vi s va chm n li rt nhy cm vi c ca bng bm. hn ch s va chm,
chng ta c th s dng phng php nhn, phng php ny c u im l t ph
thuc vo c ca bng bm.
Phng php nhn tnh gi tr bm ca kho k nh sau. u tin, ta tnh tch ca kho
k vi mt hng s thc , 0 < <1. Sau ly phn thp phn ca tch k nhn vi
SIZE, phn nguyn ca tch ny c ly lm gi tr bm ca kho k. Tc l:
(K hiu

ch phn nguyn ca s thc x, tc l s nguyn ln nht <=x, chng hn


)
57

Ch rng, phn thp phn ca tch k, tc l k - k , l s thc dng nh hn


1. Do tch ca phn thp phn vi SIZE l s dng nh hn SIZE. T , gi tr
bm h(k) l mt trong cc s nguyn 0,1,, SIZE- 1.
c th phn phi u cc gi tr kho vo cc v tr trong bng bm, trong thc t
ngi ta thng chn hng s nh sau:
Chng hn, nu c bng bm l SIZE = 1024 v hng s c chn nh trn, th
vi k = 1849970, ta c:
3. Hm bm cho cc gi tr kho l xu k t
bm cc xu k t, trc ht chng ta chuyn i cc xu k t thnh cc s
nguyn. Cc k t trong bng m ASCII gm 128 k t c nh s t 0 n 127, o
mt xu k t c th xem nh mt s trong h m c s 128. p dng phng
php chuyn i mt s trong h m bt k sang mt s trong h m c s 10,
chng ta s chuyn i c mt xu k tthnh mt s nguyn. Chng hn, xu
NOTE c chuyn thnh mt s nguyn nh sau:
NOTE N.1283 + O.1282 + T.128 + E =
78.1283 + 79.1282 + 84.128 + 69
Vn ny sinh vi cch chuyn i ny l, chng ta cn tnh cc lu tha ca 128,
vi cc xu k t tng i di, kt qu nhn c s l mt s nguyn cc ln vt
qu kh nng biu din ca my tnh.
Trong thc t, thng thng mt xu k t c to thnh t 26 ch ci v 10 ch s,
v mt vi k t khc. Do chng ta thay 128 bi 37 v tnh s nguyn ng vi xu
k t theo lut Horner. Chng hn, s nguyn ng vi xu k t NOTE c tnh
nh sau:
NOTE 78.373 + 79.372 + 84.37 + 69 =
((78.37 + 79).37 +84).37 +69
Sau khi chuyn i xu k t thnh s nguynbng phng php trn, chng ta s p
dng phng php chia tnh gi tr bm. Hm bm cc xu k t c ci t nh
sau:
unsigned int hash(const string &k, int SIZE)
{
unsigned int value = 0;
for (int i=0; i< k.length(); i++)
value = 37 * value + k[i];
return value % SIZE;
}
58

III. Cc phng php gii quyt va chm


Trong mc II.2 chng ta trnh by cc phng php thit k hm bm nhm hn
ch xy ra va chm. Tuy nhin trong cc ng dng, s va chm l khng trnh khi.
Chng ta s thy rng, cch gii quyt va chm nh hng trc tip n hiu qu ca
cc php ton t in trn bng bm. Trong mc ny chng ta s trnh by hai phng
php gii quyt va chm. Trong phng php th nht, mi khi xy ra va chm, chng
ta tin hnh thm d tm mt v tr cn trng trong bng v t d liu mi vo .
Mt phng php khc l, chng ta to ra mt cu trc d liu lu gi tt c cc d
liu c bm vo cng mt v tr trong bng v gn cu trc d liu ny vo v tr
trong bng.
1. Phng php nh a ch m
Trong phng php ny, cc d liu c lu trong cc thnh phn ca mng, mi
thnh phn ch cha c mt d liu. V th, mi khi cn xen mt d liu mi vi
kho k vo mng, nhng ti v tr h(k) cha d liu, chng ta s tin hnh thm d
mt s v tr khc trong mng tm ra mt v tr cn trng v t d liu mi vo v
tr . Phng php tin hnh thm d pht hin ra v tr trng c gi l phng
php nh a ch m (open addressing).
Gi s v tr m hm bm xc nh ng vi kho k l i, i=h(k). T v tr ny chng ta
ln lt xem xt cc v tr i0 , i1 , i2 ,, im ,
Trong i0 = i, im(m=0,1,2,) l v tr thm d ln th m. Dy cc v tr ny s
c gi l dy thm d. Vn t ra l, xc nh dy thm d nh th no? Sau y
chng ta s trnh by mt s phng php thm d v phn tch u khuyt im ca
mi phng php.
Thm d tuyn tnh.
y l phng php thm d n gin v d ci t nht. Vi kho k, gi s v tr
c xc nh bi hm bm l i=h(k), khi dy thm d l i , i+1, i+2 ,
Nh vy thm d tuyn tnh c ngha l chng ta xem xt cc v tr tip lin nhau k t
v tr ban u c xc nh bi hm bm. Khi cn xen vo mt d liu mi vi kho
k, nu v tr i = h(k) b chim th ta tmn cc v tr i lin sau , gp v tr cn
trng th t d liu mi vo .
V d. Gi s c ca mng SIZE = 11. Ban u mng T rng, v ta cn xen ln lt
cc d liu vi kho l 388, 130, 13, 14, 926 vo mng. Bm kho 388, h(388) = 3, v
vy 388 c t vo T[3]; h(130) = 9, t 130 vo T[9]; h(13) = 2, t 13 trong T[2].
Xt tip d liu vi kho 14, h(14) = 3, xy ra va chm (v T[3] b chim bi 388),
ta tm n v tr tip theo l 4, v tr ny trng v 14 c t vo T[4]. Tng t, khi
xen vo 926 cng xy ra va chm, h(926) = 2, tm n cc v tr tip theo 3, 4, 5 v 92
c t vo T[5]. Kt qu l chng ta nhn c mng T nh trong Hnh III.2.

59

Hnh III.2. Bng bm sau khi xen vo cc d liu 38, 130, 13, 14 v 926
By gi chng ta xt xem, nu lu tp d liu trong mng bng phng php nh a
ch m th cc php ton tm kim, xen, loi c tin hnh nh th no. Cc k thut
tm kim, xen, loi c trnh by di y c th s dng cho bt k phng php
thm d no. Trc ht cn lu rng, tm, xen, loi chng ta phi s dng cng
mt phng php thm d, chng hn thm d tuyn tnh. Gi s chng ta cn tm d
liu vi kho l k. u tin cn bm kho k, gi s h(k)=i. Nu trong bng ta cha mt
ln no thc hin php ton loi, th chng ta xem xt cc d liu cha trong mng ti
v tr i v cc v tr tip theo trong dy thm d, chng ta s phthin ra d liu cn tm
ti mt v tr no trong dy thm d, hoc nu gp mt v tr trng trong dy thm
d th c th dng li v kt lun d liu cn tm khng c trong mng. Chng hn
chng ta mun tm xem mng trong Hnh III.2 c cha d liu vi kho l 47? Bi v
h(47) = 3, v d liu c lu theo phng php thm d tuyn tnh, nn chng ta ln
lt xem xt cc v tr 3, 4, 5. Cc v tr ny u cha d liu khc vi 47. n v tr 6,
mng trng. Vy ta kt lun 47 khng c trong mng.
loi d liu vi kho k, trc ht chng ta cn p dng th tc tm kim trnh
by trn nh v d liu trong mng. Gi s d liu c lu trong mng ti v
tr p. Loi d liu v tr p bng cch no? Nu t v tr p l v tr trng, th khi tm
kim nu thm d gp v tr trng ta khng th dng v a ra kt lun d liu khng
c trong mng. Chng hn, trong mng Hnh III.2, ta loi d liu 388 bng cch xem
v tr 3 l trng, sau ta tm d liu 926, v h (926) = 2 v T[2] khng cha 926,
tmn v tr 3 l trng, nhng ta khng th kt lun 926 khng c trong mng. Thc
t 926 v tr 5, v lc a 926 vo mng cc v tr 2, 3, 4 b chim. V vy m
bo th tc tm kim trnh by trn vn cn ng cho trng hp thc hin
php ton loi, khi loi d liu v tr p chng ta t v tr p l v tr loi b. Nh
vy, chng ta quan nim mi v tr i trong mng (0 <= i <= SIZE-1) c th l v tr
trng (EMPTY), v tr loi b (DELETED), hoc v tr cha d liu (ACTIVE).
ng nhin l khi xen vo d liu mi, chng ta c th t n vo v tr loi b.
Vic xen vo mng mt d liu mi c tin hnh bng cch ln lt xem xt cc v
tr trong dy thm d ng vi mi kho ca d liu, khi gp mt v tr trng hoc v tr
c loi b th t d liu vo .
Sau y l hm thm d tuyn tnh
int

Probing (int i, int m, int SIZE)

// SIZE l c ca mng
// i l v tr ban u c xc nh bi bm kho k, i = h(k)
// hm tr v v tr thm d ln th m= 0, 1, 2,
{
60

return (i+ m) % SIZE;


}
Phng php thm d tuyn tnh c u im l cho php ta xem xt tt c cc v tr
trong mng, v do php ton xen vo lun lun thc hin c, tr khi mng y.
Song nhc im ca phng php ny l cc d liu tp trung thnh tng on, trong
qu trnh xen cc d liu mi vo, cc on c th gp thnh on di hn. iu
lm cho cc php ton km hiu qu, chng hn nu i = h(k) u mt on, tm
d liu vi kho k chng ta cn xem xt c mt on di.
Thm d bnh phng
khc phc tnh trng d liu tch t thnh tng cm trong phng php thm d
tuyn tnh, chng ta khng thm d cc v tr k tip lin nhau, m thm d b ch
theo mt quy lut no .
Trong thm d bnh phng, nu v tr ng vi kho k l i = h(k), th dy thm d l
i , i+ 12 , i+ 22 , , i+ m2 ,
V d. Nu c ca mng SIZE = 11, v i = h(k) = 3, th thm d bnh phng cho php
ta tmn cc a ch 3, 4, 7, 1, 8 v 6.
Phng php thm d bnh phng trnh c s tch t d liu thnh tng on v
trnh c s tm kim tun t trong cc on. Tuy nhin nhc im ca n l khng
cho php ta tm n tt c cc v tr trong mng, chng hn trong v d trn, trong s
11 v tr t 0, 1, 2, , 10, ta ch tm n cc v tr 3, 4, 7, 1, 8 v 6. Hu qu ca iu
l, php ton xen vo c th khng thc hin c, mc du trong mng vn cn
cc v tr khng cha d.
Bm kp
Phng php bm kp (double hashing) c u im nh thm d bnh phng l hn
ch c s tch t d liu thnh cm; ngoi ra nu chng ta chn c ca mng l s
nguyn t, th bm kp cn cho php ta thm d ti tt c cc v tr trong mng.
Trong thm d tuyn tnh hoc thm d bnh phng, cc v tr thm d cch v tr
xut pht mt khong cch hon ton xc nh trc v cc khong cch ny khng
ph thuc vo kho. Trong bm kp, chng ta s dng hai hm bm h1 v h2:
-

Hm bm h1 ng vai tr nh hm bm h trong cc phng php trc, n xc


nh v tr thm d u tin.

Hm bm h2 xc nh bc thm d.

iu c ngha l, ng vi mi kho k, dy thm d l:


h1(k) + m h2(k), vi m= 0, 1, 2,
Bi v h2(k) l bc thm d, nn hm bm h2 phi tho mn iu kin h2(k) 0 vi
mi k.

61

C th chng minh c rng, nu c ca mng v bc thm d h2(k) nguyn t


cng nhau th phng php bm kp cho php ta tm n tt c cc v tr trong mng.
Khng nh trn s ng nu chng ta la chn c ca mng l s nguyn t.
V d. Gi s SIZE = 11, v cc hm bm c xc nh nh sau:
h1(k) = k % 11
h2(k) = 1 + (k % 7)
vi k = 58, th bc thm d l h2(58) = 1 + 2 = 3, do dy thm d l: h1(58) = 3, 6,
9, 1, 4, 7, 10, 2, 5, 8, 0. cn vi k = 36, th bc thm d l h2(36) = 1 + 1 = 2, v dy
thm d l 3, 5, 7, 9, 0, 2, 4, 6, 8, 10.
Trong cc ng dng, chng ta c th chn c mng SIZE l s nguyn t v chn M l
s nguyn t, M < SIZE, ri s dng cc hm bm
h1(k) = k % SIZE
h2(k) = 1 + (k % M)
2. Phng php to dy chuyn
Mt cch tip cn khc gii quyt s va chm l chng ta to mt cu trc d liu
lu tt c cc d liu c bm vo cng mt v tr trong mng. Cu trc d liu
thch hp nht l danh sch lin kt (dy chuyn). Khi mi thnh phn trong bng
bm T[i], vi i = 0, 1, , SIZE 1, s cha con tr tr ti u mt DSLK. Cch gii
quyt va chm nh trn c gi l phng php to dy chuyn (separated chaining).
Lc lu tp d liu trong bng bm s dng phng php to dy chuyn c
m t trong Hnh III.3.

Hnh III.3. Phng php to dy chuyn


u im ca phng php gii quyt va chm ny l s d liu c lu khng ph
thuc vo c ca mng, n ch hn ch bi b nh cp pht ng cho cc dy chuyn.
By gi chng ta xt xem cc php ton t in (tm kim, xen, loi) c thc hin
nh th no. Cc php ton c thc hin rt d dng, xen vo bng bm d liu
kho k, chng ta ch cn xen d liu ny vo u DSLK c tr ti bi con tr
T[h(k)]. Php ton xen vo ch i hi thi gian O(1), nu thi gian tnh gi tr bm
h(k) l O(1). Vic tm kim hoc loi b mt d liu vi kho k c quy v tm kim
hoc loi b trn DSLK T[h(k)]. Thi gian tm kim hoc loi b ng nhin l ph
thuc vo di ca DSLK.
Chng ta c nhn xt rng, d gii quyt va chm bng cch thm d, hay gii quyt
va chm bng cch to dy chuyn, th bng bm u khng thun tin cho s thc
62

hin cc php ton tp ng khc, chng hn php ton Min (tm d liu c kho nh
nht), php ton DeleteMin (loi d liu c kho nh nht), hoc php duyt d liu.
Sau ny chng ta s gi bng bm vi gii quyt va chm bng phng php nh a
ch m l bng bm a ch m, cn bng bm gii quyt va chm bng cch to dy
chuyn l bng bm dy chuyn.
IV. Ci t bng bm a ch m
Trong mc ny chng ta s nghin cu s ci t KDL t in bi bng bm a ch
m. Chng ta s gi thit rng, cc d liu trong t in c kiu Item no , v chng
cha mt trng dng lm kho tm kim (trng key), cc gi tr kho c kiu int.
Ngoi ra n gin cho vit ta gi thit rng, c th truy cp trc tip trng key.
Nh tho lun trong mc III.1, trong bng bm T, mi thnh phn T[i], 0 <= i <=
SIZE -1, s cha hai bin: bin data lu d liu v bin state lu trng thi ca
v tr i, trng thi ca v tr i c th l rng (EMPTY), c th cha d liu (ACTIVE),
hoc c th loi b (DELETED). Chng ta s ci t KDL bi lp OpenHash ph
thuc tham bin kiu Item, lp ny s dng mt hm bm Hash v mt hm thm d
Probing c cung cp. Lp OpenHash c khai bo nh sau:
const int SIZE = 811;
enum stateType {ACTIVE, EMPTY, DELETED};
struct

Entry

{
int

data;

stateType state;
}
Entry T[SIZE];
OpenHash(); // khi to bng bm rng.
bool

Search(int k, Item & I) const;


// Tm d liu c kho l k.
// Hm tr v true (false) nu tm thy (khng tm thy).
// Nu tm kim thnh cng, binI ghi li d liu cn tm.

void

Insert(const Item & object, bool & Suc)


// Xen vo d liu object. bin Suc nhn gi tr true
// nu php xen thnh cng, v false nu tht bi.

void

Delete(int k);
// Loi khi bng bm d liu c kho k.

bool Find(int k, int & index, int & index1) const;


// Hm thc hin thm d tm d liu c kho k.
63

// Nu thnh cng, hm tr v true v bin index ghi li ch


// s ti cha d liu.
// Nu tht bi, hm tr v false v bin index1 ghi li
// ch s trng thi EMPTY hoc DELETED nu thm d
// pht hin ra.
khi to bng bm rng nh sau:
for ( int i= 0 ; i < SIZE ; i++ )
T[i].state = EMPTY;
Ch rng, cc php ton tm kim, xen, loi u cn phi thc hin thm d pht
hin ra d liu cn tm hoc pht hin ra v tr rng (hoc b tr loi b) a
vo d liu mi. S dng hm Find ta d dng ci t c cc hm Search, Insert v
Delete. Trc ht chng ta ci t hm Find. Trong hm Find khi m qu trnh thm
d pht hin ra v tr rng th c ngha l bng khng cha d liu cn tm, song trc
khi t ti v tr rng c th ta pht hin ra cc v tr loi b, bin index1 s ghi
li v tr loi b u tin pht hin ra . Cn nu pht hin ra v tr rng, nhng
trc ta khng gp v tr loi b no, th bin index1 s ghi li v tr rng. Hm
Find c ci t nh sau:
bool Find(int k, int & index, int & index1)
{
int i = Hash(k);
index = 0;
index1 = i;
for (int m= 0 ; m< SIZE ; m++)
{
int n = Probing(i,m); // v tr thm d ln th m.
if (T[n].state = = ACTIVE && T[n].data= = k )
{
index = n;
return true;
}
else if (T[n].state = = EMPTY)
{
if (T[index1].state != DELETED)
index1 = n;
64

return false;
}
else if (T[n].state = = DELETED && T[index1].state!= DELETED)
index1 = n;
}
return false; // Dng thm d m vn khng tm ra d liu
// v cng khng pht hin ra v tr rng.
}
S dng hm Find, cc hm tm kim, xen, loi c ci t nh sau:
bool Search(int k)
{
int ind, ind1;
if (Find(k,ind,ind1))
{
return true;
}
else
{
return false;
}
}
void Insert(int & object, bool & Suc)
{
int ind, ind1;
if (!Find(object, ind, ind1))
if (T[ind1].state = = DELETED || T[ind1].state = = EMPTY)
{
T[ind1].data = object;
T[ind1].state = ACTIVE;
Suc = true;
}
else Suc = false;
65

}
void Delete(int k)
{
int ind, ind1;
if (Find(k, ind, ind1))
T[ind].state = DELETED;
}
Trn y chng ta ci t bng bm a ch m bi mng c c c nh. Hn ch
ca cch ny l, php ton Insert c th khng thc hin c do mng y hoc c
th mng khng y nhng thm d khng pht hin ra v tr rng hoc v tr loi
b t d liu vo. Cu hi t ra l, chng ta c th ci t bi mng ng nh
chng ta lm khi ci t KDL tp ng. Cu tr li l c, tuy nhin ci t bng
bm bi mng ng s phc tp hn, v cc l do sau:
-

C ca mng cn l s nguyn t, do chng ta cn tm s nguyn t tip theo


SIZE lm c ca mng mi.

Hm bm ph thuc vo c ca mng, chng ta khng th sao chp mt cch


n gin mng c sang mng mi nh chng ta lm trc y, m cn phi
s dng hm Insert xen tng d liu ca bng c sang bng mi

V. Ci t bng bm dy chuyn
Trong mc ny chng ta s ci t KDL t in bi bng bm dy chuyn. Lp
ChainHash ph thuc tham bin kiu Item vi cc gi thit nh trong mc IV. Lp
ny c nh ngha nh sau:
struct

Cell

{
Item data;
Cell* next;
}; // Cu trc t bo trong dy chuyn.
Cell* T[SIZE];// Mng cc con tr tr u cc dy chuyn
// Cc php ton t in:
bool Search(int k, Item & I) const;
void Insert(const Item & object, bool & Suc);
void Delete(int k);
khi to ra bng bm rng, chng ta ch cn t cc thnh phn trong mng T l
con tr NULL.
Hm kin to mc nh nh sau:
66

for ( int i= 0 ; i< SIZE ; i++ )


T[i] = NULL;
Cc hm tm kim, xen, loi c ci t rt n gin, sau khi bm chng ta ch cn
p dng cc k thut tm kim, xen, loi trn cc DSLK. Cc hm Search, Insert v
Delete c xc nh di y:
bool Search(int k, Item & I)
{
int i = Hash(k);
Cell* P = T[i];
while (P ! = NULL)
if (Pdata.key = = k)
{
I = Pdata;
return true;
}
else P= Pnext;
return false;
}
void Insert(const Item & object, bool & Suc)
{
int i = Hash(k);
Cell* P = new Cell;
If (P != NULL)
{
Pdata = object;
Pnext = T[i];
T[i] = P; //Xen vo u dy chuyn.
Suc = true;
}
else Suc = false;
}
void Delete(int k)
{
67

int i = Hash(k);
Cell* P;
If (T[i] != NULL)
If (T[i]data.key = = k)
{
P = T[i];
T[i] = T[i]next;
delete P;
}
else
{
P = T[i];
Cell* Q = Pnext;
while (Q != NULL)
if (Qdata.key = = k)
{
Pnext = Qnext;
delete Q;
Q = NULL;
}
else
{
P = Q;
Q = Qnext;
}
}
}
u im ln nht ca bng bm dy chuyn l, php ton Insert lun lun c thc
hin, ch tr khi b nh cp pht ng cn kit. Ngoi ra, cc php ton tm
kim, xen, loi, trn bng bm dy chuyn cng rt n gin. Tuy nhin, phng php
ny tiu tn b nh ginh cho cc con tr trong cc dy chuyn.

68

VI. Hiu qu ca cc phng php bm


Trong mc ny, chng ta s phn tch thi gian thc hin cc php ton t in (tm
kim, xen, loi) khi s dng phng php bm. Trong trng hp xu nht, khi m
hm bm bm tt c cc gi tr kho vo cng mt ch s mng tm kim chng
hn, chng ta cn xem xt tng d liu ging nh tm kim tun t, v vy thi gian
cc php ton i hi l O(N), trong N l s d liu.
Sau y chng ta s nh gi thi gian trung bnh cho cc php ton t in. nh gi
ny da trn gi thit hm bm phn phi u cc kho vo cc v tr trong bng bm
(uniform hashing). Chng ta s s dng mt tham s , c gi l mc y (load
factor). Mc y l t s gia s d liu hin c trong bng bm v c ca bng,
tc l:

trong , N l s d liu trong bng. R rng l, khi tng th kh nng xy ra va


chm s tng, iu ny ko theo thi gian tm kim s tng. Nh vy hiu qu ca cc
php ton ph thuc vo mc y . Khi c mng c nh, hiu qu s gim nu
s d liu N tng ln. V vy, trong thc hnh thit k bng bm, chng ta cn nh
gi s ti a cc d liu cn lu la chn c SIZE sao cho nh. Mc y
khng nn vt qu 2/3.
Thi gian tm kim cng ph thuc s tm kim l thnh cng hay tht bi. Tm kim
tht bi i hi nhiu thi gian hn tm kim thnh cng, chng hn trong bng bm
dy chuyn chng ta phi xem xt ton b mt dy chuyn mi bit khng c d liu
trong bng.
D.E. Knuth (trong The art of computer programming, vol3) phn tch v a ra cc
cng thc nh gi hiu qu cho tng phng php gii quyt va chm nh sau.
Thi gian tm kim trung bnh trn bng bm a ch m s dng thm d tuyn tnh.
S trung bnh cc ln thm d cho tm kim xp x l:
Tm kim thnh cng
Tm kim tht bi
Trong l mc y v < 1.
V d. Nu c bng bm SIZE = 811, bng cha N = 649 d liu, th mc y l
Khi , tm kim thnh cng mt d liu, trung bnh ch i hi xem
xt 3 v tr mng, v

69

Thi gian tm kim trung bnh trn bng bm a ch m s dng thm d bnh
phng (hoc bm kp). S trung bnh cc ln thm d cho tm kim c nh gi l
Tm kim thnh cng
Tm kim tht bi
Phng php thm d ny i hi s ln thm d t hn phng php thm d tuyn
tnh. Chng hn, gi s bng y ti 80%, tm kim thnh cng trung bnh ch i
hi xem xt 2 v tr mng,

Thi gian tm kim trung bnh trn bng bm dy chuyn. Trong bng bm dy
chuyn, xen vo mt d liu mi, ta ch cn t d liu vo u mt dy chuyn
c nh v bi hm bm. Do , thi gian xen vo l O(1).
tm kim (hay loi b) mt d liu, ta cn xem xt cc t bo trong mt dy
chuyn. ng nhin l dy chuyn cng ngn th tm kim cng nhanh. di trung
bnh ca mt dy chuyn l

(vi gi thit hm bm phn phi u).

Khi tm kim thnh cng, chng ta cn bit dy chuyn c rng khng, ri cn xem
xt trung bnh l mt na dy chuyn. Do , s trung bnh cc v tr cn xem xt khi
tm kim thnh cng l
Nu tm kim tht bi, c ngha l ta xem xt tt c cc t bo trong mt dy
chuyn nhng khng thy d liu cn tm, do s trung bnh cc v tr cn xem xt
khi tm kim tht bi l .
Tm li, hiu qu ca php ton tm kim trn bng bm dy chuyn l:
Tm kim thnh cng
Tm kim tht bi

70

Hnh III.6. S trung bnh cc v tr cn xem xt trong tm kim thnh cng.


Cc con s trong bng Hnh III.6, v thc tin cng chng t rng, phng php
bm l phng php rt hiu qu ci t t in.
Bi tp
1. Hy ci t hm bm s dng phng php nhn mc II.2.
2. Hy ci t hm thm d s dng phng php bm kp.
3. Gi s c ca bng bm l SIZE = s v d1, d2, , ds-1 l hon v ngu nhin
ca cc s 1, 2, , s-1. Dy thm d ng vi kho k c xc nh nh sau:
i0 = i = h(k)
im = (i + di) % SIZE , 1 m s 1
Hy ci t hm thm d theo phng php trn.
4. Cho c bng bm SIZE = 11. T bng bm rng, s dng hm bm chia
ly d, hya ln lt cc d liu vi kho:
32 , 15 , 25 , 44 , 36 , 21
vo bng bm v a ra bng bm kt qu trong cc trng hp sau:
b. Bng bm c ch m vi thm d tuyn tnh.
c. Bng bm c ch m vi thm d bnh phng.
d. Bng bm dy chuyn.
5. T cc bng bm kt qu trong bi tp 4, hy loi b d liu vi kho l 44
ri sau xen vo d liu vi kho l 65.
6. Bng bm ch cho php thc hin hiu qu cc php ton tp ng no?
Khng thch hp cho cc php ton tp ng no? Hy gii thch ti sao?

71

7. Gi s kho tm kim l t ting Anh. Hy a ra t nht 3 cch thit k


hm bm. Bnh lun v cc cch thit k theo cc tiu chun hm bm
tt.

72

Chng IV

Mt s phng php thit k thut gii


c bn
Mc tiu
Sau khi hc xong chng ny, sinh vin nm c mt s phng php thit k gi
thut c bn, ci t v vn dng gii mt s bi ton thc t.
Kin thc c bn cn thit
hc tt chng ny sinh vin cn phi nm vng k nng lp trnh c bn nh:
-

Cc cu trc iu khin, lnh vng lp.

Lp trnh hm, th tc, cch gi hm.

Lp trnh qui v gi qui.

Ni dung
Trong chng ny chng ta s nghin cu mt s phng php thit k gii thut c
bn nh sau:
-

Phng php chia tr

Phng php quay lui

Phng php tham lam

I. Phng php chia tr


1. M u
tng:
C l quan trng v p dng rng ri nht l k thut chia tr. N phn r bi ton
kch thc n thnh cc bi ton nh hn m vic tm li gii ca chng l cng mt
cch. Li gii ca bi ton ln c xy dng t li gii ca cc bi ton con ny.
Ta c th ni vn tt tng chnh ca phng php ny l: chia d liu thnh tng
min nh, gii bi ton trn cc min chia ri tng hp kt qu li.
M hnh
Nu gi D&C( ) vi l min d liu l hm th hin cch gii bi ton theo
phng php chia tr th ta c th vit:
Void D&C( )
{
73

If( nh)
Gii bi ton
Else
{
Chia thnh 1, .., m;
For(j=1; j<=m; j++)
D&C( j);
Tng hp kt qu;
}
}
Sau y l mt s v d minh ha cho phng php chia tr
2. Tm kim nh phn
Pht biu bi ton
Cho mng n phn t c sp xp tng dn v mt phn t x. Tm x c trong mng
hay khng? Nu c tr v kt qu l 1, ngc li tr v kt qu l 0.
tng
Chia i mng, mi ln so snh phn t gia vi x, nu phn t gia nh hn x th tm
x na bn phi, ngc li th tm x na bn phi.
M t thut ton
Input: a[1..n]
Output:
1: nu x thuc a
0: nu x khng thuc a
M t:
TKNP(a, x, u, cui)
If(u > cui)
Return 0;
Else
{
gia = (u + cui)/2;
If(x == a[gia])
Return 1;
Else if(x > a[gia])
74

TKNP(a, x, gia +1, cui);


Else TKNP(a, x, u, gia-1);
}
phc tp ca thut ton
Trng hp tt nht: ng vi trng hp tm thy x trong ln so snh u tin. Ta c:
Ttt (n) = O(1)
Trng hp xu nht: phc tp l O(lgn). Tht vy, nu gi T(n) l phc tp ca
thut ton, th sau khi kim tra iu kin (x == a[gia]) khng tha v gi quy thut
ton ny vi d liu gim i mt na, tha mn cng thc truy hi:
T(n) = 1+T(n/2); n>=2 v T[1]=0.
3. Bi ton Min-Max
Pht biu bi ton
Tm min-max trong on a[l..r] ca mng a[1..n]
tng
Ti mi bc chia i on cn tm ri tm min, max ca tng on, sau tng hp
kt qu li.
Nu on chia ch c mt phn t th min = max v bng phn t .
V d minh ha:
J

a[j]

10

15

19

Tm gi tr min, max trong on a[2..7].


Ki hiu:
MinMax(a,l,r,Min, Max) cho Min, Max trong on a[l..r].
MinMax(a,2,7,Min,Max) cho Min=0, Max=15 trong on a[2..7]
M t thut ton
Input: a[l..r] (l<=r)
Output:
Min = min(a[l]a[r])
Max = max(a[l]..a[r])
M t:
MinMax(a,l,r,Min,Max)
If(l==r)
75

{
Min = a[l];
Max = a[l];
}
Else
{
MinMax(a,l,(l+r)/2,Min1,Max1)
MinMax(a,(l+r)/2,r,Min2,Max2)
If(Min1<Min2)
Min = Min1;
Else Min = Min2;
If(Max1<Max2)
Max = Max2;
Else Max = Max1;
}
phc tp thut ton
Gi T(n) l s php so snh cn thc hin. Khi ta c:
T (n / 2) + T (n / 2) + 2; n > 2

T(n) = 1; n = 2
0; n = 1

Vi n = 2k, th:
k 1

T(n) = 2 + 2T(n/2) = 2+ 22 + 22T(n/22) = = 2k-1T(2)+ 2i =


i =1

k 1

= 2i 2k-1 = 2k+1 2k-1 - 2 = 3n/2 2.


i =1

Vy T(n) O(n).
4. Thut ton QuickSort
Pht biu bi ton
Sp xp mt mng khng c th t thnh mt mng c th t xc nh,chng hn tng
hoc gim.
tng
Chn ngu nhin mt phn t x.
Duyt dy t bn tri (theo ch s i) trong khi ai < x.
76

Duyt dy t bn phi (theo ch s j) trong khi aj > x.


i ch a[i] v a[j] nu hai pha cha vt qua nhau, .. tip tc qu trnh duyt v i
ch nh trn trong khi hai pha cn cha vt qua nhau (tc l i<=j).
Kt qu phn hoch dy thnh 3 phn:
ak <=x vi k = 1..j (dy con thp);
am >=x vi m = i..n (dy con cao);
ah = x vi h = j+1..i-1.
V vy phng php ny cn gi l sp xp phn hoch
x

ak

am

Tip tc phn hoch cho phn tri v phn phi cho n khi cc phn hoch ch cn li
mt phn t l sp xp xong.
M t thut ton:
Input: a[l..r]
Output: a[l..r] khng gim
QuickSort(a,l,r)
{
i=l;
j=r;
x= a[(l+r)/2];//chn phn t gia
do
{
While(a[i]<x) i++;
While(a[j]>x)j--;
If(i<=j)
{
i ch a[i] v a[j];
i++;
j--;
}
}while(i<=j)
If(l<=j) QuickSort(a,l,j);
If(i<=r) QuickSort(a,i,r);
77

}
phc tp thut gii
iu tt nht c th xy ra trong QuickSort mi giai on phn hoch chia mng thnh
hai na. iu ny khin cho s ln so snh cn thit ca QuickSort tha mn cng
thc sau y:
Tn = 2Tn/2 + n = nlgn.
2Tn/2: ph tn sp xp 2 mng con.
n: ph tn kim tra mi phn t
Trng hp xu nht ng cho vic chn phn t x li c gi tr ln nht hoc nh nht
trong dy. Gi s phn t ln nht c chn (x), khi mi bc chia s chia n phn
t thnh n-1 phn t tri v 1 phn t phi. Kt qu cn ti n php chia (thay cho nlgn)
v nh th phc tp s l T(n) = O(n2).
Trong trng hp ny dy c th t thun hay ngc, phn t ln nht c chn
s nm cc bin (tri hoc phi), nn thut ton khng c hiu qu.
Trng hp trung bnh, cng thc truy hi tnh s ln so snh m thut ton cn
hon v ngu nhin n phn t l:
1
(Tk-1 + Tn-k); vi n>=2; C0 = C1 = 1;
n 1<= k <= n

T(n) = (n+1) +

Gi tr n+1 bao hm chi ph so snh phn t phn hoch vi mi phn t cn li, tng
cn li mang ngha l mi phn t k c th l phn t phn hoch vi xc sut 1/k v
sau cn li cc mng con c kch thc k-1 v n-k.
Tn = n+1+

2 n
Tk-1
n k =1

Thc hin lin tip cc php ton sau cho c hai v: nhn n v tr cho (n-1)Cn-1:
nTn (n-1)Tn-1 = n(n-1) +
= n(n+1) +

2 n
Tk-1 (n-1)Tn-1
n k =1

2 n
2 n 1
Tk-1 (n-1)[n +

Tk-1]
n k =1
n 1 k =1

= n(n+1) n(n-1) + 2

k =1

n 1

Tk-1 - 2 Tk-1
k =1

Ta c: nTn (n-1)Tn-1 = n(n+1) n(n-1)+ 2Tn-1


Suy ra: nTn = (n+1)Tn-1 + 2n
Nhn c hai v cho n(n+1):
Tn/(n+1) = Tn-1/n + 2/(n+1) = Tn-2/(n-1)+ 2/n + 2/(n+1)

78

= 2/(n+1) + 2/n+2/4+2/3+T1/2 = 1/2 + 2

k +1
k =2

= 1/2 + 2

n +1

k
k =3

Tn/(n+1) 2

n +1

1
1
2 dx = 2ln(n)

x
k =3 k
1

Nh vy phc tp trung bnh l O(nlnn)


II. Phng php quay lui
1. M u
tng
Nt c trng ca phng php quay lui l cc bc hng ti li gii cui cng ca
bi ton u c lm th.
Ti mi bc nu c mt la chn c chp nhn th ghi nhn li la chn ny v
tin hnh cc bc th tip theo. Cn ngc li khng c s la chn no thch hp
th lm li bc trc, xa b ghi nhn v quay v chu trnh th cc la chn cn li.
Hnh ng ny c gi l quay lui, thut ton th hin phng php ny gi l quay
lui.
im quan trng ca thut ton l phi ghi nh li mi bc i qua trnh trng lp
khi quay lui. D thy l cc thng tin ny cn c lu tr vo mt ngn xp, nn
thut ton th hin mt cch quy.
M hnh
Li gii ca bi ton thng c biu din bng mt vector gm n thnh phn x= (x1,
..xn) phi tha cc iu kin no . ch ra li gii x ta phi xy dng cc thnh
phn li gii xi.
Ti mi bc i:
xy dng xong cc thnh phn x1..xi-1.
Xy dng thnh phn xi bng cch ln lt th cc kh nng m xi c th chn:
-

Nu mt kh nng j no ph hp vi xi th xc nh xi theo kh nng


j. Thng phi c thm thao tc ghi nhn trng thi mi ca bi ton
h tr cho bc quay lui. Nu i = n th ta c c mt li gii, ngc li
th tin hnh bc i+1 xc nh xi+1.

Nu khng c mt kh nng no chp nhn c cho xi th ta li li


bc trc (bc i-1) xc nh li thnh phn xi-1.

n gin ta c th gi nh cc kh nng chn la cho cc xi ti mi bc l nh


nhau, do ta phi c thm thao tc kim tra kh nng j no chp nhn c cho xi.

79

M hnh ca phng php quay lui c th vit bng th tc nh sau, vi n l s bc


cn phi thc hin, k l s kh nng m xi c th chn la
Try(i)
For(j=1k)
If(xi chp nhn c kh nng j)
{
Xc nh xi theo kh nng j;
Ghi nhn trng thi mi;
If(i<n)
Try(i+1);
Else
Ghi nhn nghim;
Tr li trng thi c cho bi ton;
}
2. Bi ton lit k dy nh phn di n
Pht biu bi ton
Lit k dy c chiu di n di dng x1,x2,..,xn trong xi thuc {0,1}
Thit k thut ton
Ta c th s dng s tm tt c li gii ca bi ton. Hm Try(i) xc nh xi, trong
xi ch c mt trong hai gi tr 0 hoc 1. Hm Try(i) c th vit nh sau:
Try(i)
{
For(j=0; j<=1; j++)
{
x[i] = j;
if(i<n)
Try(i+1);
Else Xut x.
}
}
3. Bi ton lit k cc hon v
Pht biu bi ton
Lit k cc hon v ca n s nguyn dung u tin
80

Thit k thut ton


Ta biu din cc hon v di dng a1,..,an; ai {1,..,n}, ai aj nu i j . Vi
mi i, ai chp nhn gi tr j nu j cha c s dng v v vy ta cn ghi nh j c
s dng hay cha khi quay lui. lm iu ny ta s dng mt dy cc bin logic bj
vi quy c:
1; Nu j cha s dng

j = 1, n; bj =
0; Nu j s dng

Sau khi gn j cho ai, ta cn ghi nh bj (bj = 0) v phi tr li trng thi c cho bj (bj =1)
khi thc hin vic in xong mt hon v.
Ta cn ch rng dy cc bin bj s c khi ng bng 1.
Thut ton
Try(i)
{
For(j=1; j<=n; j++)
{
If(b[j])
{
a[i] = j;
b[j] = 0;
if(i<n)
Try(i+1);
Else Xut;
b[j] = 1;
}
}
4. Bi ton duyt th theo chiu su (DFS)
Pht biu bi ton
G = (V,U) l n th (c hng hoc v hng). V: tp cc nh ca th, U l
tp cc cung ca th. Vi s, t l hai nh ca th, tm tt c cc ng i t s n
t.
tng
Thut ton DFS tin hnh tm kim trong th theo chiu su. Thut ton thc hin
vic thm tt c cc nh c th t c cho ti nh t t nh s cho trc. nh c
81

thm cng mun s cng sm c duyt xong (c ch vo sau ra trc). Nn thut


ton c th t chc bng mt th tc quy quay lui.
M t thut ton
Input: G = (V,U), s,t
Output: Tt c cc ng i t s n t.(nu c)
DFS(int s)
{
For(u=1; u<=n; u++)
If(chp nhn c)
{
Ghi nhn n;
If(u != t)
DFS(u);
Else Xut ng i
B vic ghi nhn;
}
}
V d: Cho th c hng vi ma trn k sau:
7
0

Kt qu:
s=1, t=4

s=2, t = 5

14

234165

174

2365
24165
24365
82

III. Phng php tham lam


1. M u
tng
Phng php tham lam l k thut thit k thng c dng gii cc bi ton ti
u. Phng php c tin hnh trong nhiu bc. Ti mi bc, theo mt chn la
no (xc nh bng mt hm chn), s tm mt li gii ti u cho bi ton nh
tng ng. Li gii ca bi ton c b sung dn tng bc t li gii ca cc bi
ton con.
Cc li gii bng phng php tham lam thng ch l chp nhn c theo iu kin
no , cha chc ti u.
Cho trc mt tp A gm n i tng, ta cn phi chn ra mt tp con S ca A. Vi
mt tp con S c chn ra tha mn yu cu ca bi ton, ta gi l mt nghim chp
nhn c. Mt hm mc tiu gn mi nghim chp nhn c vi mt gi tr.
Nghim ti u l nghim chp nhn c m ti hm mc tiu t gi tr nh nht
(ln nht).
c trng tham lam ca phng php th hin bi: trong mi bc vic x l s tun
theo mt s chn la trc, khng k n tnh trng khng tt c th xy ra.
M hnh
Chn S t tp A.
Tnh cht tham lam ca thut ton c nh hng bi hm chn
Khi ng: S = rng
Trong khi A khc rng
Chn phn t ti u nht ca A gn vo x : x = chn(A);
Cp nht cc i tng chn: A = A-{x};
Nu S {x} tha mn yu cu ca bi ton th cp nht li gii: S = S {x};
Th tc tham lam
Input: A[1..n]
Output: li gii S
Greedy(A,n)
{
S = Rng;
While(A Rng)
{
A = A-{x};
83

If(S {x} chp nhn c)


S = S {x};
}
Return S;
}
2. Bi ton ngi du lch
Pht biu bi ton
Mt ngi du lch mun tham quan n thnh ph T1, .., Tn. Xut pht t mt thnh ph
no v i qua tt c cc thnh ph cn li, mi thnh ph qua ng mt ln v quay
v thnh ph xut pht.
Gi Cij l chi ph chi t thnh ph Ti n thnh ph Tj. Hy tm mt hnh trnh tha
yu cu bi ton vi chi ph nh nht.
tng
y l bi ton tm chu trnh c trng s nh nht trong mt th n c hng c
trng s.
Thut ton tham lam cho bi ton l chn thnh ph c chi ph nh nht tnh t thnh
ph hin thi n cc thnh ph cha i qua.
M t thut ton
Input: C = Cij
Output: TOUR //Hnh trnh ti u
COST //Chi ph tng ng
TOUR = 0;
COST = 0; v = u;
k = 1 n

Chn <v,w> l on ni hai thnh ph c chi ph nh nht tnh t thnh ph v n


cc thnh ph cha qua.
TOUR = TOUR + <v,w>;
COST = COST + Cvw
Hon thnh chuyn i
TOUR = TOUR + <v,u>;
COST = COST + Cvu
phc tp thut ton

84

Thao tc chn nh thch hp trong n nh c t chc bng mt vng lp duyt,


nn chi ph cho thut ton xc nh bi hai vng lp lng nhau, nn phc tp T(n)
2
O(n ).
Ci t
int GTS(matra a, int n, int Tour[max], int Ddau)
{
int v, k, w;
int min;
int cost;
int daxet[max];
for (int k = 1; k <= n; k++)
daxet[k] = 0;
cost = 0;
int i;
v = Ddau;
int i = 1;
Tour[i] = v;
daxet[v] = 1;
while (i < n)
{
min = VC;
for (int k = 1; k <= n; k++)
{
if(daxet[k])
if (min > a[v][k])
{
min = a[v][k];
w = k;
}
v = w;
i++;
Tour[i] = v;
daxet[v] = 1;
85

cost = cost + min;


}
}
cost = cost + a[v][Ddau];
return cost;
}
3. Thut ton Prim - Tm cy bao trm nh nht
(trnh by trong chng th)
4. Bi ton chic ti sch
Pht biu bi ton
C n vt, mi vt i, i [1..n] c c trng bi trng lng wi(kg) v gi tr s dng
vi. C mt chic ti xch c kh nng mang m kg. Gi s wi, vi, m N*, i [1..n].
Hy chn vt xp vo ti sao cho ti sch thu c gi tr s dng ln nht.
Cc trng lng ca n vt c th biu din bi mng:
w = (w1,w2,..,vn)
V gi tr s dng tng ng vi cc vt:
v = (v1,v2,,vn)
Cc vt c chn c lu tr vo mt mng vi quy c: [i] = 1 tc l vt i
c chn.
Bi ton tr thnh:
n
i vi max
i =1
n
i vi m
i =1
{0,1}, i = 1, n
i

Thit k thut ton


Thut ton tham lam cho bi ton chn vt c gi tr gim dn (theo n gi).
Input:
w = (w1,w2,..,vn); //Mng trng lng cc vt
v = (v1,v2,,vn); //Mng gi tr cc vt
m: sc cha ca ba l
Output:
86

[1..n]; //mng nh du cc vt c chn

Vmax: gi tr ln nht
M t
Knap_Greedy(w,v,Chon,n,m)
{
Khi ng b[i] = i, i = 1, n ; //Lu tr ch s lm cho mng gim dn
Khi ng Chon[i] = 0, i = 1, n ;//Mng nh du vt c chn
Khi ng Vmax=0;
Tnh n gi: di =

vi
, i = 1, n
wi

For(i=1; i<=n && m>0; i++)


{
j = max(d,n,i); // d[j] = Max{d[i],,d[n]};
b[i] b[j]
if(m>w[b[i]])
{
Vmax+=v[b[i]];
Chon[b[i]] = 1;
M-=w[b[i]];
}
d[i] d[j]
}
Return Vmax
}
phc tp thut ton
Thut ton chn max c s dng chnh l thut ton chn trc tip, nn phc tp
ca thut ton trong cc trng hp l O(n2).
Bi tp
1. Ci t cc thut ton trnh by trong gio trnh
2. Nhn cc s ln
K thut chia tr nhn 2 s nguyn dng x, y di dng chui:
Nhan(x, y)
87

If(l(x) v l(y) <=4) // chiu di nh hn 4


Nhn hai s nguyn kiu long
Else
Gi s l(x) = l(y) = n;
Tch thnh x hai chui con: a(na tri), b(na phi)
Tch thnh y hai chui con: c(na tri), d(na phi)
Kq = Nhan(a,c)*10n + Nhan(a,d)*10n/2 + Nhan(b,c)*10n/2 + Nhan(b,d)
3. Sp tng dn mt dy x cc s bng thut ton trn t nhin:
Trong khi (s ng chy ca x >1)
-

Tch lun phin ng chy ca x vo hay dy trung gian x1,x2.

Trn tng cp ng chy ca x1, x2, lu vo x

4. Gi s kha c n cng tc. Mi cng tc mt trong hai trng thi ng hoc m.


Kha c m nu c t nht n/2 cng tc trng thi m. Lit k tt c cc cch m
kha
5. Mt ngi mun tham quan qua n thnh ph T1, , Tn. Xut pht t mt thnh ph
no , ngi du lch mun i qua tt c cc thnh ph cn li, mi thnh ph i qua
ng mt ln ri quay li thnh ph xut pht.
Gi Cij l chi ph i t thnh ph Ti n thnh ph Tj.
-

Lit k tt c cc hnh trnh m ngi c th i v km theo chi ph tng


ng.

Ch ra hnh trnh i t thnh ph t Ti n thnh ph Tj tha yu cu bi ton


(nu c) sao cho chi ph thp nht.

6. Cho mt li hnh vung cp n, mi c gn vi mt s t nhin. Ti mt c th


di chuyn n khc theo hng ln trn, xung di, qua tri, qua phi.
Tm ng i t u tin (1,1) n (m, m) sao cho tng cc i qua l nh nht.
(1<=m <= n)
7. bi ton i tin xu.
C mt ng xu gi tr l n. Hy i thnh cc ng xu c gi tr 1 xu, 5 xu, 10 xu, 20
xu, 25 xu sao cho tng s ng xu l t nht.

88

Ti liu tham kho


1. Alfred V. Aho, John E. Hopcroft v Jeffrey D. Ullman
Data Structures and Algorithms
Addison Wesley Publishing Company, 1987
2. Donald Knuth, The art of computer programming
Vol1: Fundamental algorithms
Vol3: Sorting and searching
Addison Wesley Publishing Company, 1973
3. Niklaus Wirth, Algorithms + Data structures = programs
Prentice Hall INC, 1976
4. Nguyn Xun Huy, Thut ton, Nh xut bn thng k, H Ni, 1988.
5. Trng Ch Tn, gio trnh Cu trc d liu v thut gii 2, i hc
Lt, 2002.
6. Nguyn Vn Linh, Trn Cao , Trng Th Thanh Tuyn, Lm Hoi Bo,
Phan Huy Cng, Trn Ngn Bnh, gio trnh Cu trc d liu, i hc
Cn Th, 2003 ca cc tc gi.

89

You might also like