Professional Documents
Culture Documents
3
4
HInh 11.8- Hnh dang cac cay nhj fhuc voI cac chIou cao 0, 1, 2, 3, va 4 duoc quy djnh frong
hang nhj fhuc.
Hnh 11.9 bIou dIon mof hang nhj fhuc co 6 nuf.
HInh 11.9- Hang nhj fhuc co 6 nuf.
Phan fu nho nhaf frong hang nhj fhuc chnh Ia mof frong cac nuf goc cua cac
cay nhj fhuc co frong hang. o hang nhj fhuc co nhIou nhaf Ia Iog N cay nhj fhuc
khac nhau, vIoc fm kIom chI ph O( l og N) . Nou chung fa danh dau phan fu nho
nhaf moI khI co su fhay doI boI mof fac vu nao fh chI ph nay Ia O( 1) .
Phop fron frong hang nhj fhuc raf do dang. CIa su chung fa can fron haI hang
nhj fhuc H
1
va H
2
frong hnh 11.10. H
3
Ia hang nhj fhuc kof qua. Trong H
1
va H
2
chI co mof cay nhj fhuc
0
, vay
0
so Ia mof fhanh phan cua H
3
. Chung fa kof
hop haI cay nhj fhuc
1
frong H
1
va H
2
bang cach cho cay nhj fhuc co goc Ion hon
Iam cay con cua cay nhj fhuc con IaI. VoI cay nhj fhuc
2
vua co duoc va haI cay
nhj fhuc
2
ban dau frong H
1
va H
2
, chung fa do IaI mof cay frong H
3
, va kof hop
16
18
12
21 24
65
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 297
haI cay
2
con IaI fhanh mof cay
3
. V H
3
chua co cay nhj fhuc
3
non
3
cuoI
cung nay so Ia fhanh phan cua H
3
.
H
1
H
2
HInh 11.10- HaI hang nhj fhuc H
1
va H
2
.
HInh 11.11 - Kof hop haI cay nhj fhuc
1
frong H
1
va H
2
.
HInh 11.12- Kof qua fron H
1
va H
2
fhanh H
3
.
VIoc kof hop haI cay nhj fhuc fon O( 1) , voI O( l og N) cay nhj fhuc frong moI
hang nhj fhuc, vIoc fron haI hang nhj fhuc cung fon O( l og N) frong fruong hop
xau nhaf. o fang fnh hIou qua, chung fa Iuu cac cay nhj fhuc frong moI hang
nhj fhuc fhoo fhu fu fang dan cua chIou cao cac cay.
VIoc fhom mof phan fu moI vao hang nhj fhuc fuong fu nhu doI voI hoap Ioch
fraI: fron hang nhj fhuc co duy nhaf phan fu can fhom voI hang nhj fhuc da co.
VIoc IoaI phan fu nho nhaf cung don gIan: fm phan fu nho nhaf frong so cac
nuf goc cua cac cay nhj fhuc. CIa su do Ia cay
k
. Sau khI IoaI bo nuf goc cua cay
k
, chung fa con IaI cac cay con cua no:
0
,
1
,
k-1
. CoI rung gom cac cay con
nay Ia H, va H Ia hang nhj fhuc ban dau khong ko
K
. VIoc cuoI cung can Iam Ia
fron H va H. Chung fa co fho fu kIom fra rang cac phop fhom va IoaI nay dou
fon O( l og N) frong fruong hop xau nhaf.
16
18
12
21 24
65
14
26
23
51 24
65
13
14
26 16
18
23
51 24
65
13
12
21 24
65
14
26 16
18
23
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 298
HInh 11.13- Qua frnh fhom cac phan fu 1, 2,, 7 vao hang nhj fhuc.
1
2 3
4
1
1 2
1
2
1
2
3
1
2
3
1
2
3
4
1
2
3
4
1
2 3
4
5
1
2 3
4
5
1
2 3
4
5
6
1
2 3
4
5
6
1
2 3
4
5
6
7
1
2 3
4
5
6
7
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 299
H
H H
HInh 11.14- Qua frnh IoaI phan fu nho nhaf frong hang nhj fhuc H.
Hen thuc cuu hung nh{ thuc
VIoc fm phan fu nho nhaf can duyof qua cac goc cua cac cay nhj fhuc frong
hang nhj fhuc |12, 23 va 13 frong hnh 11.14). Chung fa co fho dung danh sach
IIon kof do chua cac nuf goc nay. anh sach so co fhu fu fhoo chIou cao cua cac
cay nhj fhuc do phuc vu cho phop fron haI hang nhj fhuc duoc do dang.
Tuong fu, cac nuf con cua nuf goc cua mof cay nhj fhuc cung duoc chua frong
mof danh sach IIon kof |14, 24 va 21 frong hnh 11.14), do khI IoaI bo nuf goc
|nuf 12) fh phan con IaI cung co cau fruc fuong fu nhu mof hang nhj fhuc moI,
raf fhuan IoI frong phop IoaI phan fu nho nhaf frong hang nhj fhuc.
HInh 11.15- Hang nhj fhuc H
23
51 24
65
13
12
21 24
65
14
26 16
18
23
51 24
65
13 21 24
65
14
26 16
18
23
51 24
65
13
21 24
65
14
26 16
18
23
51 24
65
13
12
21 24
65
14
26 16
18
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 300
HInh 11.16- HIon fhuc IIon kof cua hang nhj fhuc H.
Trong hnh vo fron chung fa fhay hnh c/ipsc nof roI bIou dIon cac danh sach
IIon kof cac nuf ma chung fa fhuong phaI duyof qua. Hnh c/ipsc nof roI Ion chua
cac goc cua cac cay nhj fhuc frong hang nhj fhuc, khI can fm phan fu nho nhaf
frong hang nhj fhuc chung fa fm frong danh sach nay. Hnh c/ipsc nof roI nho
chua cac nuf con cua nuf goc frong mof cay nhj fhuc.
Trong qua frnh hnh fhanh hang nhj fhuc frong mof so fhao fac du IIou, khI
kof hop haI cay nhj fhuc co cung chIou cao |hnh 11.18), chung fa can noI mo f
frong haI cay fhanh cay con cua cay con IaI, ma cay con moI nay cung chnh Ia
cay con co chIou cao Ion nhaf so voI cac cay con da co. VIoc chon cay con moI vao
dau cua danh sach IIon kof so fhuan fIon hon, v vay chung fa cho danh sach nay
co fhu fu gIam dan fhoo chIou cao cua cac cay con |hnh 11.18).
NgoaI ra, moI nuf frong cay nhj fhuc so co mof con fro cho phop fruy xuaf don
danh sach cac con cua no. Tom IaI, hIon fhuc don gIan va hIou qua cho hang nhj
fhuc fhaf don gIan nhu hnh 11.18, do Ia cau fruc cua mof cay nhj phan, moI nuf
co con fro fraI chI don nuf con dau fIon cua no va con fro phaI chI don nuf anh
om cua no.
HInh 11.1?- Coc cac cay nhj fhuc duoc chua frong mang IIon fuc.
Hnh 11.17 Ia mof phuong an fhay danh sach IIon kof fron cung boI mang IIon
fuc. Chung fa co fho dung mang IIon fuc cap phaf dong do khac phuc nhuoc dIom
do khong bIof fruoc chIou cao cua cay nhj fhuc cao nhaf frong hang nhj fhuc. VIoc
dung mang IIon fuc cho phop fm nhj phan phan fu nho nhaf, fuy nhIon so Ia
Iang ph Ion khI hang nhj fhuc gom qua f cay nhj fhuc voI nhIou chIou cao khac
nhau.
13
12
14 24
65
21
23
51 24
65 16 26
18
13
12
14 24
65
21
23
51 24
65 16 26
18
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 301
HInh 11.18- Kof hop haI cay nhj fhuc B
2
fhanh mof cay nhj fhuc B
3
.
uoI day Ia phan ma gIa cho cac khaI bao cau fruc cua cay nhj fhuc va hang
nhj fhuc. Cac fac vu kof hop haI cay nhj fhuc, fron haI hang nhj fhuc, va IoaI
phan fu nho nhaf frong hang nhj fhuc cung duoc frnh bay bang ma gIa.
/ / Phan ma gIa cho khaI bao va mof so fac vu cho hang nhj fhuc.
struct Bi nomi al _Node
Dat aType dat a
Bi nomi al _Node* l ef t Chi l d
Bi nomi al _Node* next Si bl i ng
end struct
struct Bi nomi al _Tr ee
Bi nomi al _Tr ee combineTrees( r ef Bi nomi al _Tr ee T1, r ef Bi nomi al _Tr ee T2)
Bi nomi al _Node* r oot
i nt not Empt y( ) / / Tra vo 1 nou cay khong rong, nguoc IaI fra vo 0.
end struct
class Bi nomi al _Queue
publ i c:
Bi nomi al _Queue( Bi nomi al _Node* p, i nt k) / / k Ia so nuf frong hang nhj fhuc.
i nt empt y
Bi nomi al _Queue mer ge( r ef Bi nomi al _Queue H1, r ef Bi nomi al _Queue H2)
pr ot ect ed:
i nt count / / Tong so nuf frong faf ca cac cay nhj fhuc.
Bi nomi al _Tr ee Tr ees[ MAX]
end class
Bi nomi al _Tr ee Bi nomi al _Tr ee: : CombineTrees( r ef Bi nomi al _Tr ee T1,
r ef Bi nomi al _Tr ee T2) ;
/ *
pre: T1 va T2 khac rong.
post: T1 chua kof qua kof hop haI cay T1 va T2, T2 rong. Tra vo cay T1.
*/
{
1. i f ( T1. r oot - >dat a > T2. r oot - >dat a)
1. Trao T1 va T2 cho nhau
2. T2. r oot - >next Si bl i ng = T1. r oot - >l ef t Chi l d / / Chon cay T2 vao dau danh
/ / sach cac cay con cua goc cua T1
3. T1. r oot - >l ef t Chi l d = T2. r oot / / Cap nhaf nuf con fraI cho nuf goc cua T1
4. T2. r oot = NULL
5. r et ur n T1
}
14
16 26
18
12
24 21
65
12
24 21
65
14
16 26
18
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 302
Bi nomi al _Queue Bi nomi al _Queue: : merge( r ef Bi nomi al _Queue H1,
r ef Bi nomi al _Queue H2)
/ *
post: H1 chua kof qua fron haI hang nhj fhuc H1 va H2, H2 rong. Tra vo hang H1.
uscs: ham Bi nomi al _Tr ee: : not Empt y( ) fra vo 1 nou cay khong rong, nguoc IaI fra vo 0.
*/
{
Bi nomi al _Tr ee T1, T2, car r y
i nt i = 0
1. H1. count = H1. count + H2. count
2. l oop ( H2 chua rong hoac car r y khong rong)
1. T1 = H1. Tr ees[ i ]
2. T2 = H2. Tr ees[ i ]
3. case ( T1. not Empt y( ) + 2*T2. not Empt y( ) + 4*car r y. not Empt y( ) )
1. case 0: / / Khong co cay nao
2. case 1: / / ChI co cay T1
1. br eak
3. case 2: / / ChI co cay T2
1. H1. Tr ees[ i ] = T2
2. H2. Tr ees[ i ] . r oot = NULL
3. br eak
4. case 4: / / ChI co cay car r y
1. H1. Tr ees[ i ] = car r y
2. car r y. r oot = NULL
3. br eak
5. case 3: / / Co cay T1 va T2
1. car r y = combi neTr ees( T1, T2)
2. H1. Tr ees[ i ] . r oot = NULL
3. H2. Tr ees[ i ] . r oot = NULL
4. br eak
6. case 5: / / Co cay T1 va car r y
1. car r y = combi neTr ees( T1, car r y)
2. H1. Tr ees[ i ] . r oot = NULL
3. br eak
7. case 6:/ / Co cay T2 va car r y
1. car r y = combi neTr ees( T2, car r y)
2. H2. Tr ees[ i ] . r oot = NULL
3. br eak
8. case 7:/ / Co ca 3 cay T1, T2, va car r y
1. H1. Tr ees[ i ] = car r y
2. car r y = combi neTr ees( T1, T2)
3. H2. Tr ees[ i ] . r oot = NULL
4. br eak
4. endcase
5. i = i + 1
3. endloop
4. r et ur n H1
}
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 303
Tom IaI, frong chuong nay chung fa da xom xof mof so cach hIon fhuc cua
hang uu fIon. Heap nhj phan vua don gIan vua hIou qua v khong su dung con fro,
no chI hoI fon nhIou vung nho chua su dung don ma fhoI. Chung fa da nghIon cuu
fhom fac vu fron va bo sung fhom ba phuong an khac cua hang uu fIon. Heap Ioch
fraI Ia mof v du kha hay vo gIaI fhuaf do quy. Skew heap gIong heap Ioch fraI
nhung don gIan hon, voI hy vong rang cac ung dung co fnh ngau nhIon fh cac
fruong hop xau nhaf so khong fhuong xuyon xay ra. CuoI cung hang nhj fhuc cho
fhay mof y fuong don gIan ma IaI gIoI han duoc chI ph cho gIaI fhuaf kha fof.
Bi nomi al _Queue: : Bi nomi al _Queue( Bi nomi al _Node* p, i nt k)
/ *
pre: p Ia dja chI nuf dau fIon cua mof cau fruc IIon kof cac cay nhj fhuc
k
,
k-1
,,
0
.
post: Hang nhj fhuc moI duoc fao fhanh fu cac cay nay.
*/
{
1. count = ( 1 << ( k+1) ) 1
2. loop ( k >= 0)
1. Tr ees[ k] = p
2. p = p- >next Si bl i ng
3. Tr ees[ k] - >next Si bl i ng = NULL/ / Caf roI cac cay con do dua vao mang IIon
/ / fuc cac cay nhj fhuc cho hang nhj fhuc moI.
4. k = k 1
3. endloop
}
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 304
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 305
Chng 12 BANG VA TRY XAT THONG TN
Chuong nay fIop fuc nghIon cuu vo cach fm kIom fruy xuaf fhong fIn da do
cap o chuong 7, nhung fap frung vao cac bang fhay v cac danh sach. Chung fa
baf dau fu cac bang hnh chu nhaf fhong fhuong, sau do Ia cac dang bang khac va
cuoI cung Ia bang bam.
12.1. Oun nhup: phu vo ruo cun lgn
Trong chuong 7 chung fa da fhay rang, bang cach so sanh khoa, frung bnh
vIoc fm kIom frong n phan fu khong fho co f hon Ig n Ian so sanh. Nhung kof
qua nay chI noI don vIoc fm kIom bang cach so sanh cac khoa. ang mof vaI
phuong phap khac, chung fa co fho fo chuc cac du IIou sao cho vj fr cua mof phan
fu co fho duoc xac djnh nhanh hon.
Thaf vay, chung fa fhuong Iam fho. Nou chung fa co 500 phan fu khac nhau co
cac khoa fu 0 don 499, fh chung fa so khong bao gIo nghI don vIoc fm kIom fuan
fu hoac fm kIom nhj phan do xac djnh vj fr mof phan fu. on gIan chung fa chI
Iuu cac phan fu nay frong mof mang kch fhuoc Ia 500, va su dung chI so n do xac
djnh phan fu co khoa Ia n bang cach fra cuu bnh fhuong doI voI mof bang.
VIoc fra cuu frong bang cung nhu vIoc fm kIom co chung mof muc dch, do Ia
fruy xuaf fhong fIn. Chung fa baf dau fu mof khoa va mong muon fm mof phan
fu chua khoa nay
Trong chuong nay chung fa fm hIou cach hIon fhuc va fruy xuaf cac bang
frong vung nho IIon fuc, baf dau fu cac bang hnh chu nhaf fhong fhuong, sau do
don cac bang co mof so vj fr han cho nhu cac bang fam gIac, bang IoI Iom. Sau
do chung fa chuyon sang cac van do mang fnh fong quaf hon, voI muc dch fm
hIou cach su dung cac mang fruy xuaf va cac bang bam do fruy xuaf fhong fIn.
Chung fa so fhay rang, fuy fhoo hnh dang cua bang, chung fa can co mof so
buoc do fruy xuaf mof phan fu, fuy vay, fhoI gIan can fhIof van Ia 0|1) - co nghIa
Ia, fhoI gIan co gIoI han Ia mof hang so va doc Iap voI kch fhuoc cua bang- va do
do vIoc fra cuu bang co fho daf hIou qua hon nhIou so voI baf ky phuong phap fm
kIom nao.
Cac phan fu cua cac bang ma chung fa xom xof duoc danh chI so bang mof
mang cac so nguyon, fuong fu cach danh chI so cua mang. Chung fa so hIon fhuc
cac bang duoc djnh nghIa fruu fuong bang cac mang. o phan bIof gIua khaI nIom
fruu fuong va cac hIon fhuc cua no, chung fa co mof quy uoc sau:
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 306
ChI so xac djnh mof phan fu cua mof bang djnh nghIa fruu fuong duoc bao boI
cap dau ngoac don, con chI so cua mof phan fu frong mang duoc bao boI cap dau
ngoac vuong.
V du, T|1,2,3) Ia phan fu cua bang T duoc danh chI so boI day so 1, 2, 3, va
A1|2|3| fuong ung phan fu voI chI so frong mang A cua C++.
12.2. Cuc bung chu nhut
o fam quan frong cua cac bang chu nhaf, hau hof cac ngon ngu Iap frnh cap
cao dou cung cap mang haI chIou do chua va fruy xuaf chung, va noI chung nguoI
Iap frnh khong can phaI ban fam don cach hIon fhuc chI fIof cua no. Tuy nhIon,
bo nho may fnh fhuong co fo chuc co ban Ia mof mang IIon fuc |nhu mof mang
fuyon fnh co phan fu nay nam ko phan fu kIa), doI voI moI fruy xuaf don bang
chu nhaf, may can phaI co mof so fnh foan do chuyon doI mof vj fr frong hnh
chu nhaf sang mof vj fr frong mang fuyon fnh. Chung fa hay xom xof dIou nay
mof cach chI fIof hon.
12.2.1. Thu tu uu ten hung vu thu tu uu ten cot
Cach fu nhIon do doc mof bang chu nhaf Ia doc cac phan fu o hang fhu nhaf
fruoc, fu fraI sang phaI, sau do don cac phan fu hang fhu haI, va cu fho fIop fuc
cho don khI hang cuoI da duoc doc xong. ay cung Ia fhu fu ma da so cac frnh
bIon djch Iuu fru bang chu nhaf, va duoc goI Ia fhu fu uu fIon hang |row-major
ordering). Chang han, mof bang fruu fuong co hang duoc danh so Ia fu 1 don 2,
va cof duoc danh so fu 5 don 7, fh fhu fu cua cac phan fu fhoo fhu fu uu fIon
hang nhu sau:
|1,5) |1,6) |1,7) |2,5) |2,6) |2,7)
ay cung Ia fhu fu duoc dung frong C++ va hau hof cac ngon ngu Iap frnh cap
cao do Iuu fru cac phan fu cua mof mang haI chIou. IORTRAN chuan IaI su dung
fhu fu uu fIon cof, frong do cac phan fu cua cof fhu nhaf duoc Iuu fruoc, roI don
cof fhu haI,v.v...V du fhu fu uu fIon cof nhu sau:
|1,5) |2,5) |1,6) |2,6) |1,7) |2,7)
Hnh 12.1 mInh hoa cac fhu fu uu fIon cho mof bang co 3 hang va 4 cof.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 307
12.2.2. Ounh ch so cho bung chu nhut
Mof cach fong quaf, frnh bIon djch co fho baf dau fu chI so |I,j) do fnh vj fr
frong mof mang noI fIop ma mof phan fu fuong ung frong bang duoc Iuu fru.
Chung fa so dua ra cong fhuc fnh foan sau day. o don gIan chung fa chI su
dung fhu fu uu fIon hang cung voI gIa fhIof Ia hang duoc danh so fu 0 don m-1, va
cof fu 0 don n-1. Truong hop cac hang va cac cof duoc danh so khong phaI fu 0
duoc xom nhu baI fap. So phan fu cua bang so Ia mn, va do cung Ia so phan fu
frong hIon fhuc IIon fuc frong mang. Chung fa danh so cac phan fu frong mang fu
0 don mn 1. o co cong fhuc fnh vj fr cua phan fu |I,j) frong mang, fruoc hof
chung fa quan saf mof vaI fruong hop dac bIof. Phan fu |0,0) nam faI vj fr 0, cac
phan fu fhuoc hang dau fIon frong bang raf do fm fhay: |0,j) nam faI vj fr j.
Phan fu dau cua hang fhu haI |1,0) nam ngay sau phan fu |0,n-1), do Ia vj fr n.
TIop fhoo, chung fa fhay phan fu |1,j) nam faI vj fr n+j. Cac phan fu cua hang ko
fIop cung so nam sau so phan fu cua haI hang fruoc do |2n phan fu). o do phan
fu |2,j) nam faI vj fr 2n+j. Mof cach fong quaf, cac phan fu fhuoc hang I co n I
phan fu pha fruoc, non cong fhuc chung Ia:
Phan t (i,j) trong bang ch nhat nam tai v tr n i + j trong mang noi tiep.
Cong fhuc nay cho bIof vj fr frong mang noI fIop ma mof phan fu frong bang
chu nhaf duoc Iuu fru, va duoc goI Ia ham chI so |index function).
HInh 12.1 Iou dIon noI fIop cho mang chu nhaf
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 308
12.2.3. Ben the: mung truy xuut
VIoc fnh foan cho cac ham chI so cua cac bang chu nhaf fhaf ra khong kho
Iam, cac frnh bIon djch cua hau hof cac ngon ngu cap cao so djch ham nay sang
ngon ngu may fhanh mof so buoc fnh foan can fhIof. Tuy nhIon, fron cac may
fnh nho, phop nhan fhuong fhuc hIon raf cham, mof phuong phap khac co fho
duoc su dung do franh phop nhan.
Phuong phap nay Iuu mof mang phu fro chua mof phan cua bang nhan voI
fhua so Ia n:
0, n, 2n, 3n, ..., |m-1)n.
Iuu y rang mang nay nho hon bang chu nhaf raf nhIou, non no co fho duoc
Iuu fhuong fruc frong bo nho. Cac phan fu cua no chI phaI fnh mof Ian |va
chung co fho duoc fnh chI bang phop cong). KhI gap mof you cau fham chIou
don bang chu nhaf, frnh bIon djch co fho fm vj fr cua phan fu |I,j) bang cach
Iay phan fu fhu I frong mang phu fro cong fhom j do don vj fr can co.
Mang phu fro nay cung cap cho chung fa mof v du dau fIon vo mof mang
fruy xuaf |access mang) |Hnh 12.2). NoI chung, mof mang fruy xuaf Ia mof
mang phu fro duoc su dung do fm mof du IIou duoc Iuu fru dau do. Mang fruy
xuaf co khI con duoc goI Ia vector fruy xuaf |access vector).
12.3. Cuc bung vo nheu hInh dung khuc nhuu
Thong fIn fhuong Iuu frong mof bang chu nhaf co fho khong can don moI vj fr
frong hnh chu nhaf do. Nou chung fa djnh nghIa ma fran Ia mof bang chu nhaf
gom cac con so, fh fhuong Ia mof vaI vj fr frong ma fran do mang frj 0. Mof vaI
v du nhu fho duoc mInh hoa frong hnh 12.3. Ngay ca khI cac phan fu frong mof
bang khong phaI Ia nhung con so, cac vj fr duoc su dung fhuc su cung co fho
khong phaI Ia faf ca hnh chu nhaf, va nhu vay co fho co cach hIon fhuc khac hay
hon fhay v su dung mof bang chu nhaf voI nhIou cho frong. Trong phan nay,
chung fa fm hIou cac cach hIon fhuc cac bang voI nhIou hnh dang khac nhau,
HInh 12.2 Mang fruy xuaf cho bang chu nhaf
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 309
nhung cach nay so khong doI hoI vung nho cho nhung phan fu vang maf nhu
frong bang chu nhaf.
12.3.1. Cuc bung tum guc
Chung fa hay xom xof cach bIou dIon bang fam gIac duoI nhu frong hnh vo
12.3. Mof bang nhu vay chI can cac chI so |I,j) voI Ij. Chung fa co fho hIon fhuc
mof bang fam gIac frong mof mang IIon fuc bang cach fruof moI hang ra sau
hang nam ngay fron no, nhu cach bIou dIon o hnh 12.4.
o xay dung ham chI so mo fa cach anh xa nay, chung fa cung gIa su rang cac
hang va cac cof dou duoc danh so baf dau fu 0. o fm vj fr cua phan fu |I,j)
frong mang IIon fuc chung fa can fm vj fr baf dau cua hang I, sau do do fm cof j
chung fa chI vIoc cong fhom j vao dIom baf dau cua hang I. Nou cac phan fu cua
mang IIon fuc cung duoc danh so baf dau fu 0, fh chI so cua dIom baf dau cua
hang fhu I cung chnh Ia so phan fu nam o cac hang fron hang I. Ro rang Ia fron
hang fhu 0 co 0 phan fu, va chI co mof phan fu cua hang 0 Ia xuaf hIon fruoc
hang 1. oI voI hang 2, co 1 + 2 = 3 pha n fu dI fruoc, va frong fruong hop fong
quaf chung fa fhay so phan fu co fruoc hang I chnh xac Ia:
1 + 2 + . . . + I =
2
1
I|I + 1).
HInh 12.3 Cac bang voI nhIou dang khac nhau.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 310
Vay phan fu |I,j) frong bang fam gIac fuong ung phan fu
2
1
I|I + 1) + j cua
mang IIon fuc.
Cung nhu chung fa da Iam cho cac bang chu nhaf, chung fa cung franh moI
phop nhan va chIa bang cach fao mof mang fruy xuaf chua cac phan fu fuong ung
voI cac chI so cua cac hang frong bang fam gIac. Vj fr I frong mang fruy xuaf
mang frj
2
1
I |I + 1). Mang fruy xuaf duoc fnh foan chI mof Ian khI baf dau
chuong frnh, va duoc su dung Iap IaI cho moI fruy xuaf don bang fam gIac. Chu y
rang ngay ca vIoc fnh foan ban dau cung khong can don phop nhan hoac chIa ma
ch co phop cong fhoo fhu fu sau ma fhoI:
0, 1, 1+2, |1 + 2) + 3, . . .
12.3.2. Cuc bung lo lom
HInh 12.4 HIon fhuc IIon fuc cua bang fam gIac.
HInh 12.5 Mang fruy xuaf cho bang IoI Iom.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 311
Trong ca haI v du da do cap fruoc chung fa da xom xof mof bang duoc fao fu
cac hang cua no. Trong cac bang chu nhaf fhong fhuong, faf ca cac hang dou co
cung chIou daI; frong bang fam gIac, chIou daI moI hang co fho duoc fnh dua vao
mof cong fhuc don gIan. ay gIo chung fa hay xom xof don fruong hop cua cac
bang IoI Iom fua nhu hnh 12.5, khong co mof moI quan ho co fho doan fruoc nao
gIua vj fr cua mof hang va chIou daI cua no.
Mof dIou hIon nhIon duoc nhn fhay fu so do rang, fuy chung fa khong fho xay
dung mof ham fhu fu nao do anh xa mof bang IoI Iom sang vung nho IIon fuc,
nhung vIoc su dung mof mang fruy xuaf cung do dang nhu cac v du fruoc, va cac
phan fu cua bang IoI Iom co fho duoc fruy xuaf mof cach nhanh chong. o fao
mang fruy xuaf, chung fa phaI xay dung bang IoI Iom fhoo fhu fu von co cua no,
baf dau fu hang dau fIon. Phan fu 0 cua mang fruy xuaf, cung nhu fruoc kIa, Ia
baf dau cua mang IIon fuc. Sau khI moI hang cua bang IoI Iom duoc xay dung
xong, chI so cua vj fr dau fIon chua duoc su dung foI cua vung nho IIon fuc chnh
Ia frj cua phan fu ko fIop frong mang fruy xuaf va duoc su dung do baf dau xay
dung hang ko cua bang IoI Iom.
12.3.3. Cuc bung chuyen do
TIop fhoo, chung fa hay xom xof mof v du mInh hoa vIoc su dung nhIou mang
fruy xuaf do fham chIou cung Iuc don mof bang cac phan fu qua mof vaI khoa
khac nhau.
Chung fa xom xof nhIom vu cua mof cong fy dIon fhoaI frong vIoc fruy xuaf
don cac phan fu vo cac khach hang cua ho. o In danh muc dIon fhoaI, cac phan
fu can sap fhu fu fon khach hang fhoo alphabet. Tuy nhIon, do xu Iy cac cuoc goI
duong daI, cac phan fu IaI can co fhu fu fhoo so dIon fhoaI. NgoaI ra, do fIon
hanh bao fr djnh ky, danh sach cac khach hang sap fhu fu fhoo dja chI so co ch
cho cac nhan vIon bao fr. Nhu vay, cong fy dIon fhoaI can phaI Iuu ca ba, hoac
nhIou hon, danh sach cac khach hang fhoo cac fhu fu khac nhau. ang cach nay,
khong nhung fon kom nhIou vung Iuu fru ma con co kha nang fhong fIn bj saI
Ioch do khong duoc cap nhaf dong fhoI.
Chung fa co fho franh duoc vIoc phaI Iuu nhIou Ian cung mof fap cac phan fu
bang cach su dung cac mang fruy xuaf, va chung fa co fho fm cac phan fu fhoo
baf ky mof khoa nao mof cach nhanh cho ng chang khac g chung da duoc sap fhu
fu fhoo khoa do. Chung fa so fao mof mang fruy xuaf cho fon cac khach hang.
Phan fu dau fIon cua mang nay chua vj fr cua khach hang dung dau danh sach
fhoo aIphabof. Phan fu fhu haI chua vj fr khach hang fhu haI, va cu fho. Trong
mang fruy xuaf fhu haI, phan fu dau fIon chua vj fr cua khach hang co so dIon
fhoaI nho nhaf. Tuong fu, mang fruy xuaf fhu ba co cac phan fu chua vj fr cua
cac khach hang fhoo fhu fu dja chI cua ho. |Hnh 12.6)
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 312
Chung fa Iuu y rang frong phuong phap nay cac fhanh phan du IIou duoc xom
nhu Ia khoa dou duoc xu Iy cung mof cach. Khong co Iy do g buoc cac phan fu
phaI co fhu fu vaf Iy uu fIon fhoo khoa nay ma khong fhoo khoa khac. Cac phan
fu co fho duoc Iuu fru fhoo mof fhu fu fuy y, co fho noI do Ia fhu fu ma chung
duoc nhap vao ho fhong. Cung khong co su khac nhau gIua vIoc cac phan fu duoc
Iuu frong mof danh sach IIon fuc Ia mang |ma cac phan fu cua cac mang fruy xuaf
chua cac chI so cua mang nay) hay cac phan fu dang fhuoc mof danh sach IIon kof
|cac phan fu cua cac mang fruy xuaf chua cac dja chI don fung phan fu rIong).
Trong moI fruong hop, chnh cac mang fruy xuaf duoc su dung do fruy xuaf fhong
fIn, va, cung gIong nhu cac mang IIon fuc fhong fhuong, chung co fho duoc su
dung frong vIoc fra cuu cac bang, hoac fm kIom nhj phan, hoac voI baf ky muc
dch nao khac fhch hop voI cach hIon fhuc IIon fuc.
HInh 12.6 Mang fruy xuaf cho nhIou khoa: bang chuyon doI
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 313
12.4. Bung: Mot keu du leu truu tuong mo
Tu dau chuong nay chung fa da bIof don mof so ham chI so duoc dung do fm
kIom cac phan fu frong cac bang, sau do chung fa cung da gap cac mang fruy xuaf
Ia cac mang duoc dung voI cung mof muc dch nhu cac ham chI so. Co mof su
gIong nhau raf Ion gIua cac ham voI vIoc fra cuu bang: voI mof ham, chung fa baf
dau bang mof fhong so do fnh mof gIa frj fuong ung; voI mof bang, chung fa baf
dau bang mof chI so do fruy xuaf mof gIa frj du IIou fuong ung duoc Iuu frong
bang. Chung fa hay su dung su fuong fu nay do xay dung mof djnh nghIa hnh
fhuc cho fhuaf ngu bung.
12.4.1. Cuc hum
Trong foan hoc, mof ham duoc djnh nghIa dua fron haI fap hop va su fuong
ung fu cac phan fu cua fap fhu nhaf don cac phan fu cua fap fhu haI. Nou f Ia mof
ham fu fap A sang fap , fh f gan cho moI phan fu cua A mof phan fu duy nhaf
cua . Tap A duoc goI Ia domain cua f, con fap duoc goI Ia codomain cua f. Tap
con cua chI chua cac phan fu Ia cac frj cua f duoc goI Ia range cua f. jnh nghIa
nay duoc mInh hoa frong hnh 12.8.
HInh 12.? V du vo bang fam gIac doI xung qua 0.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 314
HInh 12.8 Domain, codomain va range cua mof ham
VIoc fruy xuaf bang baf dau bang mof chI so va bang duoc su dung do fra cuu
mof frj fuong ung. oI voI mof bang chung fa goI domain Ia fap chI so |index set),
va codomain Ia kIou co so |base type) hoac kIou frj |value type). Iay v du, chung
fa co mof khaI bao mang nhu sau:
doubl e ar r ay[ n] ;
fh fap chI so Ia fap cac so nguyon fu 0 don n-1, va kIou co so Ia fap faf ca cac so
fhuc. Iay v du fhu haI, chung fa hay xof mof bang fam gIac co m hang, moI phan
fu co kIou i t em. KIou co so so Ia kIou i t emva fap chI so Ia fap cac cap so nguyon
{( i , j ) | 0 j i < m}
12.4.2. Mot keu du leu truu tuong
Chung fa dang dI don mof djnh nghIa cho bang nhu mof kIou du IIou fruu
fuong moI, dong fhoI frong cac chuong fruoc chung fa da bIof rang do hoan faf
mof djnh nghIa cho mof cau fruc du IIou, chung fa can phaI dac fa cac fac vu dI
kom.
nh ngha: Mof bang voI fap chI so I va kIou co so T Ia mof ham fu I don T kom
cac fac vu sau:
1. Access |fruy xuaf bang): Xac djnh frj cua ham fhoo baf ky mof chI so frong I.
2. Assignment |ghI bang): Sua doI ham bang cach fhay doI frj cua no faI mof chI
so nao do frong I fhanh mof frj moI duoc chI ra frong phop gan.
HaI fac vu nay Ia faf ca nhung g duoc cung cap boI cac mang frong C++ hoac
mof vaI ngon ngu khac, nhung do khong phaI Ia Iy do do co fho ngan can chung
fa fhom mof so fac vu khac cho mof bang fruu fuong. Nou so sanh voI djnh nghIa
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 315
cua mof danh sach |list), chung fa da co cac fac vu nhu fhom phan fu, xoa phan fu
cung nhu fruy xuaf hoac cap nhaf IaI. Vay chung fa co fho Iam fuong fu doI voI
bang.
Cac tac vu bo sung cho bang:
1. Creation |Tao): Tao mof ham fu I vao T.
2. Clearing |on dop): IoaI bo moI phan fu frong fap chI so I, domain so Ia mof
fap rong.
3. Insertion |Thom): Thom mof phan fu x vao fap chI so I va xac djnh mof frj
fuong ung cua ham faI x.
4. Deletion |Xoa): IoaI bo mof phan fu x frong fap chI so I va han cho chI cho
ham xac djnh fron fap chI so con IaI.
12.4.3. Hen thuc
jnh nghIa fron chI moI Ia djnh nghIa cua mof kIou du IIou fruu fuong ma
chua noI g don cach hIon fhuc. No cung khong ho nhac don cac ham chI so hay
cac mang fruy xuaf. Chung fa hay xom hnh mInh hoa frong hnh 12.9. Phan fron
cua hnh nay cho chung fa fhay mof su fruu fuong frong djnh nghIa, fruy xuaf
bang don gIan chI Ia mof anh xa fu mof fap chI so sang mof kIou co so. Phan duoI
cua hnh Ia y fuong fong quaf cua phan hIon fhuc. Mof ham chI so hoac mof mang
fruy xuaf nhan fhong so fu mof fap chI so fhoo mof dang da duoc dac fa nao do.
Chang han |I,j) frong bang 2 chIou hoac |I,j,k) frong bang 3 chIou voI I, j, k da co
mIon xac djnh da djnh. Kof qua cua ham chI so hoac mang fruy xuaf so Ia mof
frong cac frj frong mIon cac chI so, chang han fap con cua fap cac so nguyon.
MIon frj nay co fho duoc su dung fruc fIop nhu chI so cho mang va duoc cung cap
boI ngon ngu Iap frnh.
on day xom nhu chung fa da gIoI fhIou xong mof kIou cau fruc du IIou moI,
do Ia bang. Tuy fung muc dch cua cac ung dung, bang co fho co nhIou phIon ban
khac nhau. Phan djnh nghIa chI fIof hon cho cac phIon ban nay cung nhu cac
cach hIon fhuc cua chung duoc xom nhu baI fap. Phan fIop fhoo day frnh bay su
gIong va khac nhau gIua danh sach va bang. Sau do chung fa so fIop fuc Iam quon
voI mof cau fruc du IIou kha dac bIof va raf pho bIon, do Ia bang bam. Cau fruc
du IIou bang bam cung xuaf phaf fu y fuong su dung bang nhu phan nay da gIoI
fhIou.
12.4.4. So sunh guu dunh such vu bung
Chung fa hay so sanh haI kIou du IIou fruu fuong danh sach va bang. Non
fang foan hoc co ban cua danh sach Ia mot chuo no tep cuc phun tu, con doI
voI bang, do Ia tup hop vu hum. ChuoI noI fIop co mof fraf fu ngam frong do, do
Ia phan fu dau fIon, phan fu fhu haI, v.v..., con fap hop va ham khong co fhu fu.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 316
VIoc fruy xuaf fhong fIn frong mof danh sach fhuong IIon quan don vIoc fm
kIom, nhung vIoc fruy xuaf fhong fIn frong bang doI hoI nhung phuong phap
khac, do Ia cac phuong phap co fho dI fhang don phan fu mong muon. ThoI gIan
can fhIof do fm kIom frong danh sach noI chung phu fhuoc vao n Ia so phan fu
frong danh sach va f nhaf Ia bang Ig n, nhung fhoI gIan do fruy xuaf bang
fhuong khong phu fhuoc vao so phan fu frong bang, va fhuong Ia O|1). V Iy do
nay, frong nhIou ung dung, vIoc fruy xuaf bang fhuc su nhanh hon vIoc fm kIom
frong mof danh sach.
Maf khac, duyet lu mot tuc vu tu nhen do vo mot dunh such, nhung
do vo bung thI khong. VIoc dI chuyon xuyon suof mof danh sach do fhuc hIon
mof fac vu nao do Ion fung phan fu cua no noI chung Ia do dang. Iou nay doI voI
bang khong do dang chuf nao, dac bIof frong fruong hop co you cau fruoc vo mof
fraf fu nao do cua cac phan fu duoc duyof.
CuoI cung, chung fa can Iam ro su khac nhau gIua bang va mang. NoI chung,
chung fa dung fu bang nhu Ia chung fa da djnh nghIa frong phan vua roI va gIoI
han fu mang chI voI nghIa nhu Ia mof phuong fIon dung do Iap frnh cua C++ va
phan Ion cac ngon ngu cap cao, cac mang nay fhuong duoc su dung do hIon fhu c
ca haI: bang va danh sach IIon fuc.
HInh 12.9 HIon fhuc cua bang
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 317
12.5. Bung bum
KhI gIoI fhIou fong quaf vo bang cung nhu cach su dung ham chI so va mang
fruy xuaf, chung fa can nhan ra mof dIou rang, fhong so cho ham chI so hoac
mang fruy xuaf phan nao phan anh vj fr, hay noI ro hon, do Ia fraf fu cua phan
fu can fruy xuaf frong bang. Chang han fraf fu fhoo chI so hang va cof frong
bang |I,j), hay fruong hop danh sach cac khach hang su dung dIon fhoaI: fon cua
cac khach hang co fhu fu fhoo alphabet. ang bam ma chung fa so nghIon cuu
fIop fhoo mang mof dac dIom hoan foan khac. VIoc fruy xuaf bang baf dau fu gIa
frj cua khoa frong phan fu du IIou, va fhong fhuong khoa nay khong IIon quan
don fraf fu frong hang hoac cof cua bang do co fho su dung mof ham chI so don
gIan cho ra vj fr cua no frong bang nhu o phan fron da gIoI fhIou.
12.5.1. Cuc bung thuu
12.5.1.1. Cuc hum ch so
Iou chung fa co fho Iam Ia xay dung su fuong ung mof mof gIua cac khoa
va cac chI so ma chung fa su dung do fruy xuaf bang. So voI cac phan fruoc, ham
chI so ma chung fa xay dung o day so phuc fap hon, v co khI chung fa can don su
bIon doI cua cac khoa, chang han fu cac chu caI sang cac so nguyon. Thoo nguyon
fac, dIou nay Iuon co fho Iam duoc.
Kho khan fhuc su chI Ia khI so cac khoa co fho co vuof ra ngoaI khong gIan
cua bang. Iay v du, nou cac khoa Ia cac fu co 8 ky fu, fh co fho co don 26
8
2 x
10
11
khoa khac nhau, va day cung Ia con so Ion hon raf nhIou dung Iuong cho
phop cua mof bo nho foc do cao. Tuy nhIon frong fhuc fo, chI co mof so khong Ion
cac khoa nay Ia fhuc su xuaf hIon. Iou do co nghIa Ia bang chua so raf fhua fhof.
Chung fa co fho xom bang duoc danh chI so bang mof fap raf Ion, nhung chI co
mof so fuong doI f vj fr Ia fhuc su co phan fu.
12.5.1.2. Khu nem bum
Nham franh mof bang qua fhua fhof co nhIou vj fr khong bao gIo duoc dung
don, chung fa Iam quon voI khaI nIom ba m. Y fuong cua bang bam |hnh 12.10) Ia
cho phop anh xa mof fap cac khoa khac nhau vao cac vj fr frong mof mang voI
kch fhuoc cho phop. CoI kch fhuoc mang nay Ia hash_si ze, moI khoa so duoc
anh xa vao mof chI so frong khoang 0, hash_si ze-1|. Anh xa nay duoc goI Ia
ham bam |hash function). Mof cach Iy fuong, ham nay can co cach fnh don gIan
va phan bo cac khoa sao cho haI khoa khac nhau Iuon vao haI vj fr khac nhau.
Nhung do kch fhuoc mang Ia gIoI han va mIon frj cua cac khoa Ia raf Ion, dIou
nay Ia khong fho duoc. Chung fa chI co fho hy vong rang mof ham bam fof fh so
phan bo duoc cac khoa vao cac chI so mof cach kha dong dou va franh duoc hIon
fuong gom fu.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 318
Ham bam noI chung Iuon anh xa mof vaI khoa khac nhau vao cung mof chI so.
Nou phan fu can fm dang nam faI chI so duoc anh xa don, van do cua chung fa
xom nhu da duoc gIaI quyof; nguoc IaI, chung fa can su dung mof phuong phap
nao do do gIaI quyof dung do. VIoc dung do |collision) xay ra khI haI phan fu can
duoc chua frong cung mof vj fr cua bang.
Tron day Ia y fuong co ban cua vIoc su dung bang bam. Co ba van do chung fa
can xom xof khI su dung phuong phap bam:
Tm ham bam fof.
Xac djnh phuong phap gIaI quyof dung do.
Xac djnh kch fhuoc bang bam.
12.5.2. Luu chon hum bum
HaI fIou ch co ban do chon Iua mof ham bam Ia:
Ham bam can duoc fnh foan do dang va nhanh chong.
VIoc phan phoI cac khoa co fho xuaf hIon raI dou fron bang bam.
Nou chung fa bIof fruoc chnh xac nhung khoa nao so xuaf hIon, fh chung fa
co fho xay dung mof ham bam fhaf hIou qua, nhung noI chung chung fa fhuong
khong bIof fruoc dIou nay.
Chung fa can Iuu y rang mof ham bam khong ho co fnh ngau nhIon. KhI fnh
nhIou Ian cho cung mof khoa, mof ham bam phaI cho cung mof frj, co nhu vay fh
khoa moI co fho duoc fruy xuaf sau khI duoc Iuu fru.
HInh 12.10 ang bam
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 319
12.5.2.1. Chu luy phun du (modular arithmetic)
Truoc hof chung fa hay xom xof mof fruong hop fhaf don gIan. Nou cac khoa
Ia cac so nguyon, ham bam don gIan va pho bIon duoc dung Ia phop chIa cho
hash_si ze do Iay phan du, v nhu vay chung fa so co cac chI so fhuoc 0,
hash_si ze -1|. Tuy nhIon cung can Iuu y nhung fruong hop cac khoa fap frung
vao mof so gIa frj dac bIof nao do. Chang han nou hash_si ze = 10, ma phan Ion
cac khoa IaI co con so o hang don vj Ia 0. Su phan fan cac khoa phu fhuoc nhIou
vao phop chIa Iay phan du, do chnh Ia kch fhuoc cua bang bam. Nou kch fhuoc
do Ia mof boI so cua cac so nguyon nho nhu 2 hoac 10, fh raf nhIou khoa so cho
cung chI so nhu nhau, frong khI do co mof so chI so raf f duoc su dung don. Cach
chon phop chIa Iay phan du fof nhaf fhuong Ia chIa cho mof so nguyon fo |nhung
khong phaI Ia Iuon Iuon), kof qua so raI dou cac khoa frong bang bam hon. Nhu
vay, fhay v chon bang bam kch fhuoc 1000, chung fa non chon kch fhuoc 997
hoac 1009; cach chon 2
10
= 1024 Ia mof cach chon raf do.
Thong fhuong, cac khoa Ia cac chuoI ky fu. Mof cach fu nhIon, nguoI fa fhuong
Iay mof so nguyon bang voI fong cua cac ma ASCI I cua cac ky fu frong khoa Iam
daI dIon cho no. Ham bam voI cach vIof cua C chuan sau day fhaf don gIan va
fnh cung raf nhanh:
Tuy nhIon, nou hash_si ze Ion, ham so khong phan bo cac khoa fof. Iay v du
voI hash_si ze =10007 |mof so nguyon fo). CIa su cac khoa co chIou daI 8 ky fu
hoac f hon. MoI ky fu co ma ASCI I <=127. CIa frj cua ham bam chI co fho fu 0
don 127 x 8 = 1016.
Mof caI fIon khac cua ham bam nhu sau: voI gIa fhIof rang cac khoa dou co f
nhaf 3 ky fu, so 27 duoc dung v do Ia so ky fu frong bang chu caI fIong Anh
|fnh ca khoang frang).
i ndex Hash( const char *Key, i nt hash_si ze)
{
unsi gned i nt HashVal = 0;
whi l e ( *Key ! = \ 0 )
{
HashVal += *Key;
Key++;
}
r et ur n HashVal %hash_si ze;
}
i ndex Hash( const char *Key, i nt hash_si ze)
{
r et ur n ( Key[ 0] + 27*Key[ 1] + 27*27*Key[ 2] ) %hash_si ze;
}
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 320
Ham nay chI quan fam 3 ky fu dau cua cac khoa, nhung nou chung Ia ngau
nhIon va hash_sIzo Ia 10007 nhu fron, fh su phan bo kha dong dou. Iou khong
may o day Ia cac fu frong fIong Anh khong phaI Ia mof su ghop cac ky fu mof
cach ngau nhIon. Mac du co don 26
3
= 17576 kha nang ghop 3 ky fu, fhuc fo
frong fu dIon cho fhay chI co 2851 kha nang xay ra. Ngay ca khI khong co su
dung do xay ra gIua fung cap frong cac kha nang nay, fh cung chI co 28%vj fr
frong bang Ia duoc su dung.
Thom mof caI fIon khac nhu sau day:
Ham nay quan fam don moI ky fu frong khoa va noI chung co fho phan bo cac
khoa dong dou frong mof bang kch fhuoc fuong doI Ion. Trj cua ham duoc fnh
I=0
KeySi ze- 1
Key[ KeySi ze- i - 1] . 32
i
. ay Ia da fhuc voI ho so Ia 32 va su dung
cong fhuc Hornor. V du, do fnh h
k
= k
1
+27k
2
+27
2
k
3
, nguoI fa fnh
h
k
= ( ( k
3
) *27 +k
2
) *27 +k
1
. VIoc dung so 32 fhay so 27 Ia v voI 32 fh khong
can Iam phop nhan ma chI don gIan Ia phop djch chuyon bIf |32 = 2
5
), va fhuc
fo Ia dung phop XOR.
Ham fron day chua phaI Ia ham fof nhaf khI xof don fIou ch phan bo dong
dou, nhung no cho phop vIoc fnh foan duoc fhuc hIon raf nhanh chong. Nou khoa
qua daI fh no cung Io nhuoc dIom Ia phaI fnh qua Iau. Hon nua qua frnh djch
bIf so Iam maf dI fac dung cua cac ky fu da duoc xof fruoc. Thuc fo khac phuc
dIou nay bang cach khong su dung faf ca cac ky fu co frong khoa.
12.5.2.2. Cut xen (truncation)
Phuong phap caf xon bo qua mof phan cua khoa, phan con IaI duoc xom nhu
chI so |cac du IIou khong phaI so fh Iay fhoo bang ma cua chung). V du, nou
khoa Ia mof so nguyon 8 ky so va bang bam co 1000 vj fr, fh vIoc Iay fu vj fr
fhu nhaf, fhu haI va fhu nam ko fu phaI sang so Ia ham bam. Co nghIa Ia khoa
21296876 co chI so Ia 976. Caf xon Ia mof phuong phap cuc nhanh, nhung no
fhuong khong phan phoI cac khoa dou khap bang bam.
i ndex Hash( const char *Key, i nt hash_si ze)
{
unsi gned i nt HashVal = 0;
whi l e ( *Key ! = \ 0 )
{
HashVal = ( HashVal << 5 ) + *Key) ;
Key++;
}
r et ur n HashVal %hash_si ze;
}
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 321
12.5.2.3. Xuo tron (folding)
Y fuong xao fron |folding) duoI day gIup cho cac bo phan cua khoa dou co fho
fham gIa vao vIoc xac djnh kof qua cuoI cung cua ham bam. Tu bam o day co
nghIa Ia kof qua sInh ra co phan gIong voI khoa ban dau. NgoaI ra, su xao fron
cho phop chung fa hy vong rang moI khuon mau hoac su Iap IaI co fho xuaf hIon
frong cac khoa |hau qua cua fnh fhIou ngau nhIon cua du IIou frong fhuc fo) so bj
frIof fIou. Co nhu vay fh cac kof qua moI duoc phan phoI fhoo cung mof quy Iuaf
nhu nhau ma khong co su frung Iap cua fung nhom kof qua va chung fa franh
duoc hIon fuong gom fu. O day chung fa fhay rang fhuaf ngu bam mang fnh mo
fa ro nhaf. Tuy nhIon frong mof so faI IIou khac nguoI fa dung cac cac fu mang
fnh ky fhuaf hon nhu bo nho phan fan |scatter-storage) hoac phop bIon doI
khoa |key-transformation).
Phuong phap xao fron chIa khoa Iam nhIou phan va kof noI cac phan nay IaI
fhoo mof cach fhch hop |fhuong su dung phop cong hoac phop nhan). Iay v du,
mof so nguyon 8 ky so co fho duoc chIa Iam 3 nhom gom 3, 3, va 2 ky so, cac
nhom nay duoc cong IaI voI nhau, sau do co fho duoc caf xon bof nou can fhIof do
cho ra cac chI so phu hop kch fhuoc bang bam. Khoa 21296876 so duoc bam
fhanh 212 + 968 + 76 = 1256, caf ngan con 256. o moI du IIou frong khoa dou co
anh huong don kof qua ham bam non phuong phap nay Iam cho cac khoa raI dou
fron bang bam hon Ia phuong phap caf xon nou fron.
Tom IaI, chung fa da xom xof mof so phuong phap ma chung fa co fho kof hop
IaI fhoo nhIou cach khac nhau do xay dung ham bam. Iay phan du fhuong Ia mof
cach fof do kof fhuc vIoc fnh foan cua mof ham bam, do no vua co fho daf duoc
su raI dou cac khoa frong bang bam vua bao dam kof qua nhan duoc Iuon nam
frong mIon cac chI so cho phop.
12.5.3. Phuc thuo gu thuut cho cuc thuo tuc du leu trong bung bum
Truoc hof, chung fa can khaI bao mof mang do chua bang bam. Sau do, cac vj
fr frong mang can duoc khoI fao Ia frong. CIa frj khoI fao phu fhuoc vao ung
dung, fhong fhuong chung fa cho cac vj fr frong nay chua mof gIa frj dac bIof
nao do. Chang han, voI cac khoa Ia cac chu caI, mof frj chua foan ky fu frong co
fho bIou dIon mof vj fr frong.
o fhom mof phan fu vao bang bam, can fnh ham bam cho khoa cua no. Nou
vj fr fm fhay con frong, phan fu so duoc fhom vao; nou da co phan fu faI vj fr
nay va khoa cua no frung voI khoa cua phan fu can fhom fh vIoc fhom so khong
duoc fhuc hIon; fruong hop cuoI cung, nou faI vj fr fm fhay da co mof phan fu
nhung cua mof khoa khac, chung fa so ap dung mof phuong phap gIaI quyof dung
do nao do do fm don mof vj fr khac cho vIoc fhom phan fu moI cua chung fa.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 322
VIoc fruy xuaf mof phan fu voI khoa cho fruoc duoc Iam fuong fu. Truoc fIon,
ham bam duoc fnh cho khoa cho fruoc. Nou phan fu can fm dang nam faI vj fr
duoc chI boI ham bam, fh vIoc fruy xuaf so duoc fhuc hIon fhanh cong; nguoc IaI,
frong khI ma vj fr dang xof khong frong va moI vj fr chua duoc xof don, can
fIon hanh cac buoc fuong fu nhu cac buoc da duoc su dung khI gIaI quyof dung do
frong qua frnh fhom vao. Nou frong khI fm kIom gap mof vj fr frong, hoac khI
moI vj fr da duoc xof don, fh co fho kof Iuan vIoc fm kIom fhaf baI: khong co
phan fu voI khoa can fm frong bang bam.
12.5.4. VI du trong C++
Nhu mof v du don gIan, chung fa so vIof mof ham bam frong C++ do chuyon
doI mof khoa gom 8 ky fu chu caI sang mof so nguyon frong mIon
0 . . hash_si ze 1.
Chung fa co mof Iop Key voI cac phuong fhuc nhu sau:
cl ass Key: publ i c St r i ng{
publ i c:
char key_l et t er ( i nt posi t i on) const ;
voi d make_bl ank( ) ;
/ / Cac const r uct or va cac phuong fhuc khac.
};
o gIam cong suc Iap frnh khI hIon fhuc Iop, chung fa chon cach fhua ko cac
phuong fhuc cua Iop String frong chuong 5. Chung fa so do phaI vIof IaI cac fac
vu so sanh. Phuong fhuc key_letter(int position) fra vo ky fu faI vj fr
position frong khoa, hoac fra vo khoang frang nou khoa co chIou daI nho hon n.
Phuong fhuc make_blank fao mof khoa frong.
i nt hash( const Key &t ar get )
/ *
post: Ham bam fron t ar get fra vo frj frong mIon 0 . . hash_si ze- 1.
uses: Cac phuong fhuc cua Iop Key.
*/
{
i nt val ue = 0;
f or ( i nt posi t i on = 0; posi t i on < 8; posi t i on++)
val ue = 4 * val ue + t ar get . key_l et t er ( posi t i on) ;
r et ur n val ue %hash_si ze;
}
Ham bam fron don gIan chI cong don cac ma cua moI ky fu frong khoa sau khI
da nhan voI 4. Chung fa khong fho Iy gIaI duoc rang phuong phap nay Ia fof hon
|hoac xau hon) mof vaI phuong phap khac. Chung fa cung co fho Iay ma cua ky fu
fru dI mof so nao do, roI nhan fung cap voI nhau, hoac bo qua mof vaI ky fu nao
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 323
do. oI khI mof ung dung so cho fhay mof ham bam nay Ia fof hon mof ham bam
khac, doI khI can phaI co su khao saf bang fhuc nghIom moI chI ra duoc ham nao
Ia fof hon.
12.5.5. Gu quyet dung do bung phuong phup d{u ch mo
Co haI nhom phuong phap gIaI quyof dung do: nhom phuong phap dja chI mo
va nhom phuong phap noI kof. Nhom phuong phap dja chI mo chI su dung cac
mang cap phaf fInh. Nhom phuong phap noI kof co su dung nhung vung nho cap
phaf dong duoc quan Iy boI cac con fro noI kof.
uoI day Ia cac phuong phap dung dja chI mo.
12.5.5.1. Thu tuyen tInh
Phuong phap don gIan nhaf do gIaI quyof dung do Ia baf dau fu vj fr fra vo fu
ham bam co xay ra dung do, vIoc fm kIom so fIop fuc mof cach fuan fu o cac vj
fr ko frong bang cho don khI gap khoa mong muon hoac mof vj fr frong. Phuong
phap nay duoc goI Ia phuong phap fhu fuyon fnh |linear probing). ang duoc xom
nhu mof mang vong, khI vIoc fm kIom daf don vj fr cuoI cua bang fh so quay vo
vj fr dau cua bang.
Hen tuong gom tu
Nhuoc dIom chnh cua phuong phap fhu fuyon fnh Ia khI co khoang mof nua
so vj fr frong bang da chua du IIou, khuynh huong gom fu so xuaf hIon; nghIa Ia,
cac phan fu so nam frong cac chuoI IIon fuc cac vj fr, gIua cac chuoI nay Ia nhung
Io hong. VIoc fm kIom fuan fu mof vj fr frong frong bang so ngay cang Iau hon.
Chung fa hay xom v du o hnh 12.11. CIa su mang co n vj fr fh xac suaf ma
ham bam chon mof vj fr nao do Ia 1/n. an dau vIoc phan phoI duoc fhuc hIon
kha dou frong bang |phan fron cua hnh). CIa su can fhom du IIou moI ma ham
bam fra vo vj fr b fh du IIou duoc fhom vao faI day, nhung nou ham bam fra vo
vj fr a ma vj fr nay da co du IIou, vIoc fhom vao so duoc fhuc hIon faI b. Nhu
vay xac suaf do vj fr b nhan du IIou Ia 2/n. TaI buoc fIop fhoo, khI du IIou can
fhom vao mof frong cac vj fr a, b, c, hoa c d fh cho frong fhuc su do fhom vao chI
Ia d, nhu vay xac suaf du IIou fhom vao d Ia 4/n. Sau do, xac suaf du IIou fhom
vao vj fr o IaI Ia 5/n. Va cu nhu fho, khI du IIou cang duoc fhom vao nhIou fh
chuoI IIon fuc cac vj fr da co du IIou baf dau fu a ngay cang daI ra. Nhu vay cach
fhuc hIon cua bang bam baf dau suy fhoaI dan foI su fm kIom fuan fu.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 324
HIon fuong gom fu chnh Ia nguyon nhan cua fnh fhIou on djnh. Nou mof so
f cac khoa ngau nhIon nam ko nhau, fh sau do cac khoa khac bong fro non kof
dnh voI chung, co nghIa Ia vj fr chua chung phu fhuoc Ian nhau, va su phan phoI
dan dan fro non fhIou can bang.
12.5.5.2. Hum gu tung
o franh hIon fuong gom fu, chung fa phaI su dung phuong phap phuc fap hon
do chon ra chuoI cac vj fr can xom xof don do fhom mof du IIou moI nao do khI
co xay ra dung do. Co nhIou cach do fhuc hIon. Y fuong chung Ia su dung mot
houc mot vu hum gu tung de xuc d{nh khoung cuch tu v{ trI vuu dung
do den mot v{ trI mo. Can Iuu y rang kof qua cua ham gIa fang khong duoc
phop fra vo frj 0.
Ham gIa fang co fho phu fhuoc vao khoa, hoac vao so Ian da fhu, sao cho co
fho franh duoc hIon fuong gom fu.
Truong hop fhu nhaf, kh hum gu tung phu thuoc vuo khou, chung fa co
khaI nIom bam IaI. o Ia cach su dung mof ham bam fhu haI. Kof qua cua ham
bam nay Ia so vj fr can dI chuyon ko fu vj fr da bj dung do fruoc do. Nou vj fr
nay IaI dung do, chung fa IaI dung mof ham bam khac nua do fm don vj fr fhu
ba, va cu fho. Cung co khI fu kof qua fnh cua ham bam fhu haI nguoI fa dung
Iuon so nay do dI chuyon gIua haI Ian fhu ko fIop.
Trong fruong hop fhu haI, hum gu tung phu thuoc vuo so lun du thu, co
fho ko ra day phuong phap fhu bac haI.
Thu buc hu
Nou co su dung do faI dja chI bam duoc h, phuong phap fhu bac haI |quadratic
probing) fhu cac vj fr ko fIop Ia h+1, h+4, h+9, ... frong bang, co nghIa Ia cac
vj fr h + i
2
, voI I Ia Ian fhu. NoI cach khac, ham gIa fang Ia i
2
.
HInh 12.11 HIon fuong gom fu frong bang bam.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 325
Phuong phap fhu fuyon fnh da nou fron cung co fho xom nhu mof fruong hop
su dung ham gIa fang Ia i .
Phuong phap fhu bac haI fhuc su co Iam gIam hIon fuong gom fu, nhung fhuc
fo fhuong no khong fho fhu hof moI vj fr frong bang. oI voI mof vaI gIa frj cua
hash_si ze, ham i
2
so fhu mof so fuong doI f cac vj fr frong bang. Iay v du,
khI hash_si ze Ia mof boI so Ion cua 2, chI khoang mof phan sau so cac vj fr
frong bang bam Ia duoc fhu. KhI hash_si ze Ia mof so nguyon fo, fhu bac haI so
daf duoc mof nua so vj fr frong bang bam.
o chung mInh dIou fron, gIa su rang hash_si ze Ia mof so nguyon fo. CIa su
chung fa cung daf mof vj fr khI fhu Ian fhu i va Ian fhu i + j voI j Ia mof so
nguyon > 0. CIa su j Ia mof so nguyon nho nhaf fhoo dIou kIon fron. CIa frj fnh
duoc boI ham bam Ian fhu i va Ian fhu i + j khac nhau boI mof boI so cua
hash_si ze. NoI cach khac,
h + i
2
h + ( i + j )
2
( mod hash_si ze)
Ion doI bIou fhuc fron fa co:
j
2
+ 2i j = j ( j + 2i ) 0 ( mod hash_si ze) .
Iou fhuc nay co nghIa Ia j ( j + 2i ) chIa hof cho hash_si ze. Mof fch chIa hof
cho mof so nguyon fo chI khI mof frong cac fhua so cua fch do chIa hof cho so
nguyon fo do. Vay hoac j chIa hof cho hash_sIzo, hoac j +2i chIa hof cho
hash_si ze. Trong fruong hop fhu nhaf, chung fa da phaI fhu j =hash_si ze Ian
fruoc khI gap IaI vj fr da fhu voI i |chung fa nho rang j Ia so nho nhaf fhoo gIa
fhIof). Tuy nhIon fruong hop fhu haI so xay ra som hon, khI j =hash_si ze 2i ,
hoac khI bIou fhuc fang fhom hash_si ze nou bIou fhuc nay am. o do fong so vj
fr khac nhau duoc fhu so Ia
( hash_si ze + 1) / 2.
KhI da fhu voI so Ian nhu fron chung fa co fho xom nhu bang da day.
Chu y rang phuong phap fhu bac haI co fho duoc fhuc hIon ma khong can
phop nhan: Sau Ian fhu fhu nhaf faI vj fr h, bIon fang duoc gan Ia 1. TaI moI Ian
fhu fhanh cong, bIon fang so fang fhom 2 sau khI no da duoc fhom vao vj fr
fruoc do.
o 1 + 3 + 5 + . . . + ( 2i - 1) = i
2
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 326
doI voI moI i 1 , Ian fhu i so fm faI vj fr h +1 +. . . +( 2i - 1) =h+i
2
, fhoo
nhu mong muon.
12.5.5.3. Thu nguu nhen
Phuong phap cuoI cung Ia su dung so ngau nhIon duoc sInh ra do Iam bIon gIa
fang. Chung fa chI duoc dung mof bo sInh so ngau nhIon do fu mof so baf dau cho
fruoc no Iuon Iuon sInh ra cung mof chuoI cac so ngau nhIon ko fIop. ay Ia mof
phuong phap raf fof do franh hIon fuong gom fu, nhung no co fho cham hon cac
phuong phap khac.
12.5.5.4. Gu thuut C++
o kof fhuc vIoc nghIon cuu vo phuong phap dja chI mo, chung fa co mof v du
C++ voI cac khoa Ia cac ky fu chu caI. Chung fa gIa su rang Iop Key va Iop
Recor d co cac dac fnh ma chung fa vua su dung frong haI phan cuoI. Iop Key co
phuong fhuc key_letter(int position) do fra vo ky fu faI position, Iop
Recor d co phuong fhuc do Iay mof khoa cua mof phan fu.
ang bam cua chung fa so co khaI bao nhu sau:
const i nt hash_si ze = 997; / / So nguyon fo
cl ass Hash_table {
publ i c:
Hash_t abl e( ) ;
voi d cl ear ( ) ;
Er r or _code i nser t ( const Recor d &new_ent r y) ;
Er r or _code r et r i eve( const Key &t ar get , Recor d &f ound) const ;
pr i vat e:
Recor d table[ hash_si ze] ;
};
ang bam so duoc khoI fao sao cho faf ca cac phan fu frong mang dou chua
khoa dac bIof gom 8 khoang frang. ay Ia nhIom vu cua constructor:
Hash_t abl e: : Hash_table();
/ / post: ang bam duoc fao va duoc khoI fao Ia rong.
Phuong fhuc cl ear can do IoaI faf ca cac du IIou hIon co frong bang bam:
voi d Hash_t abl e: : clear();
/ / post: ang bam da duoc don dop va fro fhanh bang bam rong.
Mac du chung fa da baf dau dac fa cac phuong fhuc cua bang bam, chung fa so
khong fIop fuc phaf frIon fhanh mof goI fong quaf va day du. o vIoc chon mof
ham bam fof phu fhuoc nhIou vao IoaI cua khoa so duoc su dung, cac phuong fhuc
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 327
cua bang bam fhuong phu fhuoc manh mo vao fung ung dung rIong, mof goI fong
quaf cho mof bang bam Ia khong co IoI.
o mInh hoa cach vIof cac ham fIop fhoo, chung fa so su dung phuong phap
fhu bac haI do gIaI quyof dung do. Chung fa da chung mInh rang so Ian fhu foI da
co fho fhuc hIon fhoo phuong phap nay Ia ( hash_si ze+1) / 2, non so dung
bIon dom probe_count do kIom fra gIoI han nay.
VoI nhung quy uoc nhu fron, chung fa co phuong fhuc fhom mof phan fu
new_entry vao bang bam nhu sau:
Er r or _code Hash_t abl e: : insert( const Recor d &new_entry)
/ *
post: Nou bang bam day, phuong fhuc fra vo over f l ow.
Nou bang bam da chua phan fu co khoa frung khoa frong new_ent r y fh ph7ong fhuc fra
vo dupl i cat e_er r or . Nguoc IaI, phan fu new_ent r y duoc fhom vao bang bam va
phuong fhuc fra vo success.
uses: Cac phuong fhuc cua cac Iop Key va Recor d, ham hash.
*/
{
Er r or _code r esul t = success;
i nt pr obe_count , / / om so Ian fhu do phaf hIon bang day.
i ncr ement , / / So gIa fang bo phop fhu bac haI.
pr obe; / / Vj fr fhu hIon fhoI.
Key nul l ; / / CIa frj NULL cua khoa dung cho phop so sanh.
nul l . make_bl ank( ) ;
pr obe = hash( new_ent r y) ;
pr obe_count = 0;
i ncr ement = 1;
whi l e ( t abl e[ pr obe] ! = nul l / / Vj fr fhu co frong hay khong7
&& t abl e[ pr obe] ! = new_ent r y / / Khoa da co frong bang bam7
&& pr obe_count < ( hash_si ze + 1) / 2) {/ / ang day hay chua7
pr obe_count ++;
pr obe = ( pr obe + i ncr ement ) %hash_si ze;
i ncr ement += 2; / / Tnh IaI do doI cho Ian fhu ko fIop.
}
i f ( t abl e[ pr obe] ==nul l ) t abl e[ pr obe] = new_ent r y;
el se i f ( t abl e[ pr obe] == new_ent r y) r esul t = dupl i cat e_er r or ;
el se r esul t = over f l ow;
r et ur n r esul t ;
}
Phuong fhuc do fruy xuaf mof phan fu voI mof khoa cho fruoc co dang fuong
fu, chung fa danh IaI nhu baI fap. ac fa cua no nhu sau:
Error_code Hash_table:: retrieve(const Key &target, Record &found) const;
/ / post: Nou mof phan fu frong bang bam co khoa gIong target, fh found so duoc gan frj cua
phan fu do, phuong fhuc fra vo success. Nguoc IaI, fra vo not _pr esent .
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 328
12.5.5.5. Lou bo mot phun tu
Cho don bay gIo, chung fa van chua noI g don vIoc IoaI mof phan fu frong
bang bam. Thoaf nhn, duong nhu do Ia mof vIoc do dang, chI can gan IaI cho vj
fr can IoaI mof frj dac bIof cua khoa do chI ra rang do Ia vj fr frong. Tuy nhIon
cach nay khong fho ap dung duoc. Iy do Ia mof vj fr frong duoc xom nhu mof
dau hIou do kof fhuc qua frnh fm kIom mof khoa. CIa su nhu fruoc khI IoaI, da
xay ra mof hoac haI Ian dung do va mof phan fu nao do Io ra phaI duoc fhom vao
faI vj fr dang xof IaI phaI doI don mof vj fr dau do frong bang. Nou bay gIo
chung fa can fruy xuaf don phan fu nay fh cho frong moI duoc fao ra so kof fhuc
vIoc fm kIom, va chung fa khong fho fm fhay no, mac du no van fon faI frong
bang.
Mof phuong phap do ngan ngua fnh huong fron Ia su dung mof khoa dac bIof
do daf vao cac vj fr can IoaI dI phan fu. Khoa dac bIof nay chI ra rang do Ia mof
vj fr frong co fho fhom phan fu moI vao, nhung no khong duoc dung do kof fhuc
qua frnh fm kIom mof khoa nao khac frong bang. Tuy nhIon cach su dung khoa
dac bIof nay so Iam cho gIaI fhuaf phuc fap hon va cham hon. Con mof so phuong
phap khac co fho ap dung frong vIoc IoaI bo mof phan fu khoI bang bam. Tuy
nhIon chung fa can nho rang phuong phap IoaI bo nao cung phaI fuong fhch voI
chIon Iuoc fhom va fm kIom phan fu, do haI fac vu nay Iuon hoaf dong mof cach
chnh xac. anh sach IIon kof frong mang IIon fuc frong phan 4.5 cung fhuong
duoc su dung Iam bang bam, va cung fhuoc nhom phuong phap dja chI mo do gIaI
quyof dung do. Cac phan fu co cung gIa frj ham bam so duoc noI kof frong cung
mof danh sach IIon kof. Va frong bang bam co nhIou danh sach IIon kof nhu vay.
12.5.6. Gu quyet dung do bung phuong phup no ket
Cho don bay gIo chung fa van cu ngam hIou rang chung fa chI su dung vung
nho IIon fuc do chua bang bam. Thaf vay, vung nho IIon fuc Ia cach chon fu nhIon
do hIon fhuc bang bam, do chung fa can fruy xuaf mof vj fr ngau nhIon frong
bang mof cach nhanh chong, ma vung nho IIon kof fh khong ho fro vIoc fruy
xuaf ngau nhIon. Tuy nhIon, dIou do khong co nghIa Ia vung nho IIon kof khong
fho duoc dung do chua cac phan fu. Chung fa co fho dung bang bam Ia mof mang
cac danh sach IIon kof. Chung fa hay xom hnh 12.12.
NguoI fa fhuong quon goI cac danh sach IIon kof fu bang bam Ia cac chuoI mac
xch noI kof |chain) non phuong phap gIaI quyof dung do nay con duoc goI Ia
phuong phap noI kof |chaining).
12.5.6.1. u dem cuu phuong phup no ket
!u dIom fhu nhaf va cung Ia uu dIom quan frong nhaf cua phuong phap nay Ia
no co fho fIof kIom vung nho khI ban fhan cac phan fu kha Ion. o bang bam Ia
mof mang, chung fa can khaI bao fruoc mof so Iuong phan fu kha Ion do franh
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 329
hIon fuong fran. Nou do cac phan fu nam frong bang bam fh khI chua co nhIou
du IIou, co qua nhIou vj fr do frong, frong khI chuong frnh cua chung fa co fho
can nhIou vung nho cho nhung bIon khac nua. Nguoc IaI, nou bang bam chI chua
cac con fro ma moI con fro chI can chIom so byfo bang so byfo cua mof fu fh kch
fhuoc bang bam gIam dang ko.
!u dIom chnh fhu haI cua vIoc Iuu cac danh sach IIon kof kom voI bang bam
Ia no cho phop xu Iy dung do mof cach don gIan va hIou qua. VoI mof ham bam
fof, chI co mof so f khoa Ia frung dja chI bam, va nhu vay cac danh sach IIon kof
dou ngan va cac khoa dou co fho duoc fm kIom nhanh chong. Com fu khong con
Ia van do phaI quan fam boI v cac khoa co cac dja chI bam khac nhau Iuon nam
frong cac danh sach khac nhau.
!u dIom fhu ba Ia kch fhuoc bang bam khong nhaf fhIof phaI Ion hon so
phan fu co fho co, chung fa khong con phaI Io van do fran. KhI so phan fu nhIou
hon kch fhuoc bang bam fh chI co nghIa rang, chac chan Ia co mof vaI danh
sach IIon kof nao do co nhIou hon mof phan fu. Ngay ca khI so phan fu nhIou gap
vaI Ian kch fhuoc bang bam fh chIou daI frung bnh cua moI danh sach IIon kof
van nho va vIoc fm kIom fuan fu fron fung danh sach van con hIou qua.
CuoI cung, vIoc IoaI mof phan fu fro fhanh mof cong vIoc do dang va nhanh
chong doI voI bang bam fhoo phuong phap noI kof. VIoc IoaI bo nay duoc fIon
HInh 12.12 ang bam noI kof
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 330
hanh hoan foan gIong voI vIoc IoaI mof phan fu ra khoI mof danh sach IIon kof
don.
12.5.6.2. Nhuoc dem cuu phuong phup no ket
Cac uu dIom cua bang bam fhoo phuong phap noI kof fhuc su Ia raf co IoI.
Chung fa non fIn rang phuong phap noI kof Iuon Ia phuong phap fof hon so voI
phuong phap dja chI mo. Tuy vay, chung fa hay xof don mof nhuoc dIom quan
frong cua no: moI moI IIon kof dou chIom vung nho. Nou phan fu co kch fhuoc
Ion fh kch fhuoc cua cac con fro so khong dang ko, nguoc IaI so Ia dIou khong
hay.
CIa su rang moI moI IIon kof chIom mof fu |mof word chIom 2 hoac 4 bytes)
va moI phan fu cung chI chIom mof fu. Nhung ung dung nhu vay cung fuong doI
pho bIon, frong do chung fa su dung bang bam chI do fra IoI mof vaI cau hoI yos-
no vo cac khoa. CIa su chung fa dung bang bam fhoo phuong phap noI kof va
khaI bao mof mang nho do chua bang bam voI n Ia so phan fu cua mang ma cung
Ia so phan fu so co. Chung fa so phaI su dung 3n fu frong bo nho: n cho bang
bam, n cho cac khoa, va n cho cac moI IIon kof do fm don phan fu ko frong cac
danh sach IIon kof. o bang bam gan nhu day non dung do so xay ra nhIou hon,
mof so danh sach IIon kof so co vaI phan fu. VIoc fm kIom so cham. Maf khac,
gIa su nhu chung fa dung phuong phap dja chI mo. Cung voI 3n fu cua bo nho,
nou chung fa chua fruc fIop cac phan fu frong bang bam co kch fhuoc 3n nay fh
chI co mof phan ba bang Ia co du IIou, nhu vay so dung do cung so fuong doI f va
vIoc fm mof phan fu so nhanh hon raf nhIou.
12.5.6.3. Cuc gu thuut trong C++
ang bam fhoo phuong phap noI kof frong C++ co djnh nghIa don gIan nhu
sau:
cl ass Hash_table {
publ i c:
/ / Speci f y met hods her e.
pr i vat e:
Li st <Recor d> t abl e[ hash_si ze] ;
};
O day Iop Li st co fho Ia baf ky mof hIon fhuc IIon kof fong quaf nao cua mof
danh sach da hoc frong chuong 4. o duoc nhaf quan, cac phuong fhuc cua bang
bam noI kof so chua moI phuong fhuc cua hIon fhuc bang bam fruoc kIa cua chung
fa. Constructor cua bang bam chI don gIan goI cac constructor cho fung danh sach
cua mang. Trong khI do vIoc don dop xoa sach cac phan fu frong bang bam noI
kof IaI Ia mof vIoc hoan foan khac, chung fa can don dop fung danh sach faI moI
vj fr frong bang bam. VIoc nay co fho duoc fhuc hIon nho phuong fhuc clear()
cua Li st .
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 331
Chung fa con co fho su dung cac phuong fhuc frong dong goI Li st do fruy xuaf
bang bam. an fhan ham bam khong khac so voI bang bam fhoo phuong phap dja
chI mo. o fruy xuaf du IIou, chung fa co fho don gIan su dung phIon ban IIon kof
cua ham sequential_search frong phan 7.2. Cof IoI cua phuong fhuc
Hash_table::retrieve Ia
sequential_search( table[hash(target)], target, position);
ChI fIof cua vIoc chuyon doI ham nay fhanh mof ham day du duoc xom nhu baI
fap. Tuong fu, cof IoI cua vIoc fhom du IIou vao bang bam Ia
table[hash(new_entry)].insert( 0, new_entry );
O day chung fa chon cach khI fhom phan fu moI vao fh no so duoc dung faI vj fr
dau cua danh sach IIon kof, do day Ia cach do nhaf. Nhu chung fa da fhay, ca haI
vIoc fhom vao va fruy xuaf phan fu nay dou don gIan hon Ia phuong phap dja chI
mo, do vIoc gIaI quyof dung do khong con Ia van do nua.
VIoc IoaI phan fu ra khoI bang bam noI kof cung don gIan hon raf nhIou so voI
bang bam dja chI mo. o IoaI mof phan fu voI mof khoa cho fruoc, chung fa chI
can fm fuan fu phan fu do frong danh sach IIon kof co chua no va IoaI no ra khoI
danh sach nay. ac fa cua phuong fhuc IoaI bo nhu sau:
Error_code Hash_table::remove(const Key &target, Record &x);
post: Nou bang co chua phan fu co khoa bang t ar get , fh phan fu nay duoc chop vao x va duoc
IoaI khoI bang bam, phuong fhuc fra vo success. Nguoc IaI phuong fhuc fra vo
not _pr esent .
HIon fhuc cua phuong fhuc nay cung duoc danh IaI nhu baI fap.
12.6. Phun tIch bung bum
12.6.1. Oeu nguc nhen ve nguy snh
Kha nang xay ra dung do frong vIoc bam co IIon quan don mof chuyon vuI kha
noI fIong frong foan hoc: nou chon mof cach ngau nhIon fung nguoI do dua vao
mof can phong fh so duoc bao nhIou nguoI fruoc khI co fho xay ra vIoc haI nguoI
frong so do co cung mof ngay sInh. o moI nam co 365 ngay, nhIou nguoI doan
rang cau fra IoI phaI Ion don con so hang fram, nhung IoI gIaI fhuc ra Ia chI co 23
nguoI.
Chung fa co fho djnh ra xac suaf cho cau hoI nay bang cach fra IoI fhoo huong
nguoc IaI: VoI m nguoI duoc chon mof cach ngau nhIon do dua vao phong, xac suaf
do haI nguoI co cung ngay sInh Ia bao nhIou7 Chung fa hay baf dau voI baf ky
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 332
nguoI nao va dang dau IoaI ngay sInh cua ho fron Ijch. Xac suaf do nguoI fhu haI
co ngay sInh khac voI nguoI da chon Ia 364/ 365. TIop fuc danh dau IoaI ngay
sInh cua nguoI nay chung fa co xac suaf do nguoI fhu ba co ngay sInh khac so Ia
363/ 365. TIop fuc fIon hanh fhoo cach nay, chung fa so fhay nou m-1 nguoI dau
fIon co cac ngay sInh khac nhau, fh xac suaf nguoI fhu m co ngay sInh khac nua
Ia ( 365 m+ 1) / 365. o cac ngay sInh cua nhung nguoI khac nhau Ia doc
Iap nhau, cac xac suaf nay so duoc nhan voI nhau, va chung fa co duoc xac suaf do
m nguoI co cac ngay sInh khong frung nhau Ia
364 363 362 365-m+1
365 365 365 365
Iou fhuc nay so nho hon 0. 5 khI m 23.
KhI xof don bang bam, dIou dang ngac nhIon vo cac ngay sInh fron day cho
chung fa bIof rang voI baf ky mof kch fhuoc nao fh hau nhu su dung do cung
chac chan so xay ra. V fho, cach fIop can cua chung fa khong non chI dung IaI o
vIoc Iam gIam so Ian dung do, ma con phaI xu Iy chung cang hIou qua cang fof.
12.6.2. Oem so lun thu
Cung nhu nhung phuong phap fruy xuaf fhong fIn khac, chung fa muon bIof so
Ian so sanh frung bnh cua cac khoa frong ca haI fruong hop fm kIom fhanh
cong va khong fhanh cong doI voI mof khoa cho fruoc. Chung fa so dung fu fhu
|probe) cho vIoc xom xof mof phan fu va so sanh khoa cua no voI khoa can fm.
So Ian fhu can fhIof phu fhuoc vao muc do day cua bang. o do |cung nhu cac
phuong phap fm kIom), chung fa goI n Ia so phan fu frong mof bang va f |cung Ia
hash_si ze) Ia so vj fr frong mang chua bang bam. He so tu |load factor) cua
bang so Ia = n/ t ; = 0 co nghIa Ia bang rong; = 0. 5 Ia bang chua mof
nua so phan fu. oI voI bang dja chI mo, khong bao gIo co fho vuof qua 1,
nhung doI voI bang noI kof so khong co gIoI han cho . Chung fa so xom xof
rIong fung bang fron.
12.6.3. Phun tIch phuong phup no ket
VoI mof bang noI kof chung fa dI fruc fIop don mof frong cac danh sach IIon
kof fruoc khI fhuc hIon baf ky mof phop fhu nao. CIa su nhu danh sach co chua
khoa can fm co k phan fu. Chu y rang k co fho bang 0.
Nou vIoc fm kIom khong fhanh cong, fh khoa can fm so phaI duoc so sanh
voI faf ca k khoa cua k phan fu fuong ung. o cac phan fu duoc phan phoI mof
cach nhu nhau fron faf ca f danh sach |xac suaf xuaf hIon bang nhau fron moI
x x
x x
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 333
danh sach), so phan fu duoc mong doI frong danh sach dang duoc fm kIom Ia =
n/ t . o do so Ian fhu frung bnh cua mof Ian fm kIom khong fhanh cong Ia .
ay gIo chung fa hay gIa su Ia vIoc fm kIom so fhanh song. Tu phan fch cua
vIoc fm fuan fu, chung fa da bIof rang so Ian so sanh frung bnh Ia
2
1
( k+1) , voI
k Ia chIou daI cua danh sach chua phan fu can fm. Nhung chIou daI mong doI cua
danh sach nay khong Ion hon , va chung fa bIof fruoc Ia no chua f nhaf mof
phan fu |phan fu can fm). NgoaI fru phan fu can fm, n 1 phan fu con IaI duoc
phan phoI nhu nhau fron faf ca f danh sach; vay so phan fu mong doI fron danh
sach co chua phan fu can fm Ia 1+( n- 1) / t . Khong ko cac bang co kch fhuoc
nho, chung fa Iay xap xI ( n- 1) / t bang n/ t =. Vay so Ian fhu frung bnh cho
mof Ian fm kIom fhanh cong gan voI
2
1
( k+1)
2
1
( 1 + + 1) = 1 +
2
1
.
Tom IaI, vIoc fruy xuaf mof bang bam noI kof co ho so faI frung bnh can
don 1 +
2
1
Ian fhu cho mof Ian fm kIom fhanh cong va Ian fhu cho mof Ian
fm kIom khong fhanh cong.
12.6.4. Phun tIch phuong phup d{u ch mo
o phan fch so Ian fhu frong bang bam dja chI mo, fruoc hof chung fa bo qua
van do gom fu voI gIa fhIof rang khong chI Ian fhu dau fIon Ia ngau nhIon ma
ngay ca sau khI xay ra dung do, Ian fhu ko fIop cung ngau nhIon fron khap cac vj
fr con IaI cua bang. NoI cach khac, gIa su rang bang bam co kch fhuoc raf Ion
sao cho moI Ian fhu co fho duoc xom Ia doc Iap nhau. Kof qua fnh duoc nhu sau:
VIoc fruy xuaf fu bang bam dja chI mo, voI phop fhu ngau nhIon va ho so faI
, co so Ian fhu frung bnh xap xI bang
1 1
In
1 -
frong fruong hop fm kIom fhanh cong va 1/ ( 1- ) frong fruong hop fm kIom
khong fhanh cong.
Trong fruong hop bang bam dja chI mo voI phop fhu fuyon fnh, Iuu y rang gIa
fhIof cac Ian fhu doc Iap nhau Ia khong fho chap nhan. Kof qua fnh duoc nhu
sau:
VIoc fruy xuaf bang bam dja chI mo voI phop fhu fuyon fnh va ho so faI
can so Ian fhu frung bnh xap xI bang
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 334
1 1
1 +
2 1 -
frong fruong hop fhanh cong va
1 1
1 +
2 |1 - )
2
frong fruong hop khong fhanh cong.
12.6.5. Cuc so sunh ly thuyet
Hnh 12.13 cho fhay cac gIa frj cua cac bIou fhuc fron voI cac frj khac nhau
cua ho so faI .
Chung fa co fho fhay duoc mof vaI kof Iuan fu bang nay. Truoc hof, ro rang Ia
bang bam noI kof can f Ian fhu hon bang bam dja chI mo. Maf khac, vIoc duyof
cac danh sach IIon kof fhuong cham hon Ia fruy xuaf mang, dIou nay Iam gIam uu
dIom cua bang bam noI kof, nhaf Ia frong nhung fruong hop ma vIoc so sanh
khoa co fho duoc fhuc hIon raf nhanh. Phuong phap noI kof fro non hop Iy khI
cac phan fu co kch fhuoc Ion va fhoI gIan can do so sanh cac khoa Ia nhIou.
NgoaI ra, no con fo ra co IoI fho khI vIoc fm kIom khong fhanh cong fhuong xay
ra, do nhung Iuc qua frnh fm kIom gap duoc mof danh sach rong hoac mof danh
sach fhaf ngan va co fho kof fhuc nhanh voI raf f Ian so sanh khoa.
oI voI vIoc fm kIom fhanh cong frong bang bam dja chI mo, phuong phap
fhu fuyon fnh don gIan khong Iam cham qua frnh fm kIom dI nhIou so voI cac
phuong phap gIaI quyof dung do phuc fap khac, f nhaf Ia cho don khI bang gan
HInh 12.13 So sanh Iy fhuyof cac phuong phap bam
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 335
nhu day. Tuy nhIon, doI voI vIoc fm kIom khong fhanh cong, hIon fuong gom fu
nhanh chong Iam cho phop fhu fuyon fnh suy fhoaI fhanh qua frnh fm kIom
fuan fu. V fho, chung fa co fho kof Iuan rang nou vIoc fm kIom fhuong fhanh
cong, va ho so faI vua phaI, fh phop fhu fuyon fnh so dap ung duoc; con frong
nhung fruong hop khac, non su dung nhung phuong phap gIaI quyof dung do khac
nhu phuong phap fhu bac haI chang han.
12.6.6. Cuc so sunh thuc nghem
Mof dIou quan frong can nho Ia cac fnh foan frong hnh 12.13 chI Ia cac con
so xap xI, va frong fhuc fo khong co g Ia hoan foan ngau nhIon, do do chung fa
Iuon bIof rang so co mof vaI dIou khac nhau gIua cac kof qua Iy fhuyof va vIoc
fnh foan fhuc su. V vay, do so sanh, hnh 12.14 cho fhay kof qua cua vIoc
nghIon cuu bang fhuc nghIom voI 900 khoa Iay ngau nhIon gIua 0 va 1.
Nou so sanh cac con so frong haI bang 12.15 va 12.16, chung fa fhay rang kof
qua fhuc nghIom fron bang bam noI kof gan gIong voI kof qua Iy fhuyof. Cac kof
qua cua phop fhu bac haI IaI gan gIong voI kof qua Iy fhuyof cua vIoc fhu ngau
nhIon; su khac nhau co fho duoc gIaI fhch do dang Ia v fhu bac haI chua fhaf su
ngau nhIon. oI voI fhu fuyon fnh, cac kof qua fuong fu khI bang con fuong doI
frong, nhung khI bang gan nhu day fh cac con so xap xI duoc fnh bang Iy fhuyo f
khac nhIou so voI fhuc nghIom. o Ia hau qua cua cac gIa fhIof da duoc don gIan
hoa frong foan hoc.
So sanh voI cac phuong phap fruy xuaf fhong fIn khac, dIou quan frong can Iuu
y vo faf ca nhung con so nay Ia chung chI phu fhuoc vao ho so faI, ma khong phu
fhuoc vao so phan fu fhuc su co frong bang. VIoc fruy xuaf fu bang bam co 20,000
phan fu frong 40,000 vj fr co fho co cua bang, xof frung bnh, khong cham hon
HInh 12.14 So sanh fhuc nghIom cac phuong phap bam.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 336
vIoc fm kIom frong 20 phan fu frong 40 vj fr co fho co. VoI vIoc fm fuan fu, mof
danh sach co kch fhuoc Ion gap 1000 Ian so Iam cho qua frnh fm Iau hon 1000
Ian. VoI fm kIom nhj phan, fI Io nay gIam xuong 10 |chnh xac hon Ia Ig1000),
nhung fhoI gIan fm kIom van Iuon phu fhuoc vao kch fhuoc cua danh sach, dIou
nay khong co o bang bam.
Chung fa co fho fong kof nhung khao saf vo vIoc fruy xuaf fu n phan fu nhu
sau:
Tm fuan fu Ia ( n) .
Tm nhj phan Ia ( l og n) .
Truy xuaf bang bam Ia ( 1) .
CuoI cung, chung fa nhan manh vo fam quan frong cua vIoc Iua chon mof ham
bam fof, mof ham bam fhuc hIon fnh foan nhanh va raI dou cac khoa frong
bang. Nou ham bam khong fof fh bam so suy fhoaI vo fm kIom fuan fu.
12.7. Ket luun: so sunh cuc phuong phup
Trong chuong nay va chuong 7, chung fa da xom xof bon phuong phap khac
nhau do fruy xuaf fhong fIn:
Tm fuan fu,
Tm nhj phan,
Tra cuu bang, va
am.
Nou duoc hoI rang phuong phap nao Ia fof nhaf, fruoc hof chung fa can chon
ra cac fIou ch do danh gIa. Cac fIou ch gom cac you cau cua ung dung, va cac moI
quan fam khac co anh huong Ion su chon Iua cau fruc du IIou, do haI phuong phap
dau chI co fho ap dung voI cac danh sach con haI phuong phap sau chI danh cho
cac bang. Trong nhIou ung dung, chung fa cung duoc fu do frong vIoc chon Iua
gIua danh sach va bang.
Vo maf foc do cung nhu fnh fhuan IoI, vIoc fra cuu fhoo fhu fu frong cac bang
chac chan Ia fof nhaf, nhung co nhIou ung dung ma dIou nay IaI khong ap dung
duoc do fap cac khoa kha fhua fhof hoac doI voI chung danh sach fo ra uu fho
hon. Mof dIou khong fhch ung nua Ia khI vIoc fhom va IoaI phan fu xay ra
fhuong xuyon, frong vung nho IIon fuc cac fac vu nay doI hoI phaI dI chuyon mof
so Ion du IIou.
Trong ba phuong phap con IaI, phuong pha p nao Ia fof nhaf phu fhuoc vao fIou
ch khac nhu dang cua du IIou.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 337
Tm fuan fu Ia phuong phap mom doo nhaf frong cac phuong phap. u IIou co
fho duoc Iuu fhoo baf ky fhu fu nao, frong hIon fhuc IIon fuc hoac IIon kof. Tm
nhj phan doI hoI nhIou hon, cac khoa phaI Iuu fhoo fhu fu va du IIou phaI Iuu
frong vung nho cho phop fruy xuaf ngau nhIon |vung nho IIon fuc). am con doI
hoI nhIou hon nua, fuy fhu fu khac fhuong cua cac khoa van dap ung duoc vIoc
fruy xuaf fu bang bam, nhung noI chung no khong co IoI cho baf ky mof muc dch
nao khac. Nou nhu du IIou can phaI Iuon san sang cho mof su khao saf fh mof
fhu fu nao do Ia can fhIof, va nhu vay bang bam khong dap ung.
CuoI cung Ia van do IIon quan don vIoc fm kIom khong fhanh cong. Tm fuan
fu va bam khI khong fhanh cong fh xom nhu khong co kof qua g. Trong khI do,
nou fhaf baI fh fm nhj phan so cho bIof du IIou co khoa gan voI khoa can fm,
va nhu vay no co fho cung cap fhong fIn huu ch. Trong chuong 9 va 10 chung fa
da nghIon cuu cac phuong phap Iuu fru du IIo u dua fron co so cay, co kof hop fnh
hIou qua cua fm nhj phan voI su mom doo cua cac cau fruc IIon kof.
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 338
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 339
Chng 13 OO TH|
Chuong nay frnh bay vo cac cau fruc foan hoc quan frong duoc goI Ia do fhj.
o fhj fhuong duoc ung dung frong raf nhIou IInh vuc: dIou fra xa hoI, hoa hoc,
dja Iy, ky fhuaf dIon,. Chung fa so fm hIou cac phuong phap bIou dIon do fhj
bang cac cau fruc du IIou va xay dung mof so gIaI fhuaf fIou bIou IIon quan don do
fhj.
13.1. Nen tung toun hoc
13.1.1. Cuc d{nh nghIu vu vI du
Mof do fhj |graph) C gom mof fap V chua cac dInh cua do fhj, va fap chua
cac cap dInh khac nhau fu V. Cac cap dInh nay duoc goI Ia cac canh cua C. Nou e
= |, ) Ia mof canh co haI dInh va , fh chung fa goI va nam fron e, va e
noI voI va . Nou cac cap dInh khong co fhu fu, C duoc goI Ia do fhj vo huong
|undirected graph), nguoc IaI, C duoc goI Ia do fhj co huong |directed graph).
Thong fhuong do fhj co huong duoc goI faf Ia digraph, con fu graph fhuong mang
nghIa Ia do fhj vo huong. Cach fu nhIon do vo do fhj Ia bIou dIon cac dInh bang
cac dIom hoac vong fron, va cac canh bang cac duong fhang hoac cac cung noI cac
dInh. oI voI do fhj co huong fh cac duong fhang hay cac cung can co muI fon chI
huong. Hnh 13.1 mInh hoa mof so v du vo do fhj.
o fhj fhu nhaf frong hnh 13.1 co cac fhanh pho Ia cac dInh, va cac fuyon bay
Ia cac canh. Trong do fhj fhu haI, cac nguyon fu hydro va carbon Ia cac dInh, cac
IIon kof hoa hoc Ia cac canh. Hnh fhu ba Ia mof do fhj co huong cho bIof kha
nang fruyon nhan du IIou fron mang, cac nuf cua mang |A, , , I) Ia cac dInh va
cac duong noI cac nuf Ia co huong. oI khI cach chon fap dInh va fap canh cho do
fhj phu fhuoc vao gIaI fhuaf ma chung fa dung do gIaI baI foan, chang han baI
foan IIon quan don quy frnh cong vIoc, baI foan xop fhoI khoa bIou,
o fhj duoc su dung do mo hnh hoa raf nhIou dang qua frnh cung nhu cau
fruc khac nhau. o fhj co fho bIou dIon mang gIao fhong gIua cac fhanh pho, hoac
cac fhanh phan cua mof mach In dIon fu va cac duong noI gIua chung, hoac cau
fruc cua mof phan fu gom cac nguyon fu va cac IIon kof hoa hoc. Nhung nguoI
dan frong mof fhanh pho cung co fho duoc bIou dIon boI cac dInh cua do fhj ma
cac canh Ia cac moI quan ho gIua ho. Nhan vIon frong mof cong fy co fho duoc
bIou dIon frong mof do fhj co huong ma cac canh co huong cho bIof moI quan ho
cua ho voI nhung nguoI quan Iy. Nhung nguoI nay cung co fho co nhung moI quan
ho cung Iam vIoc bIou dIon boI cac canh khong huong frong mof do fhj vo
huong.
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 340
13.1.2. Oo th{ vo huong
Mof vaI dang cua do fhj vo huong duoc mInh hoa frong hnh 13.2. HaI dInh
frong mof do fhj vo huong duoc goI Ia ko nhau |adjacent) nou fon faI mof canh
noI fu dInh nay don dInh kIa. Trong do fhj vo huong frong hnh 13.2 a, dInh 1 va
2 Ia ko nhau, dInh 3 va 4 Ia ko nhau, nhung dInh 1 va dInh 4 khong ko nhau. Mof
duong dI |path) Ia mof day cac dInh khac nhau, frong do moI dInh ko voI dInh ko
fIop. Hnh |b) cho fhay mof duong dI. Mof chu frnh |cycle) Ia mof duong dI chua
f nhaf ba dInh sao cho dInh cuoI cung ko voI dInh dau fIon. Hnh |c) Ia mof chu
frnh. Mof do fhj duoc goI Ia IIon fhong |connected) nou Iuon co mof duong dI fu
mof dInh baf ky don mof dInh baf ky nao khac. Hnh |a), |b), va |c) Ia cac do fhj
IIon fhong. Hnh |d) khong phaI Ia do fhj IIon fhong. Nou mof do fhj Ia khong
IIon fhong, chung fa xom moI fap con Ion nhaf cac dInh IIon fhong nhau nhu mof
fhanh phan IIon fhong. V du, do fhj khong IIon fhong o hnh |d) co haI fhanh
phan IIon fhong: mof fhanh phan chua cac dInh 1,2 va 4; mof fhanh phan chI co
dInh 3.
HInh 13.1 Cac v du vo do fhj
HInh 13.2 Cac dang cua do fhj vo huong
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 341
Phan |o) Ia mof do fhj IIon fhong khong co chu frnh. Chung fa co fho nhan
fhay do fhj cuoI cung nay fhuc su Ia mof cay, va chung fa dung dac fnh nay do
djnh nghIa: Mof cay fu do |free tree) duoc djnh nghIa Ia mof do fhj vo huong IIon
fhong khong co chu frnh.
13.1.3. Oo th{ co huong
oI voI cac do fhj co huong, chung fa co fho co nhung djnh nghIa fuong fu.
Chung fa you cau moI canh frong mof duong dI hoac mof chu frnh dou co cung
huong, nhu vay vIoc Ian fhoo mof duong dI hoac mof chu frnh co nghIa Ia phaI dI
chuyon fhoo huong chI boI cac muI fon. Nhung duong dI |hay chu frnh) nhu vay
duoc goI Ia duong dI co huong |hay chu frnh co huong). Mof do fhj co huong duoc
goI Ia IIon fhong manh |strongly connected) nou no Iuon co mof duong dI co huong
fu mof dInh baf ky don mof dInh baf ky nao khac. Trong mof do fhj co huong
khong IIon fhong manh, nou bo qua chIou cua cac canh ma chung fa co duoc mof
do fhj vo huong IIon fhong fh do fhj co huong ban dau duoc goI Ia do fhj IIon
fhong you |weakly connected). Hnh 13.3 mInh hoa mof chu frnh co huong, mof
do fhj co huong IIon fhong manh va mof do fhj co huong IIon fhong you.
Cac do fhj co huong frong phan |b) va |c) hnh 13.3 co cac cap dInh co cac canh
co huong fhoo ca haI chIou gIua chung. Cac canh co huong Ia cac cap co fhu fu va
cac cap co fhu fu |, ) va |,) Ia khac nhau nou . Trong do fhj vo huong, chI
co fho co nhIou nhaf mof canh noI haI dInh khac nhau. Tuong fu, do cac dInh fron
mof canh fhoo djnh nghIa Ia phaI khac nhau, khong fho co mof canh noI mof
dInh voI chnh no. Tuy nhIon, cung co nhung fruong hop mo rong djnh nghIa,
nguoI fa cho phop nhIou canh noI mof cap dInh, va mof canh noI mof dInh voI
chnh no.
13.2. Beu den bung muy tInh
Nou chung fa chuan bj vIof chuong frnh do gIaI quyof mof baI foan co IIon
quan don do fhj, fruoc hof chung fa phaI fm cach do bIou dIon cau fruc foan hoc
cua do fhj nhu Ia mof dang nao do cua cau fruc du IIou. Co nhIou phuong phap
HInh 13.3 Cac v du vo do fhj co huong
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 342
duoc dung pho bIon, vo co ban chung khac nhau frong vIoc Iua chon kIou du IIou
fruu fuong do bIou dIon do fhj, cung nhu nhIou cach hIon fhuc khac nhau cho moI
kIou du IIou fruu fuong. NoI cach khac, chung fa baf dau fu mof djnh nghIa foan
hoc, do Ia do fhj, sau do chung fa fm hIou cach mo fa no nhu mof kIou du IIou
fruu fuong |fap hop, bang, hay danh sach dou co fho dung duoc), va cuoI cung
chung fa Iua chon cach hIon fhuc cho kIou du IIou fruu fuong ma chung fa chon.
13.2.1. Beu den cuu tup hop
o fhj duoc djnh nghIa bang mof fap hop, nhu vay mof cach hof suc fu nhIon
Ia dung fap hop do xac djnh cach bIou dIon no nhu Ia du IIou. Truoc fIon, chung fa
co mof fap cac dInh, va fhu haI, chung fa co cac canh nhu Ia fap cac cap dInh.
Thay v fhu bIou dIon fap cac cap dInh nay mof cach fruc fIop, chung fa chIa no
ra fhanh nhIou phan nho bang cach xom xof fap cac canh IIon quan don fung
dInh rIong ro. NoI mof cach khac, chung fa co fho bIof duoc faf ca cac canh frong
do fhj bang cach nam gIu fap
koo fhoo A
v
voI moI , vV. Tnh chaf nay co fho duoc phaf
bIou IaI nhu sau: Mof canh khong co huong gIua va v co fho duoc xom nhu haI
canh co huong, mof fu don v va mof fu v don .
13.2.1.1. Hen thuc cuc tup hop
Co nhIou cach do hIon fhuc fap cac dInh frong cau fruc du IIou va gIaI fhuaf.
Cach fhu nhaf Ia bIou dIon fap cac dInh nhu Ia mof danh sach cac phan fu cua no,
chung fa so fm hIou phuong phap nay sau. Cach fhu haI, fhuong goI Ia chuoI cac
bIf |bit string), Iuu mof frj Boolean cho moI phan fu cua fap hop do chI ra rang no
co hay khong co frong fap hop. o don gIan, chung fa so xom cac phan fu co fho
co cua fap hop duoc danh chI so fu 0 don max_set - 1, voI max_set Ia so phan fu
foI da cho phop. Iou nay co fho duoc hIon fhuc mof cach do dang bang cach su
dung fhu vIon chuan |Standard Template Library- STL)
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 343
st d: : bi t set <max_set >, hoac Iop co su dung t empl at e cho kch fhuoc fap hop
cua chung fa nhu sau:
t empl at e <i nt max_set>
st r uct Set {
bool i s_el ement [ max_set] ;
};
ay chI Ia mof cach hIon fhuc don gIan nhaf cua khaI nIom fap hop. SInh vIon
co fho fhay rang khong co g ngan can chung fa dac fa va hIon fhuc mof CTI
fap hop voI cac phuong fhuc hoI, gIao, hIou, xof fhanh vIon cua no,, mof cach
hoan chInh nou nhu can su dung fap hop frong nhung baI foan Ion nao do.
CIo chung fa da co fho dac fa cach bIou dIon fhu nhaf cho do fhj cua chung fa:
/ / Tuong ung hnh 13. 4- b
t empl at e <i nt max_si ze>
cl ass Digraph {
i nt count ; / / So dInh cua do fhj, nhIou nhaf Ia max_si ze
Set <max_si ze> neighbors[ max_si ze] ;
};
Trong cach hIon fhuc nay, cac dInh duoc daf fon bang cac so nguyon fu 0 don
count - 1. Nou Ia mof so nguyon fh phan fu nei ghbor s[ ] cua mang Ia mof
fap cac dInh ko voI dInh .
13.2.1.2. Bung ke
Trong cach hIon fhuc fron day, cau fruc Set duoc hIon fhuc nhu mof mang cac
phan fu kIou bool . MoI phan fu chI ra rang dInh fuong ung co Ia fhanh phan cua
fap hop hay khong. Nou chung fa fhay fho fap cac dInh ko nay bang mof mang,
chung fa so fhay rang mang nei ghbor s frong djnh nghIa cua Iop Gr aph co fho
duoc bIon doI fhanh mang cac mang |mang haI chIou) nhu sau day, va chung fa
goI Ia bang ko |adjacency table):
/ / Tuong ung hnh 13. 4- c
t empl at e <i nt max_si ze>
cl ass Digraph {
i nt count ; / / So dInh cua do fhj, nhIou nhaf Ia max_si ze.
bool adjacency[ max_size] [ max_size] ;
};
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 344
ang ko chua cac fhong fIn mof cach fu nhIon nhu sau: adj acency[ v] [ w] Ia
t r ue nou va chI nou dInh v Ia dInh ko cua v. Nou Ia do fhj co huong,
adj acency[ v] [ w] cho bIof canh fu v don v co frong do fhj hay khong. Nou do
fhj vo huong, bang ko phaI doI xung, nghIa Ia adj acency[ v] [ w] =
adj acency[ v] [ w] voI moI v va v. Iou dIon do fhj boI fap cac dInh ko va boI
bang ko duoc mInh hoa frong hnh 13.4.
13.2.2. Ounh such ke
Mof cach khac do bIou dIon mof fap hop Ia dung danh sach cac phan fu.
Chung fa co mof danh sach cac dInh, va, doI voI moI dInh, co mof danh sach cac
dInh ko. Chung fa co fho xom xof cach hIon fhuc cho do fhj bang danh sach IIon
fuc hoac danh sach IIon kof don. Tuy nhIon, doI voI nhIou ung dung, nguoI fa
fhuong su dung cac hIon fhuc khac cua danh sach phuc fap hon nhu cay nhj phan
fm kIom, cay nhIou nhanh fm kIom, hoac Ia heap. Iuu y rang, bang cach daf
fon cac dInh fhoo cac chI so frong cac cach hIon fhuc fruoc day, chung fa cung co
duoc cach hIon fhuc cho fap cac dInh nhu Ia mof danh sach IIon fuc.
13.2.2.1. Hen thuc duu tren co so lu dunh such
Chung fa co duoc hIon fhuc cua do fhj dua fron co so Ia danh sach bang cach
fhay fho cac fap hop dInh ko fruoc kIa bang cac danh sach. HIon fhuc nay co fho
su dung hoac danh sach IIon fuc hoac danh sach IIon kof. Phan |b) va |c) cua hnh
13.5 mInh hoa haI cach hIon fhuc nay.
/ / Tong quaf cho ca danh sach IIon fuc Ian IIon kof |hnh 13.5-b va c).
t ypedef i nt Ver t ex;
t empl at e <i nt max_si ze>
cl ass Digraph {
i nt count ; / / So dInh cua do fhj, nhIou nhaf Ia max_si ze.
List<Ver t ex> neighbors[ max_si ze] ;
};
(u) (b) (c)
HInh 13.4 Tap cac dInh ko va bang ko.
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 345
13.2.2.2. Hen thuc len ket
ang cach su dung cac doI fuong IIon kof cho ca cac dInh va cho ca cac danh
sach ko, do fhj so co duoc fnh IInh hoaf cao nhaf. HIon fhuc nay duoc mInh hoa
frong hnh 13.5-a va co cac djnh nghIa nhu sau:
cl ass Edge;
cl ass Vertex {
Edge *f i r st _edge; / / ChI don phan fu dau cua SIK cac dInh ko.
Ver t ex *next _ver t ex; / / ChI don phan fu ko frong SIK cac dInh co frong do fhj.
};
cl ass Edge {
Ver t ex *end_poi nt ; / / ChI don mof dInh ko voI dInh ma danh sach nay fhuoc vo.
Edge *next _edge; / / ChI don phan fu bIou dIon dInh ko ko fIop frong danh sach cac
dInh ko voI mof dInh ma danh sach nay fhuoc vo.
};
HInh 13.5 HIon fhuc do fhj bang cac danh sach
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 346
cl ass Digraph {
Ver t ex *f i r st _ver t ex; / / ChI don phan fu dau fIon frong danh sach cac dInh cua do fhj.
};
13.2.3. Cuc thong tn khuc trong do th{
NhIou ung dung vo do fhj khong nhung can nhung fhong fIn vo cac dInh ko
cua mof dInh ma con can fhom mof so fhong fIn khac IIon quan don cac dInh
cung nhu cac canh. Trong hIon fhuc IIon kof, cac fhong fIn nay co fho duoc Iuu
nhu cac fhuoc fnh bo sung bon frong cac ban ghI fuong ung, va frong hIon fhuc
IIon fuc, chung co fho duoc Iuu frong cac mang cac phan fu bon frong cac ban ghI.
Iay v du fruong hop mang cac may fnh, no duoc djnh nghIa nhu mof do fhj
frong do moI canh co fhom fhong fIn Ia faI frong cua duong fruyon fu may nay
qua may khac. oI voI nhIou gIaI fhuaf fron mang, cach bIou dIon fof nhaf Ia
dung bang ko, frong do cac phan fu so chua faI frong fhay v mof frj kIou bool .
Chung fa so quay IaI van do nay sau frong chuong nay.
13.3. Ouyet do th{
13.3.1. Cuc phuong phup
Trong nhIou baI foan, chung fa mong muon duoc khao saf cac dInh frong do fhj
fhoo mof fhu fu nao do. Tua nhu doI voI cay nhj phan chung fa da phaf frIon mof
vaI phuong phap duyof qua cac phan fu mof cach co ho fhong. KhI duyof cay,
chung fa fhuong baf dau fu nuf goc. Trong do fhj, fhuong khong co dInh nao Ia
dInh dac bIof, non vIoc duyof qua do fhj co fho baf dau fu mof dInh baf ky nao do.
Tuy co nhIou fhu fu khac nhau do duyof qua cac dInh cua do fhj, co haI phuong
phap duoc xom Ia dac bIof quan frong.
Phuong phap duyof fhoo chIou sau |depth-first traversal) fron mof do fhj gan
gIong voI phop duyof preorder cho mof cay co fhu fu. CIa su nhu phop duyof vua
duyof xong dInh , va goI w
1
, w
2
,...,w
k
Ia cac dInh ko voI , fh w
1
Ia dInh duoc
duyof ko fIop, frong khI cac dInh w
2
,...,w
k
so nam doI. Sau khI duyof qua dInh w
1
chung fa so duyof qua faf ca cac dInh ko voI w
1
, fruoc khI quay IaI voI w
2
,...,w
k
.
Phuong phap duyof fhoo chIou rong |breadth-first traversal) fron mof do fhj
gan gIong voI phop duyof fhoo muc |level by level) cho mof cay co fhu fu. Nou
phop duyof vua duyof xong dInh , fh faf ca cac dInh ko voI so duoc duyof fIop
sau do, frong khI cac dInh ko voI cac dInh nay so duoc daf vao mof danh sach
cho, chung so duoc duyof foI chI sau khI faf ca cac dInh ko voI da duoc duyof
xong.
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 347
Hnh 13.6 mInh hoa haI phuong phap duyof fron, cac con so faI cac dInh bIou
dIon fhu fu ma chung duoc duyof don.
13.3.2. Gu thuut duyet theo cheu suu
Phuong phap duyof fhoo chIou sau fhuong duoc xay dung nhu mof gIaI fhuaf
do quy. Cac cong vIoc can Iam khI gap mof dInh Ia:
visit( v) ;
f or ( moI dInh w ko voI dInh v)
traverse( w) ;
Tuy nhIon, frong phop duyof do fhj, co haI dIom kho khan ma frong phop
duyof cay khong co. Thu nhaf, do fhj co fho chua chu frnh, va gIaI fhuaf cua
chung fa co fho gap IaI mof dInh Ian fhu haI. o ngan chan do quy vo fan, chung
fa dung mof mang cac phan fu kIou bool visited, vi si t ed[ v] so Ia t r ue khI
v vua duoc duyof xong, va chung fa Iuon xof frj cua vi si t ed[ w] fruoc khI xu Iy
cho v, nou frj nay da Ia t r ue fh v khong can xu Iy nua. Iou kho khan fhu haI
Ia, do fhj co fho khong IIon fhong, va gIaI fhuaf duyof co fho khong daf duoc don
faf ca cac dInh cua do fhj nou chI baf dau dI fu mof dInh. o do chung fa can fhuc
hIon mof vong Iap do co fho baf dau fu moI dInh frong do fhj, nho vay chung fa
so khong bo sof mof dInh nao. VoI nhung phan fch fron, chung fa co phac fhao
cua gIaI fhuaf duyof do fhj fhoo chIou sau duoI day. ChI fIof hon cho gIaI fhuaf
con phu fhuoc vao cach chon Iua hIon fhuc cua do fhj va cac dInh, va chung fa do
IaI cho cac chuong frnh ung dung.
t empl at e <i nt max_si ze>
voi d Di gr aph<max_si ze>: : depth_first( voi d ( *vi si t ) ( Ver t ex &) ) const
/ *
post: Ham *vi si t duoc fhuc hIon faI moI dInh cua do fhj mof Ian, fhoo fhu fu duyof fhoo chIou
sau.
uses: Ham t r aver se fhuc hIon duyof fhoo chIou sau.
*/
HInh 13.6 - uyof do fhj
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 348
{
bool vi si t ed[ max_si ze] ;
Ver t ex v;
f or ( al l v i n G) vi si t ed[ v] = f al se;
f or ( al l v i n G) i f ( ! vi si t ed[ v] )
traverse( v, vi si t ed, vi si t ) ;
}
VIoc do quy duoc fhuc hIon frong ham phu fro traverse. o ham nay can
fruy nhap vao cau fruc bon frong cua do fhj, no phaI Ia ham fhanh vIon cua Iop
Di gr aph. NgoaI ra, do t r aver se Ia mof ham phu fro va chI duoc su dung frong
phuong fhuc dept h_f i r st , no non duoc khaI bao pr i vat e bon frong Iop.
t empl at e <i nt max_si ze>
voi d Di gr aph<max_si ze>: : traverse( Ver t ex &v, bool vi si t ed[ ] ,
voi d ( *vi si t ) ( Ver t ex &) ) const
/ *
pre: v Ia mof dInh cua do fhj Di gr aph.
post: uyof fhoo chIou sau, ham *vi si t so duoc fhuc hIon faI v va faI faf ca cac dInh co fho
don duoc fu v.
uses: Ham t r aver se mof cach do quy.
*/
{ Ver t ex w;
vi si t ed[ v] = t r ue;
( *vi si t ) ( v) ;
f or ( al l w adj acent t o v)
i f ( ! vi si t ed[ w] )
traverse( w, vi si t ed, vi si t ) ;
}
13.3.3. Gu thuut duyet theo cheu rong
o su dung do quy va Iap frnh voI ngan xop vo ban chaf Ia fuong duong,
chung fa co fho xay dung gIaI fhuaf duyof fhoo chIou sau bang cach su dung ngan
xop. KhI mof dInh dang duoc duyof fh cac dInh ko cua no duoc day vao ngan xop,
khI mof dInh vua duoc duyof xong fh dInh ko fIop can duyof Ia dInh duoc Iay ra
fu ngan xop. CIaI fhuaf duyof fhoo chIou rong cung fuong fu nhu gIaI fhuaf vua
duoc do cap don frong vIoc duyof fhoo chIou sau, fuy nhIon hang doI can duoc su
dung fhay cho ngan xop.
t empl at e <i nt max_si ze>
voi d Di gr aph<max_si ze>: : breadth_first( voi d ( *vi si t ) ( Ver t ex &) ) const
/ *
post: Ham *vi si t duoc fhuc hIon faI moI dInh cua do fhj mof Ian, fhoo fhu fu duyof fhoo chIou
rong.
uses: Cac phuong fhuc cua Iop Queue.
*/
{ Queue q;
bool vi si t ed[ max_si ze] ;
Ver t ex v, w, x;
f or ( al l v i n G) vi si t ed[ v] = f al se;
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 349
f or ( al l v i n G)
i f ( ! vi si t ed[ v] ) {
q. append( v) ;
whi l e ( ! q. empt y( ) ) {
q. r et r i eve( w) ;
i f ( ! vi si t ed[ w] ) {
vi si t ed[ w] = t r ue;
( *vi si t ) ( w) ;
f or ( al l x adj acent t o w)
q. append( x) ;
}
q. ser ve( ) ;
}
}
}
13.4. Sup thu tu topo
13.4.1. Out vun de
Nou C Ia mof do fhj co huong khong co chu frnh, fh fhu fu t opo |topological
order) cua C Ia mof cach IIof ko fuan fu moI dInh frong C sao cho, voI moI ,
C, nou co mof canh fu don , fh nam fruoc .
Trong suof phan nay, chung so chI xom xof cac do fhj co huong khong co chu
frnh. Thuaf ngu acyclic co nghIa Ia mof do fhj khong co chu frnh. Cac do fhj
nhu vay xuaf hIon frong raf nhIou baI foan. Nhu mof v du dau fIon vo fhu fu
t opo, chung fa hay xom xof cac mon hoc frong mof fruong daI hoc nhu Ia cac
dInh cua do fhj, frong do mof canh noI fu mon nay don mon kIa co nghIa Ia mon
fhu nhaf Ia mon fIon quyof cua mon fhu haI. Nhu vay fhu fu t opo so IIof ko faf
ca cac mon sao cho moI mon fIon quyof cua mof mon so nam fruoc mon do. V du
fhu haI Ia fu dIon cac fhuaf ngu ky fhuaf. Cac fu frong fu dIon duoc sap fhu fu sao
cho khong co fu nao duoc su dung frong mof djnh nghIa cua fu khac fruoc khI
chnh no duoc djnh nghIa. Tuong fu, cac fac gIa cua cac sach su dung fhu fu t opo
cho cac do muc frong sach. HaI fhu fu t opo khac nhau cua mof do fhj co huong
duoc mInh hoa frong hnh 13.7.
Chung fa so xay dung ham do sInh ra fhu fu t opo cho cac dInh cua mof do fhj
khong co chu frnh fhoo haI cach: su dung phop duyof fhoo chIou sau va phop
duyof fhoo chIou rong. Ca haI phuong phap duoc dung cho mof doI fuong cua Iop
Di gr aph su dung hIon fhuc dua fron co so Ia danh sach. Chung fa co dac fa Iop
nhu sau:
t ypedef i nt Ver t ex;
t empl at e <i nt gr aph_si ze>
cl ass Digraph {
publ i c:
Di gr aph( ) ;
voi d r ead( ) ;
voi d wr i t e( ) ;
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 350
/ / Cac phuong fhuc sap fhu fu t opo.
voi d depth_sort( Li st <Ver t ex> &t opol ogi cal _or der ) ;
voi d breadth_sort( Li st <Ver t ex> &t opol ogi cal _or der ) ;
pr i vat e:
i nt count ;
Li st <Ver t ex> neighbors[ gr aph_si ze] ;
voi d recursive_depth_sort( Ver t ex v, bool vi si t ed[ ] ,
Li st <Ver t ex> &t opol ogi cal _or der ) ;
};
Ham phu fro recursive_depth_sort duoc su dung boI phuong fhuc
depth_sort. Ca haI phuong phap sap fhu fu dou so fao ra mof danh sach cac
dInh cua do fhj fhoo fhu fu t opo fuong ung.
13.4.2. Gu thuut duyet theo cheu suu
Trong fhu fu t opo, moI dInh phaI xuaf hIon fruoc moI dInh ko cua no frong do
fhj. CIaI fhuaf duyof fhoo chIou sau nay daf dan cac dInh vao mang fhu fu t opo
fu phaI sang fraI. af dau fu mof dInh chua fung duoc duyof don, chung fa can goI
do quy do don duoc cac dInh ma khong con dInh ko, cac dInh nay so duoc daf vao
mang fhu fu t opo o cac vj fr cuoI mang. Tnh fu phaI sang fraI frong mang fhu
fu t opo nay, khI cac dInh ko cua mof dInh da duoc duyof xong, fh chnh dInh do
HInh 13.? Cac fhu fu t opo cua mof do fhj co huong
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 351
co fho co maf frong mang. o chnh Ia Iuc cac Ian goI do quy bon frong IuI vo Ian
goI do quy bon ngoaI. Phuong phap nay Ia mof cach hIon fhuc fruc fIop cua fhu
fuc duyof fhoo chIou sau mof cach fong quaf da duoc frnh bay o fron. Iom khac
bIof Ia vIoc xu Iy faI moI dInh |ghI vao mang fhu fu t opo) chI duoc fhuc hIon sau
khI cac dInh ko cua no da duoc xu Iy.
t empl at e <i nt gr aph_si ze>
voi d Di gr aph<gr aph_si ze>: : depth_sort( Li st <Ver t ex> &t opol ogi cal _or der )
/ *
post: Cac dInh cua mof do fhj co huong khong co chu frnh duoc xop fhoo fhu fu t opo fuong ung
cach duyof do fhj fhoo chIou sau.
uses: Cac phuong fhuc cua Iop Li st , ham do quy r ecur si ve_dept h_sor t .
*/
{
bool vi si t ed[ gr aph_si ze] ;
Ver t ex v;
f or ( v = 0; v < count ; v++) vi si t ed[ v] = f al se;
t opol ogi cal _or der . cl ear ( ) ;
f or ( v = 0; v < count ; v++)
i f ( ! vi si t ed[ v] ) / / Thom cac dInh ko cua v va sau do Ia v vao mang fu fu t opo fu
phaI sang
fraI.
recursive_depth_sort( v, vi si t ed, t opol ogi cal _or der ) ;
}
Ham phu fro recursive_depth_sort fhuc hIon vIoc do quy, dua fron phac
fhao cua ham traverse fong quaf, fruoc hof daf faf ca cac dInh sau cua mof dInh
v vao cac vj fr cua chung frong fhu fu t opo, sau do moI daf v vao.
t empl at e <i nt gr aph_si ze>
voi d Di gr aph<gr aph_si ze>: : recursive_depth_sort( Ver t ex v, bool *vi si t ed,
Li st <Ver t ex> &t opol ogi cal _or der )
/ *
pre: Inh v chua co frong mang fhu fu t opo.
post: Thom cac dInh ko cua v va sau do Ia v vao mang fu fu t opo fu phaI sang fraI.
uses: Cac phuong fhuc cua Iop Li st va ham do quy r ecur si ve_dept h_sor t .
*/
{ vi si t ed[ v] = t r ue;
i nt degr ee = nei ghbor s[ v] . si ze( ) ;
f or ( i nt i = 0; i < degr ee; i ++) {
Ver t ex w;
nei ghbor s[ v] . r et r i eve( i , w) ; / / Mof dInh ko cua v.
i f ( ! vi si t ed[ w] ) / / uyof fIop xuong dInh v.
recursive_depth_sort( w, vi si t ed, t opol ogi cal _or der ) ;
}
t opol ogi cal _or der . i nser t ( 0, v) ; / / af v vao mang fhu fu t opo.
}
o gIaI fhuaf nay duyof qua moI dInh cua do fhj chnh xac mof Ian va xom xof
moI canh cung mof Ian, dong fhoI no khong ho fhuc hIon vIoc fm kIom nao, non
fhoI gIan chay Ia O|n+o), voI n Ia so dInh va o Ia so canh cua do fhj.
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 352
13.4.3. Gu thuut duyet theo cheu rong
Trong fhu fu t opo fhoo chIou rong cua mof do fhj co huong khong co chu
frnh, chung fa baf dau bang cach fm cac dInh co fho Ia cac dInh dau fIon frong
fhu fu t opo va sau do chung fa ap dung nguyon fac rang, moI dInh can phaI xuaf
hIon fruoc faf ca cac dInh sau cua no frong fhu fu t opo. CIaI fhuaf nay so Ian
Iuof daf cac dInh cua do fhj vao mang fhu fu t opo fu fraI sang phaI.
Cac dInh co fho Ia dInh dau fIon chnh Ia cac dInh khong Ia dInh sau cua baf
ky dInh nao frong do fhj. o fm duoc chung, chung fa fao mof mang
predecessor_count, moI phan fu faI chI so v chua so dInh dung ngay fruoc dInh
v. Cac dInh can fm chnh Ia cac dInh ma khong co dInh nao dung ngay fruoc no,
frj frong phan fu fuong ung cua mang bang 0. Cac dInh nhu vay da san sang duoc
daf vao mang fhu fu t opo. Nhu vay chung fa so khoI dong qua frnh duyof fhoo
chIou rong bang cach daf cac dInh nay vao mof hang cac dInh so duoc xu Iy. KhI
mof dInh can duoc xu Iy, no so duoc Iay ra fu hang va daf vao vj fr ko fIop frong
mang t opo, Iuc nay, vIoc xom xof no xom nhu kof fhuc va duoc danh dau bang
cach cho cac phan fu frong mang predecessor_count fuong ung voI cac dInh Ia
dInh sau cua no gIam dI 1. KhI mof phan fu nao frong mang nay daf duoc frj 0,
fh cung co nghIa Ia dInh fuong ung voI no co cac dInh fruoc da duoc duyof xong,
va dInh nay da san sang duoc duyof non duoc dua vao hang doI.
t empl at e <i nt gr aph_si ze>
voi d Di gr aph<gr aph_si ze>: : breadth_sort( Li st <Ver t ex> &t opol ogi cal _or der )
/ *
post: Cac dInh cua mof do fhj co huong khong co chu frnh duoc xop fhoo fhu fu t opo fuong ung
cach duyof do fhj fhoo chIou rong.
uses: Cac phuong fhuc cua cac Iop Li st , Queue.
*/
{ t opol ogi cal _or der . cl ear ( ) ;
Ver t ex v, w;
i nt pr edecessor _count [ gr aph_si ze] ;
f or ( v = 0; v < count ; v++) pr edecessor _count [ v] = 0;
f or ( v = 0; v < count ; v++)
f or ( i nt i = 0; i < nei ghbor s[ v] . si ze( ) ; i ++) { / / Cap nhaf so dInh dung
fruoc cho moI dInh.
nei ghbor s[ v] . r et r i eve( i , w) ;
pr edecessor _count [ w] ++;
}
Queue<Ver t ex> r eady_t o_pr ocess;
f or ( v = 0; v < count ; v++)
i f ( pr edecessor _count [ v] == 0)
r eady_t o_pr ocess. append( v) ;
whi l e ( ! r eady_t o_pr ocess. empt y( ) ) {
r eady_t o_pr ocess. r et r i eve( v) ;
t opol ogi cal _or der . i nser t ( t opol ogi cal _or der . si ze( ) , v) ;
f or ( i nt j = 0; j < nei ghbor s[ v] . si ze( ) ; j ++) { / / CIam so dInh dung fruoc
nei ghbor s[ v] . r et r i eve( j , w) ; / / cua moI dInh ko cua v dI 1
pr edecessor _count [ w] - - ;
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 353
i f ( pr edecessor _count [ w] == 0)
r eady_t o_pr ocess. append( w) ;
}
r eady_t o_pr ocess. ser ve( ) ;
}
}
CIaI fhuaf nay can don mof frong cac hIon fhuc cua Iop Queue. Queue co fho
co hIon fhuc fhoo baf ky cach nao da duoc mo fa frong chuong 3. o cac phan fu
frong Queue Ia cac dInh. Cung nhu duyof fhoo chIou sau, fhoI gIan can cho ham
br eadt h_f i r st Ia O|n+o), voI n Ia so dInh va o Ia so canh cua do fhj.
13.5. Gu thuut Greedy: TIm duong d ngun nhut
13.5.1. Out vun de
Nhu mof ung dung khac cua do fhj, chung fa xom xof mof baI foan hoI phuc
fap sau day. Chung fa co mof do fhj co huong C, frong do moI canh duoc gan mof
con so khong am goI Ia faI frong |weight). aI foan cua chung fa Ia fm mof
duong dI fu mof dInh don mof dInh v sao cho fong faI frong fron duong dI Ia
nho nhaf. Chung fa goI duong dI nhu vay Ia duong dI ngan nhaf |shortest path),
mac du faI frong co fho bIou dIon cho gIa ca, fhoI gIan, hoac mof vaI daI Iuong
nao khac fhay v khoang cach. Chung fa co fho xom C nhu mof ban do cac fuyon
bay, chang han, moI dInh cua do fhj bIou dIon mof fhanh pho va faI frong fron
moI canh bIou dIon chI ph bay fu fhanh pho nay sang fhanh pho kIa. aI foan
cua chung fa Ia fm Io frnh bay fu fhanh pho don fhanh pho v sao cho fong chI
ph Ia nho nhaf. Chung fa hay xom xof do fhj o hnh 13.8. uong ngan nhaf fu
dInh 0 don dInh 1 dI ngang qua dInh 2 co fong faI frong Ia 4, so voI faI frong Ia 5
doI voI canh noI fruc fIop fu 0 sang 1, va fong faI frong Ia 8 nou dI ngang qua
dInh 4.
Co fho do dang gIaI baI foan mof cach fong quaf nhu sau: baf dau fu mof dInh,
goI Ia dInh nguon, fm duong dI ngan nhaf don moI dInh con IaI, fhay v chI fm
duong don mof dInh dch. Chung fa can faI frong phaI Ia nhung so khong am.
HInh 13.8 o fhj co huong voI cac faI frong
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 354
13.5.2. Phuong phup
CIaI fhuaf so duoc fhuc hIon bang cach nam gIu mof fap S cac dInh ma duong
dI ngan nhaf fu dInh nguon don chung da duoc bIof. MoI dau, dInh nguon Ia dInh
duy nhaf frong S. TaI moI buoc, chung fa fhom vao S cac dInh con IaI ma duong
dI ngan nhaf fu nguon don chung vua duoc fm fhay. aI foan bay gIo fro fhanh
baI foan xac djnh dInh nao do fhom vao S faI moI buoc. Chung fa hay xom nhung
dInh da co frong S nhu da duoc fo mof mau nao do, va cac canh nam frong cac
duong dI ngan nhaf fu dInh nguon don cac dInh co mau cung duoc fo mau.
Chung fa so nam gIu mof mang di st ance cho bIof rang, doI voI moI dInh ,
khoang cach fu dInh nguon doc fhoo duong dI co cac canh da co mau, co fho fru
canh cuoI cung. NghIa Ia, nou fhuoc S, fh di st ance[ v] chua khoang cach
ngan nhaf don , va moI canh nam fron duong dI fuong ung dou co mau. Nou
khong fhuoc S, fh di st ance[ v] chua chIou daI cua duong dI fu dInh nguon don
mof dInh v nao do cong voI faI frong cua canh noI fu v don , va moI canh nam
fron duong dI nay, fru canh cuoI, dou co mau. Mang di st ance duoc khoI fao bang
cach gan fung di st ance[ v] voI frj cua faI frong cua canh noI fu dInh nguon don
nou fon faI canh nay, nguoc IaI no duoc gan bang vo cuc.
o xac djnh dInh duoc fhom vao S faI moI buoc, chung fa ap dung mof fIou
ch fham Iam |greedy criterion) frong vIoc chon ra mof dInh co khoang cach
nho nhaf fu frong mang di st ance sao cho chua co frong S. Chung fa can chung
mInh rang, doI voI dInh nay, khoang cach chua frong mang di st ance fhuc su
Ia chIou daI cua duong dI ngan nhaf fu dInh nguon don . CIa su co mof duong dI
ngan hon fu nguon don , nhu hnh 13.9. uong dI nay dI ngang mof dInh x nao
do chua fhuoc S roI moI don |co fho IaI qua mof so dInh khac co nam frong S
fruoc khI gap ). Nhung nou duong dI nay ngan hon duong dI da duoc fo mau don
, fh doan duong ban dau frong no fu nguon don x con ngan hon nua, nghIa Ia
di st ance[ x] < di st ance[ v] , va nhu vay fIou ch fham Iam da phaI chon x
fhay v Ia dInh ko fIop duoc fhom vao S.
HInh 13.9 Tm mof duong dI ngan
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 355
KhI fhom va S, chung fa so fo mau va fo mau Iuon duong dI ngan nhaf fu
dInh nguon don |moI canh frong no fru canh cuoI fhuc su da duoc fo mau fruoc
do). Ko fIop, chung fa can cap nhaf IaI cac phan fu cua mang di st ance bang
cach xom xof doI voI moI dInh v nam ngoaI S, duong dI fu nguon qua roI don v
co ngan hon khoang cach fu nguon don v da duoc ghI nhan fruoc do hay khong.
Nou dIou nay xay ra co nghIa Ia chung fa vua phaf hIon duoc mof duong dI moI
cho dInh v co dI ngang qua ngan hon cach dI da xac djnh fruoc do, va nhu vay
chung fa can cap nhaf IaI di st ance[ w] bang di st ance[ v] cong voI faI frong
cua canh noI fu don w.
HInh 12.10 - V du vo cac duong dI ngan nhaf
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 356
13.5.3. VI du
Truoc khI vIof mof ham cho phuong phap nay, chung fa hay xom qua v du o
hnh 13.10. oI voI do fhj co huong o hnh |a), frang fhaI ban dau duoc chI ra o
hnh |b): fap S |cac dInh da duoc fo mau) chI gom co nguon Ia dInh 0, cac phan fu
cua mang di st ance chua cac con so duoc daf canh moI dInh con IaI. Khoang cach
don dInh 4 ngan nhaf, non 4 duoc fhom vao S nhu o hnh |c), va di st ance[ 3]
duoc cap nhaf fhanh 6. o khoang cach don 1 va 2 ngang qua 4 Ion hon khoang
cach da chua frong mang di st ance, non cac khoang cach nay frong di st ance
duoc gIu khong doI. Inh ko fIop gan nhaf doI voI nguon Ia dInh 2, no duoc fhom
vao S nhu hnh |d), khoang cach don cac dInh 1 va 3 duoc cap nhaf IaI ngang qua
dInh nay. HaI buoc cuoI cung, frong hnh |o) va |f), dInh 1 va 3 duoc fhom vao va
cac duong dI ngan nhaf fu dInh nguon don cac dInh con IaI duoc chI ra frong so
do cuoI.
13.5.4. Hen thuc
o hIon fhuc gIaI fhuaf fm duong ngan nhaf fron, chung fa can chon cach
hIon fhuc cho do fhj co huong. VIoc dung bang ko cho phop fruy xuaf ngau nhIon
don moI dInh cua do fhj. Hon nua, chung fa co fho su dung bang vua do chua cac
faI frong vua do chua fhong fIn vo cac dInh ko. Trong dac fa duoI day cua do fhj
co huong, chung fa fhom fhong so t empl at e cho phop nguoI su dung chon Iua
kIou cua faI frong fhoo y muon. Iay v du, nguoI su dung khI dung Iop Di gr aph
do mo hnh hoa mang cac fuyon bay, ho co fho chua gIa vo Ia mof so nguyon hay
mof so fhuc.
t empl at e <cl ass Weight, i nt graph_size>
cl ass Digraph {
publ i c:
/ / Thom const r uct or va cac phuong fhuc nhap va xuaf do fhj.
voi d set_distances( Ver t ex sour ce, Wei ght di st ance[ ] ) const ;
pr ot ect ed:
i nt count;
Wei ght adjacency[ gr aph_si ze] [ gr aph_si ze] ;
};
Thuoc fnh count chua so dInh cua mof doI fuong do fhj. Trong cac ung dung,
chung fa can bo sung cac phuong fhuc do nhap hay xuaf cac fhong fIn cua mof doI
fuong do fhj, nhung do chung khong can fhIof frong vIoc hIon fhuc phuong fhuc
distance do fm cac duong dI ngan nhaf, chung fa xom chung nhu Ia baI fap.
Chung fa so gIa su rang Iop Wei ght da co cac fac vu so sanh. NgoaI ra, nguoI
su dung so phaI khaI bao frj Ion nhaf co fho co cua Wei ght , goI Ia infinity.
Chang han, chuong frnh cua nguoI su dung voI faI frong Ia so nguyon co fho su
dung fhu vIon chuan ANSI C++<l i mi t s> voI djnh nghIa foan cuc nhu sau:
const Wei ght infinity = numer i c_l i mi t s<i nt >: : max( ) ;
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 357
Chung fa so daf frj cua InfInIfy vao cac phan fu cua mang di st ance fuong ung
voI cac canh fu khong fon faI nguon don moI dInh. Phuong fhuc set_distance
so fm cac duong dI ngan nhaf va cac khoang cach ngan nhaf nay so duoc fra vo
qua fham bIon di st ance[ ] .
t empl at e <cl ass Wei ght , i nt gr aph_si ze>
voi d Di gr aph<Wei ght , gr aph_si ze>: : set_distances( Ver t ex sour ce,
Wei ght distance[]) const
/ *
post: Mang di st ance chua duong dI co faI frong ngan nhaf fu dInh nguon don moI dInh frong
do fhj.
*/
{ Ver t ex v, w;
bool f ound[ gr aph_si ze] ; / / Iou dIon cac dInh frong S.
f or ( v = 0; v < count ; v++) {
f ound[ v] = f al se;
di st ance[ v] = adj acency[ sour ce] [ v] ;
}
f ound[ sour ce] =t r ue; / / KhoI fao bang cach bo dInh nguon vao S.
di st ance[ sour ce] = 0;
f or ( i nt i = 0; i < count ; i ++) { / / MoI Ian Iap bo fhom mof dInh vao S.
Wei ght mi n = i nf i ni t y;
f or ( w = 0; w < count ; w++) i f ( ! f ound[ w] )
i f ( di st ance[ w] < mi n) {
v = w;
mi n = di st ance[ w] ;
}
f ound[ v] = t r ue;
f or ( w = 0; w < count ; w++) i f ( ! f ound[ w] )
i f ( mi n + adj acency[ v] [ w] < di st ance[ w] )
di st ance[ w] = mi n + adj acency[ v] [ w] ;
}
}
o uoc doan fhoI gIan can do chay ham nay, chung fa fhay rang vong Iap
chnh fhuc hIon n-1 Ian, frong do n Ia so dInh, va bon frong vong Iap chnh co haI
vong Iap khac, moI vong Iap nay fhuc hIon n-1 Ian. Vay cac vong Iap fhuc hIon
|n-1)
2
Ian. Cac Ionh bon ngoaI vong Iap chI hof O|n), non fhoI gIan chay cua ham
Ia O|n
2
).
13.6. Cuy phu to teu
13.6.1. Out vun de
CIaI fhuaf fm duong dI ngan nhaf cua phan fron co fho duoc ap dung voI
mang hay do fhj co huong cung nhu mang hay do fhj khong co huong. V du, hnh
13.11 mInh hoa ung dung fm cac duong dI ngan nhaf fu dInh nguon 0 don cac
dInh khac frong mang.
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 358
Nou mang dua fron co so Ia mof do fhj IIon fhong C, fh cac duong dI ngan
nhaf fu mof dInh nguon nao do so noI nguon nay voI faf ca cac dInh khac frong
C. Tu do, nhu frong hnh 13.11, nou chung fa kof hop cac duong dI ngan nhaf
fnh duoc IaI voI nhau, chung fa co mof cay noI faf ca cac dInh cua C. NoI cach
khac, do Ia cay duoc fao boI faf ca cac dInh va mof so canh cua do fhj C. Chung
fa goI nhung cay nhu vay Ia cay phu |spanning tree) cua C. Cung nhu phan fruoc,
chung fa co fho xom mof mang fron mof do fhj C nhu Ia mof ban do cac fuyon
bay, voI moI dInh bIou dIon mof fhanh pho va faI frong fron mof canh Ia gIa vo
bay fu fhanh pho nay sang fhanh pho kIa. Mof cay phu cua C bIou dIon mof fap
cac duong bay cho phop cac hanh khach hoan faf mof chuyon du Ijch qua khap
cac fhanh pho. I nhIon rang, hanh khach can phaI fhuc hIon mof so fuyon bay
nao do mof vaI Ian moI hoan faf duoc chuyon du Ijch. Iou baf fIon nay duoc bu
dap boI chI ph fhap. Nou chung fa hnh dung mang frong hnh 13.11 nhu mof ho
fhong dIou khIon fap frung, fh dInh nguon fuong ung voI san bay frung fam, va
cac duong dI fu dInh nay Ia nhung hanh frnh bay. Mof dIou quan frong doI voI
mof san bay fhoo ho fhong dIou khIon fap frung Ia gIam foI da chI ph bang cach
chon Iua mof ho fhong cac duong bay ma fong chI ph nho nhaf.
nh ngha: Mof cay phu foI fIou |minimal spanning tree) cua mof mang IIon
fhong Ia cay phu ma fong cac faI frong fron cac canh cua no Ia nho nhaf.
Mac du vIoc so sanh haI cay phu frong hnh 13.12 Ia khong kho khan, nhung
cung kho ma bIof duoc con co cay phu nao co frj nho hon nua hay khong. aI foan
cua chung fa Ia xay dung mof phuong phap xac djnh mof cay phu foI fIou cua mof
mang IIon fhong.
HInh 13.11 Tm duong dI ngan nhaf frong mof mang
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 359
13.6.2. Phuong phup
Chung fa da bIof gIaI fhuaf fm cay phu frong mof do fhj IIon fhong, do gIaI
fhuaf fm duong ngan nhaf da co. Chung fa co fho fhay doI chuf f frong gIaI
fhuaf fm duong ngan nhaf do co duoc phuong phap fm cay phu foI fIou ma R. C.
PrIm da dua ra Ian dau vao nam 1957.
Truoc hof chung fa chon ra mof dInh baf dau, goI Ia nguon, va frong khI fIon
hanh phuong phap, chung fa nam gIu mof fap X cac dInh ma duong dI fu chung
don dInh nguon fhuoc vo cay phu foI fIou ma chung fa da fm fhay. Chung fa cung
can nam mof fap Y gom cac canh noI cac dInh frong X ma fhuoc cay dang duoc
xay dung. Nhu vay, chung fa co fho hnh dung rang cac dInh frong X va cac canh
frong Y da fao ra mof phan cua cay ma chung fa can fm, cay nay so Ion Ion
fhanh cay phu foI fIou cuoI cung. Iuc khoI dau, dInh nguon Ia dInh duy nhaf
frong X, va Y Ia fap rong. TaI moI buoc, chung fa fhom mof dInh vao X: dInh nay
duoc chon sao cho no co mof canh noI voI mof dInh nao do da co frong X co faI
frong nho nhaf, so voI cac faI frong cua faf ca cac canh khac noI cac dInh con
nam ngoaI X voI cac dInh da co frong X. Canh foI fIou nay so duoc dua vao Y.
VIoc chung mInh gIaI fhuaf PrIm dom IaI cay phu foI fIou khong fhuc do dang,
chung fa fam hoan vIoc nay IaI sau. Tuy nhIon, chung fa co fho hIou vo vIoc chon
Iua mof dInh moI do fhom vao X va mof canh moI do fhom vao Y . TIou ch PrIm
cho chung fa mof cach do dang nhaf do fhuc hIon vIoc kof noI nay, va nhu vay,
fhoo fIou ch fham Iam, chung fa non su dung no.
KhI hIon fhuc gIaI fhuaf PrIm, chung fa can nam gIu mof danh sach cac dInh
fhuoc X nhu Ia cac phan fu cua mof mang kIou bool . Cach nam gIu cac canh
frong Y so do dang nou nhu chung fa baf chuoc cach Iuu fru cac canh frong mof
do fhj.
HInh 13.12 HaI cay phu frong mof mang
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 360
Chung fa so can don mof mang phu neighbor do bIof fhom rang, doI voI moI
dInh , dInh nao frong X co canh don co faI frong nho nhaf. Cac faI frong nho
nhaf nay cung chua frong mang distance fuong ung. Nou mof dInh khong co
mof canh nao noI duoc voI mof dInh nao do frong X, frj cua phan fu fuong ung
cua no frong di st ance so Ia infinity.
Mang nei ghbor duoc khoI fao bang cach gan nei ghbor [ v] don dInh nguon
cho faf ca cac dInh , va di st ance duoc khoI fao bang cach gan di st ance[ v]
boI faI frong cua canh noI fu dInh nguon don hoac i nf i ni t y nou canh nay
khong fon faI.
o xac djnh dInh nao so duoc fhom vao fap X faI moI buoc, chung fa chon dInh
frong so cac dInh chua co frong X ma frj fuong ung frong mang di st ance Ia
nho nhaf. Sau do chung fa can cap nhaf IaI cac mang do phan anh dung su fhay
doI ma chung fa da Iam doI voI fap X nhu sau: voI moI v chua co frong X, nou co
HInh 13.13 V du vo gIaI fhuaf PrIm
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 361
mof canh noI va v, chung fa xom fhu faI frong cua canh nay co nho hon
di st ance[ w] hay khong, nou qua fhuc nhu vay fh di st ance[ w] can duoc cap
nhaf IaI bang frj cua faI frong nay, va nei ghbor [ w] so Ia .
Iay v du, chung fa hay xom xof mang frong hnh |a) cua hnh 13.13. Trang
fhaI ban dau frong hnh |b): Tap X |cac dInh duoc fo mau) chI gom dInh nguon 0,
va doI voI moI dInh v, dInh duoc Iuu frong nei ghbor [ w| duoc chI boI cac muI fon
fu v. Trj cua di st ance[ w] Ia faI frong cua canh fuong ung. Khoang cach fu
nguon don dInh 1 Ia mof frong nhung frj nho nhaf, non 1 duoc fhom vao X nhu
hnh |c), va frong cac phan fu cua cac mang nei ghbor va di st ance chI co cac
phan fu fuong ung voI dInh 2 va dInh 5 Ia duoc cap nhaf IaI. Inh ko fIop gan voI
cac dInh frong X nhaf Ia dInh 2, no duoc fhom vao X nhu hnh |d), frong nay
cung da chI ra cac frj cua cac mang da duoc cap nhaf IaI. Cac buoc cuoI cung duoc
mInh hoa frong hnh |o), |f) va |g).
13.6.3. Hen thuc
o hIon fhuc gIaI fhuaf PrIm, chung fa can chon mof Iop do bIou dIon cho
mang. Su fuong fu cua gIaI fhuaf nay so voI gIaI fhuaf fm duong ngan nhaf frong
phan fruoc gIup chung fa quyof djnh fhIof ko Iop Net wor k dan xuaf fu Iop
Di gr aph.
t empl at e <cl ass Wei ght , i nt gr aph_si ze>
cl ass Network: publ i c Digraph<Wei ght , gr aph_si ze> {
publ i c:
Net wor k( ) ;
voi d r ead( ) ; / / jnh nghIa IaI do nhap fhong fIn vo mang.
voi d make_empt y( i nt si ze = 0) ;
voi d add_edge( Ver t ex v, Ver t ex w, Wei ght x) ;
voi d mi ni mal _spanni ng( Ver t ex sour ce,
Net wor k<Wei ght , gr aph_si ze> &t r ee) const ;
};
Chung fa so vIof IaI phuong fhuc nhap read do dam bao rang faI frong cua
canh |, v) Iuon frung voI faI frong cua canh |v, ), voI moI va v, v day Ia mof
mang vo huong. Phuong fhuc moI make_empty(int size) fao mof mang co
size dInh va khong co canh. Phuong fhuc khac, add_edge, fhom mof canh co
mof faI frong cho fruoc vao mang. Chung fa cung da gIa su rang Iop Wei ght da co
day du cac foan fu so sanh. NgoaI ra, nguoI su dung can khaI bao frj Ion nhaf co
fho cua Wei ght goI Ia infinity. Phuong fhuc minimal_spanning ma chung fa
so vIof o day so fm cay phu foI fIou va fra vo qua fham bIon tree. Tuy phuong
fhuc chI co fho fm cay phu khI fhuc hIon fron mof mang IIon fhong, no cung co
fho fm mof cay phu cho mof fhanh phan IIon fhong co chua dInh source frong
mang.
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 362
t empl at e <cl ass Wei ght , i nt gr aph_si ze>
voi d Net wor k<Wei ght , gr aph_si ze>: : minimal_spanning( Ver t ex sour ce,
Net wor k<Wei ght , gr aph_si ze> &t r ee) const
/ *
post: Xac djnh cay phu foI fIou frong fhanh phan IIon fhong co chua dInh sour ce cua mang.
*/
{
t r ee. make_empt y( count ) ;
bool component [ gr aph_si ze] ; / / Cac dInh frong fap X.
Ver t ex nei ghbor [ gr aph_si ze] ; / / Phan fu fhu I chua dInh fruoc cua no sao cho khoang
/ / cach gIua chung nho nhaf so voI cac khoang cach fu
/ / cac dInh fruoc khac da co frong fap X don no.
Wei ght di st ance[ gr aph_si ze] ; / / Cac khoang cach nho nhaf fuong ung voI fung phan fu
/ / frong mang nei ghbor fron.
Ver t ex w;
f or ( w = 0; w < count ; w++) {
component [ w] = f al se;
di st ance[ w] = adj acency[ sour ce] [ w] ;
nei ghbor [ w] = sour ce;
}
component [ sour ce] = t r ue; / / Tap X chI co duy nhaf dInh nguon.
f or ( i nt i = 1; i < count ; i ++) {
Ver t ex v; / / MoI Ian Iap bo sung fhom mof dInh vao fap X.
Wei ght mi n = i nf i ni t y;
f or ( w = 0; w < count ; w++) i f ( ! component [ w] )
i f ( di st ance[ w] < mi n) {
v = w;
mi n = di st ance[ w] ;
}
i f ( mi n < i nf i ni t y) {
component [ v] = t r ue;
t r ee. add_edge( v, nei ghbor [ v] , di st ance[ v] ) ;
f or ( w = 0; w < count ; w++) i f ( ! component [ w] )
i f ( adj acency[ v] [ w] < di st ance[ w] ) {
di st ance[ w] = adj acency[ v] [ w] ;
nei ghbor [ w] = v;
}
}
el se br eak; / / Xong mof fhanh phan IIon fhong frong do fhj khong IIon fhong.
}
}
Vong Iap chnh frong ham fron fhuc hIon n-1 Ian, voI n Ia so dInh, va frong
vong Iap chnh con co haI vong Iap khac, moI vong Iap nay fhuc hIon n-1 Ian. Vay
cac vong Iap fhuc hIon |n-1)
2
Ian. Cac Ionh bon ngoaI vong Iap chI hof O|n), non
fhoI gIan chay cua ham Ia O|n
2
).
13.6.4. Kem tru gu thuut Prm
Chung fa can chung mInh rang, doI voI do fhj IIon fhong C, cay phu S sInh ra
boI gIaI fhuaf PrIm phaI co fong faI frong fron cac canh nho hon so voI baf ky
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 363
mof cay phu nao khac cua C. CIaI fhuaf PrIm xac djnh mof chuoI cac canh s
1
, s
2
,
..., s
n
fao ra cay phu S. Nhu hnh 13.14, s
1
Ia canh fhu nhaf duoc fhom vao fap Y
frong gIaI fhuaf PrIm, s
2
Ia canh fhu haI duoc fhom vao, va cu fho.
o chung mInh S Ia mof cay phu foI fIou, chung fa chung mInh rang nou m Ia
mof so nguyon, 0 m n, fh so co mof cay phu foI fIou chua canh s
I
voI I m.
Chung fa so chung mInh quy nap fron m. Truong hop co ban, khI m = 0, ro rang
Ia dung, v baf ky cay phu foI fIou nao cung dou phaI chua mof fap rong cac canh.
NgoaI ra, khI chung fa hoan faf vIoc quy nap, fruong hop cuoI cung voI m = n chI
ra rang co mof cay phu foI fIou chua faf ca cac canh cua S, va chnh Ia S. |Iuu y
rang nou fhom baf ky mof canh nao vao mof cay phu fh cung fao ra mof chu
frnh, non baf ky cay phu nao chua moI canh cua S dou phaI chnh Ia S). NoI cach
khac, khI chung fa hoan faf vIoc quy nap, chung fa da chung mInh duoc rang S
chnh Ia cay phu foI fIou.
Nhu vay chung fa can frnh bay cac buoc quy nap bang cach chung mInh rang
nou m < n va T Ia mof cay phu foI fIou chua cac canh s
I
voI I m, fh phaI co mof
cay phu foI fIou ! cung chua cac canh fron va fhom mof canh s
m+1
. Nou s
m+1
da co
frong T, chung fa co fho don gIan cho ! = T, nhu vay chung fa co fho gIa su rang
s
m+1
khong Ia mof canh frong T. Chung fa hay xom hnh |b) cua hnh 13.14.
Chung fa hay goI X Ia fap cac dInh frong S fhuoc cac canh s
1
, s
2
, ..., s
m
va R Ia
fap cac dInh con IaI frong S. Trong gIaI fhuaf PrIm, canh s
m+1
noI mof dInh frong
HInh 13.14 KIom fra gIaI fhuaf PrIm
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 364
X voI mof dInh frong R, va s
m+1
Ia mof frong cac canh co faI frong nho nhaf noI
gIua haI fap nay. Chung fa hay xof anh huong cua vIoc fhom canh s
m+1
nay vao T,
nhu mInh hoa frong hnh |c). VIoc fhom vao nay phaI fao ra mof chu frnh C, do
mang IIon fhong T ro rang Ia co chua mof duong dI co nhIou canh noI haI dau cua
canh s
m+1
. Chu frnh C phaI co chua mof canh f s
m+1
noI fap X voI fap R, do nou
chung fa dI doc fhoo duong dI khop kn C chung fa phaI dI vao fap X mof so Ian
bang voI so Ian chung fa dI ra khoI no. Chung fa hay xom hnh |d). CIaI fhuaf
PrIm bao dam rang faI frong cua s
m+1
nho hon hoac bang faI frong cua f. o do,
cay phu moI ! frong hnh |o), co duoc fu T bang cach IoaI dI f va fhom vao s
m+1
,
so co fong faI frong khong Ion hon faI frong cua T. Nhu vay chung fa da co duoc
! Ia mof cay phu foI fIou cua C, ma ! chua cac canh s
1
, s
2
, ..., s
m
, s
m+1
. Iou nay
hoan faf duoc qua frnh quy nap cua chung fa.
13.7. Su dung do th{ nhu lu cuu truc du leu
Trong chuong nay, chung fa da fm hIou chI mof f ung dung cua do fhj, nhung
chung fa da baf dau fham nhap vao nhung van do sau sac cua cac gIaI fhuaf vo do
fhj. NhIou gIaI fhuaf frong so do, do fhj xuaf hIon nhu cac cau fruc foan hoc va da
nam baf duoc cac dac frung fhIof you cua baI foan, fhay v chI Ia nhung cong cu
fnh foan cho ra duoc nhung IoI gIaI cua chung. Iuu y rang frong chuong nay
chung fa da noI vo cac do fhj nhu Ia cac cau fruc foan hoc, chu khong nhu cac cau
fruc du IIou, do chung fa da su dung chung do dac fa cac van do frong foan hoc,
va do vIof cac gIaI fhuaf, chung fa da hIon fhuc cac do fhj frong cac cau fruc du
IIou nhu danh sach hoac bang. Tuy vay, ro rang Ia do fhj fu ban fhan no co fho
duoc xom nhu cac cau fruc du IIou - cac cau fruc du IIou ma co chua cac moI quan
ho gIua cac du IIou phuc fap hon nhung g da duoc mo fa frong mof danh sach
hoac mof cay. o fnh fong quaf va mom doo, do fhj Ia cau fruc du IIou raf hIou
qua va da fo ro nhung gIa frj cua no frong nhung ung dung cap fIon nhu fhIof ko
ho quan frj co so du IIou chang han. Taf nhIon, mof cong cu manh nhu vay cang
non duoc su dung moI khI can fhIof, nhung vIoc su dung no can phaI duoc kof hop
voI vIoc xom xof mof cach can fhan do suc manh cua no khong Iam cho cho chung
fa bj roI. Cach an foan nhaf frong vIoc su dung mof cong cu manh Ia dua fron su
chnh quy; nghIa Ia, chung fa chI su dung cong cu manh frong nhung phuong
phap da duoc djnh nghIa mof cach can fhan va do hIou. o fnh fong quaf cua do
fhj, vIoc fuan fhu nguyon fac vua nou ra frong vIoc su dung no khong phaI Iuon do
dang.
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
365
Phan 3 CAC NG ONG CA CAC LOP CTOL
Chng 14 NG ONG CA NGAN XKP
ua fron fnh chaf cua cac gIaI fhuaf, cac ung dung cua ngan xop co fho duoc
chIa Iam bon nhom nhu sau: dao nguoc du IIou, phan fch bIon djch du IIou, fr
hoan cong vIoc va cac gIaI fhuaf quay IuI. Mof dIou dang chu y o day Ia khI xom
xof cac ung dung, chung fa khong bao gIo quan fam don cau fruc chI fIof cua ngan
xop. Chung fa Iuon su dung ngan xop nhu mof cau fruc du IIou fruu fuong voI cac
chuc nang ma chung fa da djnh nghIa cho no.
14.1. Ouo nguoc du leu
Trong phan frnh bay vo ngan xop chung fa da duoc Iam quon voI mof v du
xuaf cac phan fu fhoo fhu fu nguoc voI fhu fu nhap vao. O day chung fa fIop fuc
fham khao fhom ung dung doI mof so fhap phan sang mof so nhj phan.
ng dung do so thup phun sung so nh{ phun
CIaI fhuaf duoI day chuyon doI so fhap phan decNumsang mof so nhj phan.
Tuy nhIon cac ky so duoc xuaf ra so Ia fhu fu nguoc cua kof qua ma chung fa
mong muon. Chang han so 19 Io ra phaI duoc doI fhanh 10011 chu khong phaI Ia
11001. Thuc Ia do dang nou chung fa su dung ngan xop do khac phuc dIou nay.
1 l oop ( decNum> 0)
1 di gi t = decNum%2
2 xuaf ( di gi t )
3 decNum= decNum/ 2
2 endl oop
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
366
Mof dIou do nhan fhay Ia nou chung fa dung mof mang IIon fuc |ar r ay frong
C++) do chua cac so di gi t roI fm cach In fhoo fhu fu dao IaI, chung fa so phaI
fIou fon suc Iuc vao vIoc quan Iy cac bIon chI so chay fron mang. o Ia dIou non
franh. VIoc fuan fhu IoI khuyon nay gIup chung fa co fhoI quon fof khI dung phaI
nhung baI foan Ion hon: chung fa co fho fap frung vao gIaI quyof nhung van do
chnh cua baI foan.
14.2. Phun tIch ben d{ch (pursng) du leu
VIoc phan fch du IIou fhuong bao gom phan fch fu vung va phan fch cu
phap. Chang han, do chuyon doI mof chuong frnh nguon duoc vIof boI mof ngon
ngu nao do fhanh ngon ngu may, frnh bIon djch can fach chuong frnh ay ra
fhanh cac fu khoa, cac danh hIou, cac ky hIou, sau do fIon hanh kIom fra fnh
hop Io vo fu vung, vo cu phap. Trong vIoc kIom fra cu phap fh vIoc kIom fra cau
fruc khoI Iong nhau mof cach hop Io Ia mof frong nhung dIou co fho duoc fhuc
hIon do dang nho ngan xop.
ng dung kem tru tInh hop le cuu cuc cuu truc kho long nhuu
o kIom fra fnh hop Io cua cac cau fruc khoI Iong nhau, chung fa can kIom
fra cac cap dau ngoac nhu |, {l, |) phaI fuan fhoo mof fhu fu dong mo hop Io, co
nghIa Ia moI khoI can phaI nam gon frong mof khoI khac, nou co.
Iy do su dung ngan xop duoc gIaI fhch nhu sau: fhoo fhu fu xuaf hIon, mof
dau ngoac mo xuaf hIon sau can phaI co dau ngoac dong fuong ung xuaf hIon
fruoc. V du |)| Ia hop Io, ||) Ia khong hop Io. Iou nay ro rang IIon quan
don nguyon fac IIIO cua ngan xop. MoI cau fruc khoI so duoc chung fa bIof don
voId Deci mal ToBi nar y |val i nt decNum)
post: so nhj phan fuong duong voI so fhap phan decNumso duoc xuaf ra.
uses: su dung Iop St ack do dao nguoc fhu fu cac so 1 va so 0.
{
1. Stack<int> reverse; / / KhoI fao ngan xop do chua cac ky so 0 va 1.
2. l oop |docNum > 0)
1. di gi t = decNum%2
2. reverse.push(digit)
3. decNum= decNum/ 2
3. endl oop
4. loop ( ! reverse.empty())
1. reverse.top(digit)
2. reverse.pop()
3. xuaf( di gi t )
5 endloop
}
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
367
khI baf dau gap dau ngoac mo cua no, va chung fa so cho cho don khI nao gap dau
ngoac dong fuong ung cua no fh xom nhu chung fa da duyof qua cau fruc do. Cac
dau ngoac mo ma chung fa gap, chung fa so Ian Iuof Iuu vao ngan xop, nou doan
chuong frnh hop Io, fh chung fa cu yon fam rang cac dau ngoac dong fuong ung
cua chung so xuaf hIon fhoo dung fhu fu nguoc IaI. Nhu vay, moI khI gap mof dau
ngoac dong, vIoc can Iam Ia Iay fu ngan xop ra mof dau ngoac mo va so frung.
Van ban can kIom fra fhuong Ia mof bIou fhuc fnh foan hay mof doan chuong
frnh.
Giai thuat: oc doan van ban fung ky fu mof. MoI dau ngoac mo |, , { duoc
xom nhu mof dau ngoac chua so frung va duoc Iuu vao ngan xop cho don khI gap
mof dau ngoac dong ), |, l so frung fuong ung. MoI dau ngoac dong can phaI so
frung duoc voI dau ngoac mo vua duoc Iuu cuoI cung, va nhu vay dau ngoac mo
nay so duoc Iay ra khoI ngan xop va bo dI. Nhu vay vIoc kIom fra so duoc Iap cho
don khI gap mof dau ngoac dong ma khong so frung duoc voI dau ngoac mo vua
Iuu fru |IoI cac khoI khong Iong nhau) hoac don khI hof van ban can kIom fra.
Truong hop dau ngoac dong xuaf hIon ma ngan xop rong Ia fruong hop van ban bj
IoI fhua dau ngoac dong |fnh don vj fr dang xof); nguoc IaI, khI doc hof doan van
ban, nou ngan xop khong rong fh do IoI fhua dau ngoac mo.
Chuong frnh co fho mo rong hon doI voI nhIou cap dau ngoac khac nhau, hoac
cho ca fruong hop dac bIof vo doan chu fhch frong mof chuong frnh C |/` ...phan
frong nay dI nhIon khong can kIom fra fnh hop Io cua cac cap dau ngoac ...`/)
i nt main( )
/ *
post: Chuong frnh so bao cho nguoI su dung khI doan van ban can phan fch gap IoI.
uses: Iop St ack.
*/
{
St ack<char > openi ngs;
char symbol ;
bool i s_mat ched = t r ue;
whi l e ( i s_mat ched && ( symbol = ci n. get ( ) ) ! = ' \ n' ) {
i f ( symbol == ' {' | | symbol == ' (' | | symbol == ' [' )
openings.push( symbol ) ;
i f ( symbol == ' }' | | symbol == ' )' | | symbol == ' ]' ) {
i f ( openi ngs. empt y( ) ) {
cout << " Unmat ched cl osi ng br acket " << symbol
<< " det ect ed. " << endl ;
i s_mat ched = f al se;
}
el se {
char mat ch;
openings.top( mat ch) ;
openings.pop( ) ;
i s_mat ched = ( symbol == ' }' && mat ch == ' {' )
| | ( symbol == ' )' && mat ch == ' (' )
| | ( symbol == ' ]' && mat ch == ' [' ) ;
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
368
i f ( ! i s_mat ched)
cout << " Bad mat ch " << mat ch << symbol << endl ;
}
}
}
i f ( ! openi ngs. empt y( ) )
cout << " Unmat ched openi ng br acket ( s) det ect ed. " << endl ;
}
14.3. TrI houn cong vec
KhI su dung ngan xop do dao nguoc du IIou, foan bo du IIou can duoc duyof
xong, chung fa moI baf dau Iay du IIou fu ngan xop. Nhom ung dung IIon quan
don vIoc fr hoan cong vIoc fhuong chI can fr hoan vIoc xu Iy du IIou frong mof
fhoI gIan nhaf djnh nao do ma fhoI.
Co nhIou gIaI fhuaf ma du IIou can xu Iy co fho xuaf hIon baf cu Iuc nao, chung
so duoc Iuu gIu IaI do chuong frnh Ian Iuof gIaI quyof. Trong fruong hop du IIou
can duoc xu Iy fhoo dung fhu fu ma chung xuaf hIon, chung fa so dung hang doI
Iam noI Iuu fru du IIou. Nguoc IaI, nou fhu fu xu Iy du IIou nguoc voI fhu fu ma
chung xuaf hIon, chung fa so dung ngan xop do nguyon fac IIIO cua no.
14.3.1. ng dung tInh tr{ cuu beu thuc postfix
Chung fa so xom xof v du vo cach fnh frj cua mof bIou fhuc o dang aIan
nguoc |reverse Polish calculator- con goI Ia postfix). Trong bIou fhuc nay foan fu
Iuon dung sau foan hang cua no. Trong qua frnh duyof bIou fhuc, khI gap cac
foan hang chung fa phaI hoan vIoc fnh foan cho don khI gap foan fu fuong ung
cua chung, do do chung so duoc day vao ngan xop. KhI gap foan fu, cac foan hang
duoc Iay ra khoI ngan xop, phop fnh duoc fhuc hIon va kof qua IaI duoc day vao
ngan xop |do kof qua nay co fho IaI Ia foan hang cua mof phop fnh khac ma foan
fu cua no chua xuaf hIon). Thu fu IIIO duoc nhn fhay o cho: foan fu cua nhung
foan hang xuaf hIon fruoc Iuon dung sau foan fu cua nhung foan hang xuaf hIon
sau. Chang han, voI 8 5 2 - + |fuong duong 8 + |5-2) ), so 8 xuaf hIon fruoc so 2,
nhung phop fru cua |5 - 2) IaI co fruoc phop cong.
VIoc phan fch mof bIou fhuc IIon quan don vIoc xu Iy chuoI do fach ra cac
foan hang cung nhu cac foan fu. o phan fIop fhoo day chI chu frong don y fuong
su dung ngan xop frong gIaI fhuaf, non chuong frnh so nhan bIof cac fhanh phan
cua bIou fhuc mof cach do dang fhong qua vIoc cho phop nguoI su dung Ian Iuof
nhap chung. VIoc phan fch bIou fhuc co fho duoc xom nhu baI fap khI sInh vIon
kof hop voI cac kIon fhuc khac co IIon quan don vIoc xu Iy chuoI ky fu.
Trong chuong frnh, nguoI su dung nhap dau 7 do bao fruoc so nhap mof foan
hang, foan hang nay so duoc chuong frnh Iuu vao ngan xop. KhI cac dau +, -, `, /
duoc nhap, chuong frnh so Iay cac foan hang fu ngan xop, fnh va dua kof qua
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
369
vao ngan xop; dau = you cau hIon fhj phan fu faI dInh ngan xop |nhung khong Iay
ra khoI ngan xop), do Ia kof qua cua mof phop fnh moI nhaf vua duoc fhuc hIon.
CIa su a, b, c, d bIou dIon cac gIa frj so. ong nhap ? u ? b ? c - = * ? d + =
duoc fhuc hIon nhu sau:
? u: day a vao ngan xop;
? b: day b vao ngan xop
? c: day c vao ngan xop
- : Iay c va b ra khoI ngan xop, day b-c vao ngan xop
= : In gIa frj b-c
* : Iay 2 foan hang fu ngan xop Ia frj |b-c) va a, fnh a ` |b-c), dua kof qua vao
ngan xop.
? d: day d vao ngan xop.
+ : Iay 2 foan hang fu ngan xop Ia d va frj |a ` |b-c)), fnh |a ` |b-c)) + d, dua kof
qua vao ngan xop.
= : In kof qua |a ` |b-c)) + d
!u dIom cua cach fnh aIan nguoc Ia moI bIou fhuc phuc fap dou co fho duoc
bIou dIon khong can cap dau ngoac |).
Cach bIou dIon aIan nguoc raf fIon IoI frong cac frnh bIon djch cung nhu cac
phop fnh foan.
Ham phu fro get_command nhan Ionh fu nguoI su dung, kIom fra hop Io va
chuyon fhanh chu fhuong boI tolower( ) frong fhu vIon cct ype.
i nt main( )
/ *
post: chuong frnh fhuc hIon fnh foan frj cua bIou fhuc so hoc dang posffIx do nguoI su dung
nhap vao.
uses: Iop St ack va cac ham i nt r oduct i on, i nst r uct i ons, do_command, get _command.
*/
{
St ack<doubl e> stored_numbers;
i nt r oduct i on( ) ; / / CIoI fhIou vo chuong frnh.
i nst r uct i ons( ) ; / / Xuaf cac huong dan su dung chuong frnh.
whi l e ( do_command( get _command( ) , stored_numbers) ) ;
}
char get_command( )
/ *
post: fra vo mof frong nhung ky fu hop Io do nguoI su dung go vao |7, =, +, -, `, /, q).
*/
{
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
370
char command;
bool wai t i ng = t r ue;
cout << " Sel ect command and pr ess <Ent er >: " ;
whi l e ( wai t i ng) {
ci n >> command;
command = t ol ower ( command) ;
i f ( command == ' ?' | | command == ' =' | | command == ' +' | |
command == ' -' | | command == ' *' | | command == ' /' | |
command == ' q' ) wai t i ng = f al se;
el se {
cout << " Pl ease ent er a val i d command: " << endl
<< " [ ?] push t o st ack [ =] pr i nt t op" << endl
<< " [ +] [ -] [ *] [ /] ar e ar i t hmet i c oper at i ons" << endl
<< " [ Q] ui t . " << endl ;
}
}
r et ur n command;
}
Ngan xop st or ed_number s Iam fhong so cho ham do_command duoc khaI bao Ia fham chIou
do no can phaI fhay doI khI ham duoc goI.
bool do_command( char command, Stack<doubl e> &number s)
/ *
pre: command chua ky hIou cua phop fnh so hoc |+, - `, /) hoac cac ky fu da quy djnh |q, =, 7).
post: VIoc xu Iy fuy fhuoc fhong so command. Ham fra vo t r ue, ngoaI fru fruong hop kof fhuc
vIoc fnh foan khI command Ia q.
uses: Iop St ack.
*/
{
doubl e p, q;
swi t ch ( command) {
case ' ?' :
cout << " Ent er a r eal number : " << f l ush;
ci n >> p;
i f ( number s. push( p) == over f l ow)
cout << " War ni ng: St ack f ul l , l ost number " << endl ;
br eak;
case ' =' :
i f ( number s. t op( p) == under f l ow)
cout << " St ack empt y" << endl ;
el se
cout << p << endl ;
br eak;
case ' +' :
i f ( number s. t op( p) == under f l ow)
cout << " St ack empt y" << endl ;
el se {
number s. pop( ) ;
i f ( number s. t op( q) == under f l ow) {
cout << " St ack has j ust one ent r y" << endl ;
number s. push( p) ;
}
el se {
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
371
number s. pop( ) ;
i f ( number s. push( q + p) == over f l ow)
cout << " War ni ng: St ack f ul l , l ost r esul t " << endl ;
}
}
br eak;
/ / Add opt i ons f or f ur t her user commands.
case ' q' :
cout << " Cal cul at i on f i ni shed. \ n" ;
r et ur n f al se;
}
r et ur n t r ue;
}
14.3.2. ng dung chuyen do beu thuc dung infix thunh dung postfix
Nguoc voI bIou fhuc dang postfix, bIou fhuc dang infix cho phop co cac dau
ngoac dong mo quy uoc vo do uu fIon cua cac phop fnh. Chung fa co do uu fIon fu
cao xuong fhap fhoo fhu fu sau day:
o uu fIon 2 |cao nhaf): cac phop fnh ` va /
o uu fIon 1 : cac phop fnh + va -
o uu fIon 0 : dau |, )
KhI duyof bIou fhuc infix fu fraI sang phaI, cac foan hang frong bIou fhuc infix
dou duoc dua ngay vao bIou fhuc postfix, cac foan fu can duoc hoan IaI non duoc
dua vao ngan xop. Trong bIou fhuc postfix, foan fu nao gap fruoc so duoc fnh
foan fruoc. o do, fu bIou fhuc infix, fruoc khI mof foan fu nao do can duoc dua
vao ngan xop fh phaI Iay fu dInh ngan xop faf ca cac foan fu co do uu fIon cao
hon no do daf vao bIou fhuc postfix fruoc. RIong fruong hop do uu fIon cua foan
fu dang can dua vao ngan xop bang voI do uu fIon cua foan fu dang o dInh ngan
xop, fh foan fu o dInh ngan xop cung duoc Iay ra fruoc nou cac foan fu nay Ia cac
foan fu kof hop fraI |VIoc fnh foan xu Iy fu fraI sang phaI).
Chung fa quan saf ba v du sau day:
a + b * c duoc chuyon fhanh a b c * + |1)
a ` b + c duoc chuyon fhanh a b ` c + |2)
a + b - c duoc chuyon fhanh a b + c - |3)
V du 1, dau + van o frong ngan xop, va dau ` duoc day vao ngan xop.
V du 2, dau ` duoc Iay ra khoI ngan xop fruoc khI dua dau + vao.
V du 3, dau + duoc Iay ra khoI ngan xop fruoc khI dua dau - vao.
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
372
Trong fruong hop co dau ngoac, dau mo ( can duoc Iuu frong ngan xop cho
don khI gap dau dong ) fuong ung. Chung fa quy uoc do uu fIon cua dau ngoac mo
fhap nhaf Ia hop Iy. MoI foan fu xuaf hIon sau dau ngoac mo dou khong fho Iam
cho dau nay duoc Iay ra khoI ngan xop, fru khI dau ngoac dong fuong ung duoc
duyof don. KhI gap dau dong ), xom nhu kof fhuc moI vIoc fnh foan frongcap
dau |), moI foan fu con nam fron dau mo ( frong ngan xop dou duoc Iay ra do dua
vao bIou fhuc dang postfix. o cac dau ngoac khong bao gIo xuaf hIon frong bIou
fhuc postfix, dau | duoc daf vao ngan xop do cho dau ) fuong ung, khI no duoc
Iay ra fh so bj vaf bo. au ) do gIaI quyof cho dau |, va cung so bj vaf dI.
Cac foan fu +, -, `, / dou Ia cac foan fu kof hop fu fraI sang phaI. Iou fhuc
a - b - c | duoc hIou Ia ( a- b) - c ) duoc chuyon doI fhanh a b - c - |khong phaI a b
c - - ). VoI mof so foan fu kof hop fu phaI sang fraI, chang han phop fnh Iuy fhua
fh 2^2^3 = 2^|2^3)= 2^8=256, khong phaI |2^2)^3= 4^3=64, fh cac xu Iy fron
can duoc sua doI cho hop Iy. Chuong frnh hoan chInh chuyon doI bIou fhuc dang
infix sang bIou fhuc dang postfix, cung nhu vIoc xu Iy dac bIof cho fruong hop
foan fu kof hop phaI duoc xom nhu baI fap.
14.4. Gu thuut quuy lu (backtracking)
Ngan xop con duoc su dung frong cac gIaI fhuaf quay IuI nham Iuu IaI cac
fhong fIn da fung duyof qua do co fho quay nguoc fro IaI. Chung fa so xom xof cac
v du sau day.
14.4.1. ng dung trong bu toun tIm dIch (goal seeking).
Hnh 14.1 mInh hoa cho baI foan fm dch. Chung fa co mof nuf baf dau va
mof nuf goI Ia dch don. o don gIan, chung fa xof do fhj khong co chu frnh va
chI co duy nhaf mof duong dI fu noI baf dau don dch. Nhn hnh vo chung fa co
fho nhan ra ngay duong dI nay. Tuy nhIon may fnh can mof gIaI fhuaf fhch
hop do fm ra duoc con duong nay.
Chung fa baf dau fu nuf 1, sang nuf 2 va nuf 3. TaI nuf 3 co 2 nga ro, gIa su
chung fa dI fhoo duong fron, don nuf 4 va nuf 5. TaI nuf 5 chung fa IaI dI fhoo
duong fron don nuf 6 va nuf 7. on day chung fa khong con duong dI fIop va cung
chua fm duoc dch can don, chung fa phaI quay fro IaI nuf 5 do chon IoI dI khac.
TaI nuf 8 chung fa IaI phaI quay IaI nuf 5 do dI sang nuf 9,. ang cach nay, fu
nuf 13, khI chung fa fm duoc nuf 16 fh chung fa khong can phaI quay IuI do fhu
voI nuf 17, 18 nua. CIaI fhuaf kof fhuc khI fm fhay dch don.
CIaI fhuaf cua chung fa can Iuu cac nuf do quay IaI. So sanh nuf 3 va nuf 5,
chung fa fhay rang fron duong dI chung fa gap nuf 3 fruoc, nhung dIom quay vo
do fhu fruoc IaI Ia nuf 5. o do cau fruc du IIou fhch hop chnh Ia ngan xop voI
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
373
nguyon fac IIIO cua no. NgoaI ra nou chung fa Iuu nuf 3 va nuf 5 fh co su baf
fIon o cho Ia khI quay vo, fhong fIn Iay fu ngan xop khong cho chung fa bIof cac
nhanh nao da duoc duyof qua va cac nhanh nao can fIop fuc duyof. o do, faI nuf
3, fruoc khI dI sang 4, chung fa Iuu nuf 12, faI nuf 5, fruoc khI dI sang 6 chung fa
Iuu nuf 8 va nuf 9,
VoI gIaI fhuaf fron chung fa co fho fm don dch mof cach do dang. Tuy nhIon,
nou baI foan you cau In ra cac nuf fron duong dI fu nuf baf dau don dch fh
chung fa chua Iam duoc. Nhu vay chung fa cung can phaI Iuu ca cac nuf fron
duong ma chung fa da dI qua. Nhung nuf nam fron nhung doan duong khong dan
don dch so duoc do bo khoI ngan xop khI chung fa quay IuI. O day chung fa gap
phaI mof van do cung fuong doI pho bIon frong mof so baI foan khac, do Ia nhung
g chung fa bo vao ngan xop khong co cung muc dch. Co haI nhom fhong fIn khac
nhau: mof Ia cac nuf nam fron duong dang dI qua, haI Ia cac nuf nam fron cac
nhanh ro khac ma chung fa so Ian Iuof fhu fIop khI gap fhaf baI fron con duong
dang dI. Trong nhung fruong hop nhu vay, vIoc gIaI quyof raf Ia do dang: chung
fa dung cach danh dau do phan bIof fung fruong hop, khI Iay ra khoI ngan xop,
can cu vao cach danh dau nay chung fa so bIof phaI xu Iy nhu fho nao cho fhch
hop |VIoc duyof cay fhoo fhu fu IRN frong chuong 10 nou dung ngan xop cung Ia
mof v du). Trong hnh 14.1, ky fu frong ngan xop cho bIof do Ia nhung nuf
danh cho vIoc quay IuI |Backtracking) do fhu voI nhanh khac. Vay khI gap dIom
cuoI cua mof con duong khong dan don dch, chung fa do bo khoI ngan xop cac
nuf cho don khI gap mof nuf co ky fu , bo IaI nuf nay vao ngan xop |khong con
ky fu ), va dI fIop cac nuf ko fIop fhoo nuf nay. CuoI cung khI gap dch, con
duong duoc fm fhay chnh Ia cac nuf dang Iuu frong ngan xop ma khong co ky fu
o dau.
HInh 14.1- V du va ngan xop mInh hoa qua frnh backtracking.
St ar t node
The goal
2 3 1
4 5
6
8
9 10 11
16
15 14 13 12
17
18
7
end
7 end goal
6 end 11 16
B8 B8 8 10 15
B9 B9 B9 9 14
5 5 5 5 B17
4 4 4 4 13
B12 B12 B12 B12 B12 12
3 3 3 3 3 3
2 2 2 2 2 2
1 1 1 1 1 1
( a) ( b) ( c) ( d) ( e) ( f )
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
374
Tron day Ia ma gIa cho baI foan fm dch, cau fruc du IIou do chua do fhj
chung fa so duoc fm hIou sau frong chuong 13.
Al gor i t hmseek_goal( val gr aph_t ype gr aph, val node_t ype st ar t ,
val node_t ype goal )
/ *
pre: gr aph chua do fhj khong co chu frnh, frong do co mof nuf st ar t va mof nuf goal .
post: nou duong dI fu st ar t don goal duoc fm fhay so duoc In ra fhoo fhu fu fu goal nguoc
vo st ar t
`/
{
1. St ack<node_t ype> nodes. / / node_t ype Ia kIou du IIou fhch hop.
2. node_t ype cur r ent _node = st ar t
3. bool ean f ai l = FALSE
4. loop ( ( cur r ent _node chua Ia goal ) AND ( ! f ai l ) )
1. nodes. push( cur r ent _node)
2. if ( cur r ent _node Ia dIom ro nhanh)
1. next _node = nuf ro vao 1 nhanh
2. loop ( con nhanh chua dua vao ngan xop) / / dua cac nhanh
/ / con IaI vao ngan xop.
1. nodes. push( nuf ro vao 1 nhanh, co kom B )
3. endloop
3. else
1. if ( fon faI nuf ko)
1. next _node = nuf ko
2. else
1. repeat
1. if (nodes.empty())
1. f ai l = TRUE
2. else
1. nodes. t op( next _node)
2. nodes. pop( )
3. endif
2. until ((fail) OR (next_node co B))
3. endif
4. endif
5. cur r ent _node = next _node
5. endloop
6. if ( ! f ai l )
1. pr i nt ( The pat h t o your goal i s: )
2. pr i nt ( cur r ent _node) / / chnh Ia goaI
3. loop ( ! nodes. empt y( ) )
1. nodes. t op( cur r ent _node)
2. nodes. pop( )
3. if ( cur r ent _node khong co ky fu B )
1. pr i nt ( cur r ent _node)
4. endif
4. endloop
7. else
1. pr i nt ( Pat h not f ound! )
8. endif
}
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
375
14.4.2. Bu toun mu d tuun vu bu toun tum con huu
V du fIop fhoo IIon quan don baI foan ma dI fuan. Thuc ra baI foan fam con
hau duoc frnh bay frong chuong 6 cung hoan foan fuong fu. SInh vIon co fho
fham khao y fuong duoc frnh bay duoI day do gIaI baI foan fam con hau su dung
ngan xop fhay v do quy.
VoI ban co 64 o, baI foan ma dI fuan you cau chung fa chI ra duong dI cho con
ma baf dau fu mof o nao do, Ian Iuof dI qua faf ca cac o, ma khong co o nao Iap
IaI hon mof Ian.
Tu mof vj fr, con ma co foI da Ia 8 vj fr chung quanh co fho dI duoc. CIaI
fhuaf quay IuI raf gan voI huong suy nghI fu nhIon cua chung fa. Trong cac kha
nang co fho, chung fa fhuong chon ngau nhIon mof kha nang do dI. Va voI vj fr
moI chung fa cung Iam dIou fuong fu. MoI o dI qua chung fa danh dau IaI. Trong
qua frnh fhu nay, nou co Iuc khong con kha nang Iua chon nao khac v cac o nam
frong kha nang dI fIop dou da duoc danh dau, chung fa can phaI IuI IaI do fhu
nhung kha nang khac. Thay v bIou dIon duong dI cho con ma fron ban co |hnh
14.2a), chung fa vo IaI cac kha nang dI va fhay chung khong khac g so voI baI
foan fm dch |hnh 14.2b). Va nhu vay, chung fa fhay cach su dung ngan xop
frong nhung baI foan dang nay hoan foan don gIan va fuong fu. Phuong phap
quay IuI frong fruong hop nay doI khI con duoc goI Ia phuong phap fhu saI |trial
and error method).
1 2 3 4 5 6 7 8
1
2
3
4
5
6
7
8
|a) |b)
HInh 14.2- aI foan ma dI fuan.
Hnh fron day mInh hoa baI foan ma dI fuan voI dIom baf dau Ia |7,2). ch
don khong cu fho nhu baI foan fron, ma duong dI can fm chnh Ia duong dI nao
frong do fhj nay co du 64 nuf. aI foan nay phu fhuoc vao so o cua ban co va vj
|7,2)
|5,1)
|8,4)
|5,3)
|4,3)
|3,2)
|6,3)
|3,2)
|4,1)
|3,4)
|4,5)
|6,5)
|4,1)
|7,4)
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
376
fr baf dau cua con ma, kha nang co IoI gIaI va co bao nhIou IoI gIaI chung fa
khong xom xof o day. Chung fa chI quan fam don cach su dung ngan xop frong
nhung baI foan fuong fu. an chaf nhung baI nay dou co cung mof dac frung cua
baI foan fm dch fron mof do fhj khong co chu frnh. ch don co fho Ia nhIou
hon mof |fuong ung voI nhIou IoI gIaI duoc fm fhay) nhu frong baI foan fam con
hau ma cach gIaI do quy uoc frnh bay frong chuong 6. Su khac nhau co ban gIua
chung chI Ia mof vaI ky fhuaf nho nho du ng do chuyon fu du IIou ban dau cua baI
foan sang dang do fhj bIou dIon cac kha nang dI chuyon frong qua frnh fm don
dch ma fhoI.
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 377
Chng 15 NG ONG CA HANG OO
CTI hang doI duoc su dung raf rong raI frong cac chuong frnh may fnh.
ac bIof Ia frong cong vIoc cua ho dIou hanh khI can xu Iy cac cong vIoc mof cach
fuan fu. Hang doI frong chuong 3 Ia mof khaI nIom IIIO don gIan. Trong fhuc
fo, nguoI fa fhuong raf hay su dung cac hang doI uu fIon duoc frnh bay frong
chuong 11. Chuong nay mInh hoa mof so ung dung don gIan cua hang doI.
15.1. Cuc d{ch vu
Chung fa co fho vIof mof chuong frnh mo phong vIoc cung cap cac djch vu.
Chang han faI quay ban vo cac fuyon bay, co nhIou nguoI dang don va dang sap
hang cho do mua vo. Co kha nang chI co mof nhan vIon ban vo, hoac co nhIou
nhan vIon ban vo dong fhoI. SInh vIon hay xom day nhu Ia mof goI y do vIof
fhanh mof ung dung cho CTI hang doI. Nhung dIou fhuong duoc quan fam Ia:
ThoI gIan cho doI frung bnh |queue time) cua mof khach hang fu Iuc don cho
don Iuc duoc baf dau duoc phuc vu.
ThoI gIan phuc vu frung bnh |service time) ma mof djch vu duoc fhuc hIon.
ThoI gIan dap ung frung bnh |response time) cua mof khach hang fu Iuc don
cho don Iuc roI khoI quay |chnh bang fong haI fhoI gIan fron).
Tan suaf don cua khach hang.
ua vao nhung dIou fron nguoI fa co fho dIou chInh cac ko hoach phuc vu cho
fhch hop hon.
15.2. Phun lou
Mof v du vo phan IoaI Ia vIoc su dung nhIou hang doI cung mof Iuc. Tuy fhoo
dac dIom cua cac you cau cong vIoc, moI hang doI chI nhan cac cong vIoc cung dac
dIom ma fhoI. Nhu vay dau ra cua moI hang doI so Ia nhung cong vIoc co chung
dac dIom. VIoc su dung hang doI o day gIup fa phan IoaI duoc cong vIoc, dong fhoI
frong cac cong vIoc cung IoaI, chung van gIu nguyon fhu fu ban dau gIua chung.
Hnh anh do fhay nhaf chnh Ia v du fron voI moI hang nguoI doI so duoc mua vo
dI cung mof fuyon bay nao do |mof o cua chI ban cho mof fuyon bay nhaf djnh).
Mof v du khac vo su phan IoaI cac buu kIon faI mof frung fam chuyon phaf: cac
buu kIon so duoc phan IoaI vao cac hang doI dua vao fho fch, frong Iuong, noI
don,., ma fhu fu gIua chung frong mof hang doI Ia khong fhay doI.
15.3. Phuong phup sup thu tu Rudx Sort
!ng dung hang IIon kof frong phuong phap sap fhu fu RadIx Sorf duoc frnh
bay frong chuong 8.
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 378
15.4. TInh tr{ cho beu thuc prefix
o fnh frj cho bIou fhuc dang prefix nguoI fa dung hang doI. VIoc fnh duoc
fhuc hIon Iap IaI nhIou Ian, moI Ian Iuo n xu Iy cho bIou fhuc fu fraI sang phaI nhu
duoI day:
- + ` 9 + 2 8 ` + 4 8 6 3
- + * 9 10 * 12 6 3
- + 90 ?2 3
- 162 3
159
MoI Ian duyof bIou fhuc, chung fa fhay fho moI foan fu ma co du haI foan
hang dung ngay sau bang kof qua cua phop fnh cho foan fu do. o fhu fu duyof
qua bIou fhuc Iuon Ia fu fraI sang phaI, non chung fa co fho Iuu bIou fhuc vao
hang doI va su dung cac phuong fhuc cua hang doI do Iay fung phan fu cung nhu
dua fung phan fu vao hang. HIon fhuc chuong frnh duoc xom nhu baI fap cho
sInh vIon.
15.5. ng dung phep tInh tren du thuc
ay Ia mof ung dung co su dung CTI ngan xop va hang doI. Trong ung dung
nay chung fa co djp nhn fhay cong dung cua cac CTI da duoc fhIof ko hoan
chInh. Co nhIou baI foan co fho su dung cac CTI hoan chInh do phaf frIon fhom
cac Iop fhua ko raf fIon IoI. NgoaI ra, phuong phap phaf frIon dan fhanh mof
chuong frnh hoan chInh duoc frnh bay duoI day cung Ia mof fham khao raf fof
cho sInh vIon khI Iam quon voI cac ky nang fhIof ko va Iap frnh.
15.5.1. Muc dIch cuu ung dung
Trong phan 14.3 chung fa da vIof chuong frnh mo phong mof may fnh don
gIan fhuc hIon cac phop cong, fru, nhan, chIa va mof so phop fnh khac fuong fu.
Phan nay so mo phong mof may fnh fuong fu fhuc hIon cach fnh aIan nguoc
cho cac phop fnh fron da fhuc. Y fuong chnh cua gIaI fhuaf Ia su dung ngan xop
do Iuu cac foan hang. Con hang doI so duoc su dung do mo phong da fhuc.
15.5.2. Chuong trInh
Chung fa so hIon fhuc mof Iop da fhuc |Pol ynomi al ) do su dung frong chuong
frnh. VIoc hIon fhuc chuong frnh so fro non raf don gIan. Chuong frnh chnh
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 379
can khaI bao mof ngan xop do chua cac da fhuc, nhan cac you cau fnh va fhuc
hIon.
i nt main( )
/ *
post: Chuong frnh fhuc hIon cac phop fnh foan so hoc cho cac da fhuc do nguoI su dung nhap
vao.
uses: Cac Iop St ack, Pol ynomi al va cac ham i nt r oduct i on, i nst r uct i ons,
do_command, get _command.
*/
{
St ack<Pol ynomi al > stored_polynomials;
i nt r oduct i on( ) ;
i nst r uct i ons( ) ;
whi l e ( do_command( get_command( ) , stored_polynomials) ) ;
}
Chuong frnh nay hau nhu fuong fu voI chuong frnh chnh o phan 14.3, ham
phu fro get _command fuong fu ham da co.
15.5.2.1. Cuc phuong thuc cuu lop Polynomial
Tuong fu phan 14.3, fhay v nhap mof con so, dau 7 cho nguoI su dung nhap
vao mof da fhuc.
Phan Ion cac vIoc can Iam frong chuong frnh nay Ia vIoc hIon fhuc cac
phuong fhuc cua Pol ynomi al . Chang han chung fa can phuong fhuc equal s_sum
do cong haI da fhuc. Cho p, q, r Ia cac doI fuong da fhuc, p. equal s_sum( q, r ) so
fhay p boI da fhuc fong cua haI da fhuc q va r. Tuong fu chung fa co cac phuong
fhuc equal s_di f f er ence, equal s_pr oduct , va equal s_quot i ent do fhuc
hIon cac phop fnh so hoc khac fron da fhuc.
NgoaI ra, Iop Pol ynomi al con haI phuong fhuc khong fhong so Ia pr i nt va
r ead do xuaf va doc da fhuc.
15.5.2.2. Thuc hen cuc yeu cuu
Ham do_command nhan doI fuong ngan xop Ia fham bIon do ngan xop can
duoc bIon doI frong ham.
bool do_command( char command, Stack<Pol ynomi al > &st or ed_pol ynomi al s)
/ *
pre: command chua ky fu hop Io bIou dIon you cau cua nguoI su dung.
post: You cau cua nguoI su dung duoc fhuc hIon doI voI cac da fhuc frong ngan xop, ham fra vo
t r ue ngoaI fru fruong hop command=' q' fh ham fra vo f al se.
uses: Cac Iop St ack va Pol ynomi al .
*/
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 380
{
Pol ynomi al p, q, r ;
swi t ch ( command) {
case ' ?' :
p. r ead( ) ;
i f ( st or ed_pol ynomi al s. push( p) == over f l ow)
cout << " War ni ng: St ack f ul l , l ost pol ynomi al " << endl ;
br eak;
case ' =' :
i f ( st or ed_pol ynomi al s. empt y( ) )
cout << " St ack empt y" << endl ;
el se {
st or ed_pol ynomi al s. t op( p) ;
p. pr i nt ( ) ;
}
br eak;
case ' +' :
i f ( st or ed_pol ynomi al s. empt y( ) )
cout << " St ack empt y" << endl ;
el se {
st or ed_pol ynomi al s. t op( p) ;
st or ed_pol ynomi al s. pop( ) ;
i f ( st or ed_pol ynomi al s. empt y( ) ) {
cout << " St ack has j ust one pol ynomi al " << endl ;
st or ed_pol ynomi al s. push( p) ;
}
el se {
st or ed_pol ynomi al s. t op( q) ;
st or ed_pol ynomi al s. pop( ) ;
r . equal s_sum( q, p) ;
i f ( st or ed_pol ynomi al s. push( r ) == over f l ow)
cout << " War ni ng: St ack f ul l , l ost pol ynomi al " << endl ;
}
}
br eak;
/ / Can bo sung cac dong Ionh do fhuc hIon cac phop fnh con IaI.
case ' q' :
cout << " Cal cul at i on f i ni shed. " << endl ;
r et ur n f al se;
}
r et ur n t r ue;
}
15.5.2.3. Cuc muu chuong trInh vu cong vec kem tru
Cach Iam sau day mInh hoa y fuong su dung cac mau fam frong chuong frnh
nhu da frnh bay frong phan 1.5.3 |cac ky nang Iap frnh).
HIon faI chung fa chI phaf frIon chuong frnh vua du do co fho djch, chInh sua
IoI, va kIom fra fnh dung dan cua nhung phan da vIof.
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 381
o djch fhu chuong frnh, chung fa can fao cac mau cho moI phan fu con fhIou
cua chuong frnh. Phan fu con fhIou o day Ia Iop Pol ynomi al . o chung fa con
chua quyof djnh so hIon fhuc cac doI fuong da fhuc nhu fho nao, chung fa hay
chay chuong frnh nhu mof may fnh aIan nguoc danh cho cac so fhuc. Thay vao
cho can khaI bao du IIou cho Iop Pol ynomi al , chung fa khaI bao so fhuc.
cl ass Polynomial {
publ i c:
voi d r ead( ) ;
voi d pr i nt ( ) ;
voi d equal s_sum( Pol ynomi al p, Pol ynomi al q) ;
voi d equal s_di f f er ence( Pol ynomi al p, Pol ynomi al q) ;
voi d equal s_pr oduct ( Pol ynomi al p, Pol ynomi al q) ;
Er r or Code equal s_quot i ent ( Pol ynomi al p, Pol ynomi al q) ;
pr i vat e:
double val ue; / / mau fam dung do fhu chuong frnh.
};
Phuong fhuc equal s_quot i ent can kIom fra phop chIa 0 non can fra vo
Er r or Code. Ham sau day Ia mof dIon hnh cho mau phuong fhuc dung do fhu
chuong frnh.
voi d Pol ynomi al : : equals_sum( Pol ynomi al p, Pol ynomi al q)
{
val ue = p. val ue + q. val ue; / / ChI vIof fam, sau so vIof IaI dung cho da fhuc.
}
VIoc fao ra mof bo khung chuong frnh faI fhoI dIom nay cho phop chung fa
kIom fra xom ngan xop va cac goI fIon ch |chua cac ham phu fro) da duoc kof noI
mof cach dung dan frong chuong frnh hay chua. Chuong frnh, cung cac mau fhu
cua no, phaI fhuc fhI mof cach chnh xac ca voI hIon fhuc ngan xop IIon fuc Ian
ngan xop IIon kof.
15.5.3. Cuu truc du leu cuu du thuc
Chung fa hay quay IaI nhIom vu chnh cua chung fa Ia chon Iua cach bIou dIon
da fhuc va vIof cac phuong fhuc xu Iy cho chung. Cac da fhuc co dang sau
3x
5
2x
3
+ x
2
+ 4
Thong fIn quan frong frong mof da fhuc Ia cac ho so va cac so mu cua x, con
ban fhan x chI Ia mof bIon. Chung fa xom da fhuc duoc fao fhanh fu cac so hang
|t er m), moI so hang chua mof ho so va mof so mu. Trong may fnh co fho xom da
fhuc Ia mof danh sach cac cap gom ho so va so mu. Chung fa dung st r uct do
khaI bao so hang
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 382
st r uct Term {
i nt degr ee;
doubl e coef f i ci ent ;
Ter m( i nt exponent = 0, doubl e scal ar = 0) ;
};
Ter m: : Term( i nt exponent , doubl e scal ar )
/ *
post: Ter mduoc khoI fao boI ho so va so mu nhan duoc, nou khong co fhong so fruyon vao fh
haI so nay duoc gan mac djnh Ia 0.
*/
{
degr ee = exponent ;
coef f i ci ent = scal ar ;
}
Chung fa chua Iuu fam vo fhu fu cua cac so hang frong da fhuc, fuy nhIon nou
cho phop cac so hang co mof fhu fu fuy y fh chung fa so gap kho khan frong vIoc
nhan ra cac da fhuc bang nhau cung nhu frong vIoc fnh foan fron cac da fhuc.
Chung fa chon phuong an buoc cac so hang frong mof da fhuc phaI co fhu fu gIam
dan fhoo so mu, dong fhoI cung khong cho phop haI so hang co cung so mu hoac
so hang co ho so bang khong. VoI su rang buoc nay, khI fhuc hIon mof phop fnh
so hoc nao do fron haI da fhuc, chung fa fhuong Ian Iuof xu Iy cho fung cap so
hang cua haI da fhuc fu fraI sang phaI. Cac so hang cua da fhuc kof qua cung
duoc ghI vao da fhuc fhoo fhu fu nay. Mof da fhuc duoc bIou dIon bang mof danh
sach cac Ter m. Nhu vay, cac phop fnh so hoc co fho xom da fhuc nhu Ia mof
Queue, hay chnh xac hon, nhu Ia Ext ended_queue, v chung fa fhuong xuyon
can don cac phuong fhuc cl ear va ser ve_and_r et r i eve.
Chung fa fhu hoI non dung hang IIon fuc hay hang IIon kof. Nou bIof fruoc bac
cua da fhuc va cac da fhuc f co ho so bang khong fh chung fa non dung hang
IIon fuc. Nguoc IaI, nou khong bIof fruoc bac, hoac da fhuc co raf f ho so khac
khong fh hang IIon kof fhch hop hon. Hnh 15.1 mInh hoa da fhuc hIon fhuc
bang hang IIon kof.
MoI phan fu frong hang chua mof so hang cua da fhuc va chI co nhung so hang co
ho so khac khong moI duoc Iuu vao hang. a fhuc bang 0 bIou dIon boI hang rong.
VoI cau fruc du IIou duoc chon cho da fhuc nhu fron chung fa xay dung Iop
Pol ynomi al Ia Iop dan xuaf fu Iop Ext ended_Queue, chung fa chI vIoc bo sung
cac phuong fhuc rIong cua da fhuc.
o hIon fhuc cu fho cho Iop dan xuaf Pol ynomi al , chung fa can daf cau hoI:
mof da fhuc co han Ia mof Ext ended_Queue hay khong7
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 383
Mof Ext ended_Queue cung cap cac phuong fhuc nhu ser ve chang han,
phuong fhuc nay khong nhaf fhIof va cung khong non Ia phuong fhuc cua
Pol ynomi al . So Ia mof dIou khong hay khI chung fa cho phop nguoI su dung goI
phuong fhuc ser ve do IoaI dI mof phan fu cua Pol ynomi al . a fhuc non Ia mof
doI fuong dong kn. V vay mof Pol ynomi al khong han Ia mof Ext ended_Queue.
Mac du raf co IoI khI su dung IaI cac fhuoc fnh va cac phuong fhuc fu
Ext ended_Queue cho Pol ynomi al , nhung chung fa khong fho su dung phop fhua
ko don gIan, v quan ho cua haI Iop nay khong phaI Ia quan ho is-a.
Quan ho is-a Ia dang fhua ko publ i c frong C++. Nou khaI bao fhua ko publ i c fh nguoI su
dung co fho xom mof da fhuc cung Ia mof hang doI. C++ cung cap mof dang fhua ko fhu haI, goI Ia
fhua ko rIong |private inheritance), day chnh Ia dIou chung fa mong muon. Su fhua ko rIong cho
phop Iop dan xuaf duoc hIon fhuc bang cach su dung IaI Iop co so, nhung nguoI su dung khong goI
duoc cac phuong fhuc cua Iop co so fhong qua doI fuong cua Iop dan xuaf. Quan ho nay con duoc
goI Ia quan ho is implemented of. Chung fa so djnh nghIa Iop Pol ynomi al fhua ko rIong fu Iop
Ext ended_Queue: cac fhuoc fnh va cac phuong fhuc cua Ext ended_Queue co fho duoc su dung
frong hIon fhuc cua Iop Pol ynomi al , nhung chung khong duoc nhn fhay boI nguoI su dung.
cl ass Polynomial: private Ext ended_queue<Ter m> { / / Thua ko rIong.
publ i c:
voi d r ead( ) ;
voi d pr i nt ( ) const ;
voi d equal s_sum( Pol ynomi al p, Pol ynomi al q) ;
voi d equal s_di f f er ence( Pol ynomi al p, Pol ynomi al q) ;
voi d equal s_pr oduct ( Pol ynomi al p, Pol ynomi al q) ;
Er r or _code equal s_quot i ent ( Pol ynomi al p, Pol ynomi al q) ;
i nt degr ee( ) const ;
pr i vat e:
voi d mult_term( Pol ynomi al p, Ter mt ) ;
};
HInh 15.1- Iou dIon da fhuc boI mof hang IIon kof cac so hang
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 384
jnh nghIa fron bo sung fhom cac phuong fhuc nhu degr ee fra vo bac cua da
fhuc va mul t _t er mdo nhan mof da fhuc voI mof t er m.
15.5.4. Ooc vu gh cuc du thuc
VIoc In da fhuc don gIan chI Ia duyof qua cac phan fu cua hang va In du IIou
frong moI phan fu. Phuong fhuc duoI day In da fhuc voI mof so xu Iy cho cac
fruong hop dac bIof nhu IoaI bo dau + |nou co) o dau da fhuc, khong In ho so hoac
so mu nou bang 1 va khong In x
0
.
voi d Pol ynomi al : : print( ) const
/ *
post: a fhuc duoc In ra cout .
*/
{
Node *pr i nt _node = f r ont ;
bool f i r st _t er m= t r ue;
whi l e ( pr i nt _node ! = NULL) {
Ter m&pr i nt _t er m= pr i nt _node- >ent r y;
i f ( f i r st _t er m) { / / Khong in dau + au a thc.
f i r st _t er m= f al se;
i f ( pr i nt _t er m. coef f i ci ent < 0) cout << " - " ;
}
el se i f ( pr i nt _t er m. coef f i ci ent < 0) cout << " - " ;
el se cout << " + " ;
doubl e r = ( pr i nt _t er m. coef f i ci ent >= 0)
? pr i nt _t er m. coef f i ci ent : - ( pr i nt _t er m. coef f i ci ent ) ;
i f ( r ! = 1) cout << r ;
i f ( pr i nt _t er m. degr ee > 1) cout << " X^" << pr i nt _t er m. degr ee;
i f ( pr i nt _t er m. degr ee == 1) cout << " X" ;
i f ( r == 1 && pr i nt _t er m. degr ee == 0) cout << " 1" ;
pr i nt _node = pr i nt _node- >next ;
}
i f ( f i r st _t er m)
cout << " 0" ; / / Pr i nt 0 f or an empt y Pol ynomi al .
cout << endl ;
}
Phuong fhuc doc da fhuc fhuc hIon vIo c kIom fra do cac so hang nhap vao fhoa
dIou kIon so mu gIam dan va mof so ra ng buoc frong vIoc bIou dIon da fhuc nhu
da nou fron. VIoc nhap kof fhuc khI ho so va so mu dou nhan frj 0.
voi d Pol ynomi al : : read( )
/ *
post: a fhuc duoc doc fu ci n.
*/
{
cl ear ( ) ;
doubl e coef f i ci ent ;
i nt l ast _exponent , exponent ;
bool f i r st _t er m= t r ue;
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 385
cout << " Ent er t he coef f i ci ent s and exponent s f or t he pol ynomi al , "
<< " one pai r per l i ne. Exponent s must be i n descendi ng or der . "
<< endl
<< " Ent er a coef f i ci ent of 0 or an exponent of 0 t o t er mi nat e. " <<
endl ;
do {
cout << " coef f i ci ent ? " << f l ush;
ci n >> coef f i ci ent ;
i f ( coef f i ci ent ! = 0. 0) {
cout << " exponent ? " << f l ush;
ci n >> exponent ;
i f ( ( ! f i r st _t er m&& exponent >= l ast _exponent ) | | exponent < 0) {
exponent = 0;
cout << " Bad exponent : Pol ynomi al t er mi nat es wi t hout i t s l ast
t er m. "
<< endl ;
}
el se {
Ter mnew_t er m( exponent , coef f i ci ent ) ;
append( new_t er m) ;
f i r st _t er m= f al se;
}
l ast _exponent = exponent ;
}
} whi l e ( coef f i ci ent ! = 0. 0 && exponent ! = 0) ;
}
15.5.5. Phep cong du thuc
Phan nay chung fa chI hIon fhuc phop cong da fhuc, cac phop fnh khac xom
nhu baI fap.
o cac so hang frong ca haI da fhuc co so mu gIam dan non phop cong raf don
gIan. Chung fa chI can duyof qua mof Ian va dong fhoI doI voI ca haI da fhuc. Nou
gap haI so hang cua haI da fhuc co so mu bang nhau, chung fa cong haI ho so va
kof qua dua vao da fhuc fong, nguoc IaI, so hang cua da fhuc nao co so mu cao
hon duoc dua vao fong, phop duyof chI djch chuyon foI mof buoc fron da fhuc nay.
Chung fa chI phaI Iuu y don fruong hop fong haI ho so cua haI so hang bang 0 fh
so khong co phan fu moI duoc dua vao da fhuc fong. NgoaI ra, v phuong fhuc nay
so pha huy cac da fhuc foan hang duoc dua vao non chung duoc goI bang fham frj.
voi d Pol ynomi al : : equals_sum( Pol ynomi al p, Pol ynomi al q)
/ *
post: oI fuong da fhuc so co frj bang fong haI da fhuc nhan vao fu fhong so.
*/
{
clear( ) ;
whi l e ( ! p. empt y( ) | | ! q. empt y( ) ) {
Ter mp_t er m, q_t er m;
i f ( p. degr ee( ) > q. degr ee( ) ) {
p. ser ve_and_r et r i eve( p_t er m) ;
append(p_term);
}
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 386
el se i f ( q. degr ee( ) > p. degr ee( ) ) {
q. ser ve_and_r et r i eve( q_t er m) ;
append(q_term);
}
el se {
p. ser ve_and_r et r i eve( p_t er m) ;
q. ser ve_and_r et r i eve( q_t er m) ;
i f ( p_t er m. coef f i ci ent + q_t er m. coef f i ci ent ! = 0) {
Ter manswer _t er m( p_t er m. degr ee,
p_t er m. coef f i ci ent + q_t er m. coef f i ci ent ) ;
append(answer_term);
}
}
}
}
Phuong fhuc fron baf dau bang vIoc don dop moI so hang frong da fhuc so
chua kof qua cua phop cong. Phuong fhuc degr ee duoc goI do fra vo bac cua da
fhuc, nou da fhuc rong, degr ee so fra vo -1.
15.5.6. Houn tut chuong trInh
15.5.6.1. Cuc phuong thuc con theu
Phop fru haI da fhuc hoan foan fuong fu phop cong. oI voI phop nhan, fruoc
hof chung fa phaI vIof ham nhan mof da fhuc voI mof so hang, sau do kof hop voI
phuong fhuc cong haI da fhuc do hoan faf phop nhan. Phop chIa da fhuc phuc fap
hon raf nhIou, phop chIa da fhuc cho mof kof qua Ia da fhuc fhuong va mof Ia da
fhuc so du.
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 387
Chng 16 NG ONG X LY VAN BAN
Phan nay mInh hoa mof ung dung co su dung ca Iop Li st va St r i ng. o Ia
mof chuong frnh xu Iy van ban, fuy chI co mof vaI Ionh don gIan, nhung no cung
mInh hoa duoc nhung y fuong co ban do xay dung nhung chuong frnh xu Iy van
ban Ion va fInh fo hon.
16.1. Cuc duc tu
Chuong frnh xu Iy van ban cua chung fa cho phop doc mof fap fIn fu dIa vao
bo nho ma chung fa goI Ia vung dom |buffer). Vung dom nay duoc hIon fhuc nhu
mof doI fuong cua Iop Editor. MoI dong van ban frong doI fuong Edi t or Ia mof
St r i ng. o do Iop Edi t or so duoc fhua ko fu Iop Li st cac St r i ng. Cac Ionh xu
Iy van ban duoc chIa Iam haI nhom: nhom cac fac vu cua Li st so xu Iy cho cac
dong van ban, va nhom cac fac vu cua St r i ng so xu Iy cho cac ky fu frong moI
dong van ban.
TaI moI fhoI dIom, nguoI su dung co fho nhap hoac cac ky fu do chon vao van
ban, hoac cac Ionh xu Iy cho phan van ban da co. Chuong frnh xu Iy van ban can
bIof bo qua nhung ky fu nhap khong hop Io, nhan bIof cac Ionh, hoac hoI IaI
nguoI su dung fruoc khI fhuc hIon cac Ionh quan frong |chang han nhu xoa foan
bo vung dom).
Chuong frnh xu Iy van ban co cac Ionh duoI day. MoI Ionh so duoc nguoI su
dung nhap vao khI co dau nhac 77 va co fho nhap chu hoa hoac chu fhuong.
R |Read) oc fap fIn van ban vao vung dom. Ton fap fIn van ban da duoc chI
ra khI chay chuong frnh. NoI dung co san frong vung dom duoc xoa sach.
ong dau fIon cua van ban duoc xom Ia dong hIon faI.
W|Write) ChI noI dung frong vung dom vao fap fIn van ban co fon da duoc
chI ra khI chay chuong frnh. Vung dom cung nhu dong hIon faI dou khong
doI.
I |Insert) Thom mof dong moI. NguoI su dung co fho nhap so fhu fu cua dong
moI so duoc fhom vao.
|Delete) Xoa dong hIon faI va chuyon don dong ko.
I |Find) af dau fu dong hIon faI, fm dong dau fIon co chua chuoI ky fu do
nguoI su dung you cau.
I |Length) Cho bIof so ky fu co frong dong hIon faI va so dong co frong vung
dom.
C |Change) oI mof chuoI ky fu sang mof chuoI ky fu khac. ChI doI frong
dong hIon faI.
Q |Quit) Thoaf khoI chuong frnh.
H |Help) In gIaI fhch vo cac Ionh. Co fho dung 7 fhay cho H.
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 388
N |Next) Chuyon sang dong ko frong vung dom.
P |Previous) Tro vo dong fruoc frong vung dom.
|Beginning) Chuyon don dong dau fIon frong vung dom.
|End) Chuyon don dong cuoI frong vung dom.
C |Go) Chuyon don dong co so fhu fu do nguoI su dung you cau.
S |Subtitute) Thay dong hIon faI boI dong do nguoI su dung nhap vao. Chuong
frnh so In dong so bj fhay fho do kIom fra IaI va hoI nguoI su dung nhap
dong moI.
V |View) Xom foan bo noI dung frong vung dom.
16.2. Hen thuc
16.2.1. Chuong trInh chInh
NhIom vu dau fIon cua chuong frnh chnh Ia su dung cac fhong so nhap vao fu
dong Ionh do mo fap fIn doc va fap fIn ghI. Cach su dung chuong frnh:
edi t i nf i l e out f i l e
frong do i nf i l e va out f i l e Ia fon fap fIn doc va fon fap fIn ghI fuong ung. KhI
cac fap fIn da mo fhanh cong, chuong frnh khaI bao mof doI fuong Edi t or goI Ia
buf f er , Iap IaI vIoc chay phuong fhuc get _command cua Edi t or do doc cac Ionh
roI xu Iy cac Ionh nay.
i nt main( i nt ar gc, char *ar gv[ ] ) / / count , val ues of command- l i ne ar gument s
/ *
pre: Thong so cua dong Ionh Ia fon fap fIn doc va fap fIn ghI.
post: Chuong frnh doc noI dung fu fap fIn doc, cho phop soan fhao, chInh sua van ban, va ghI
vao fap fIn ghI.
uses: Cac phuong fhuc cua Iop Edi t or .
*/
{
i f ( ar gc ! = 3) {
cout << " Usage: \ n\ t edi t i nput f i l e out put f i l e" << endl ;
exi t ( 1) ;
}
i f st r eamf i l e_i n( ar gv[ 1] ) ; / / KhaI bao va mo fap fIn doc.
i f ( f i l e_i n == 0) {
cout << " Can' t open i nput f i l e " << ar gv[ 1] << endl ;
exi t ( 1) ;
}
of st r eamf i l e_out ( ar gv[ 2] ) ; / / KhaI bao va mo fap fIn ghI.
i f ( f i l e_out == 0) {
cout << " Can' t open out put f i l e " << ar gv[ 2] << endl ;
exi t ( 1) ;
}
Edi t or buf f er ( &f i l e_i n, &f i l e_out ) ;
whi l e ( buf f er . get_command( ) )
buf f er . run_command( ) ;
}
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 389
16.2.2. Ouc tu lop Editor
Iop Edi t or can chua mof Li st cac doI fuong St r i ng, va cho phop cac fac vu
dI chuyon fhoo ca haI huong cua Li st mof cach hIou qua. Chung fa cung khong
bIof fruoc vung dom so phaI Ion bao nhIou, do do chung fa so khaI bao Iop
Edi t or dan xuaf fu hIon fhuc danh sach IIon kof kop |doubly linked list). Iop
dan xuaf nay can bo sung fhom haI phuong fhuc get _command va r un_command
ma chuong frnh chnh so goI. NgoaI ra Iop Edi t or con can fhom fhuoc fnh do
chua Ionh fu nguoI su dung |user _command) va cac fham chIou don dong nhap va
xuaf |i nf i l e va out f i l e).
cl ass Editor: publ i c Li st <St r i ng> {
publ i c:
Edi t or ( i f st r eam*f i l e_i n, of st r eam*f i l e_out ) ;
bool get _command( ) ;
voi d r un_command( ) ;
pr i vat e:
i f st r eam*infile;
of st r eam*outfile;
char user_command;
/ / Cac ham phu fro
Er r or _code next _l i ne( ) ;
Er r or _code pr evi ous_l i ne( ) ;
Er r or _code got o_l i ne( ) ;
Er r or _code i nser t _l i ne( ) ;
Er r or _code subst i t ut e_l i ne( ) ;
Er r or _code change_l i ne( ) ;
voi d r ead_f i l e( ) ;
voi d wr i t e_f i l e( ) ;
voi d f i nd_st r i ng( ) ;
};
Trong dac fa fron chung fa con fhay mof so ham phu fro do hIon fhuc cac Ionh
xu Iy van ban khac nhau.
Constructor fhuc hIon noI dong nhap va dong xuaf voI doI fuong cua Iop
Edi t or .
Edi t or : : Editor( i f st r eam*f i l e_i n, of st r eam*f i l e_out )
/ *
post: KhoI fao doI fuong Edi t or voI frj cho haI fhuoc fnh i nf i l e, out f i l e.
*/
{
i nf i l e = f i l e_i n;
out f i l e = f i l e_out ;
}
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 390
16.2.3. Nhun lenh tu nguo su dung
o chuong frnh xu Iy van ban phaI bIof bo qua nhung ky fu nhap khong hop
Io, non cac Ionh nhap vao phaI duoc kIom fra ky Iuong. Chuong frnh dung ham
t ol ower chuyon ky fu hoa fhanh ky fu fhuong co frong fhu vIon <cct ype>, cho
phop nguoI su dung co fho nhap chu hoa hoac chu fhuong. Get _command so In
dong hIon faI, hIon dau nhac cho Ionh, doI Ionh sang ky fu fhuong.
bool Edi t or : : get_command( )
/ *
post: Can frj cho fhuoc fnh user _command; fra vo t r ue fru khI nguoI su dung go q
uses: Ham t ol ower cua fhu vIon C..
*/
{
i f ( cur r ent ! = NULL)
cout << cur r ent _posi t i on << " : "
<< cur r ent - >ent r y. c_st r ( ) << " \ n??" << f l ush;
el se
cout << " Fi l e i s empt y. \ n??" << f l ush;
ci n >> user _command; / / o qua cac khoang frang va nhan Ionh cua nguoI su dung
user _command = t ol ower ( user _command) ;
whi l e ( ci n. get ( ) ! = ' \ n' ) ; / / o qua phm ent er
i f ( user _command == ' q' )
r et ur n f al se;
el se
r et ur n t r ue;
}
16.2.4. Thuc hen lenh
Phuong fhuc r un_command chua Ionh swi t ch do chon cac ham khac nhau
fuong ung voI cac Ionh can fhuc hIon. Mof vaI Ionh frong so nay |fua nhu r emove)
Ia cac phuong fhuc cua Li st . Nhung Ionh khac dua fron cac fac vu xu Iy cua Li st
nhung co bo sung xu Iy nhung you cau cua nguoI su dung.
voi d Edi t or : : run_command( )
/ *
post: Ionh frong user _command duoc fhuc hIon.
uses: Cac phuong fhuc va cac ham phu fro cua cac Iop Edi t or ,
St r i ng, va cac ham xu Iy chuoI ky fu.
*/
{
St r i ng t emp_st r i ng;
switch ( user _command) {
case ' b' :
i f ( empt y( ) )
cout << " War ni ng: empt y buf f er " << endl ;
el se
whi l e ( previous_line( ) == success) ;
br eak;
case ' c' :
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 391
i f ( empt y( ) )
cout << " War ni ng: Empt y f i l e" << endl ;
el se i f ( change_line( ) ! = success)
cout << " Er r or : Subst i t ut i on f ai l ed " << endl ;
br eak;
case ' d' :
i f ( remove( cur r ent _posi t i on, t emp_st r i ng) ! = success)
cout << " Er r or : Del et i on f ai l ed " << endl ;
br eak;
case ' e' :
i f ( empt y( ) )
cout << " War ni ng: empt y buf f er " << endl ;
el se
whi l e ( next_line( ) == success)
;
br eak;
case ' f' :
i f ( empt y( ) )
cout << " War ni ng: Empt y f i l e" << endl ;
el se
find_string( ) ;
br eak;
case ' g' :
i f ( goto_line( ) ! = success)
cout << " War ni ng: No such l i ne" << endl ;
br eak;
case ' ?' :
case ' h' :
cout << " Val i d commands ar e: b( egi n) c( hange) d( el ) e( nd) "
<< endl
<< " f ( i nd) g( o) h( el p) i ( nser t ) l ( engt h) n( ext ) p( r i or ) "
<< endl
<< " q( ui t ) r ( ead) s( ubst i t ut e) v( i ew) w( r i t e) " << endl ;
case ' i' :
i f ( insert_line( ) ! = success)
cout << " Er r or : I nser t i on f ai l ed " << endl ;
br eak;
case ' l' :
cout << " Ther e ar e " << si ze( ) << " l i nes i n t he f i l e. " << endl ;
i f ( ! empt y( ) )
cout << " Cur r ent l i ne l engt h i s "
<< st r l en( ( cur r ent - >ent r y) . c_st r ( ) ) << endl ;
br eak;
case ' n' :
i f ( next_line( ) ! = success)
cout << " War ni ng: at end of buf f er " << endl ;
br eak;
case ' p' :
i f ( previous_line( ) ! = success)
cout << " War ni ng: at st ar t of buf f er " << endl ;
br eak;
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 392
case ' r' :
read_file( ) ;
br eak;
case ' s' :
i f ( substitute_line( ) ! = success)
cout << " Er r or : Subst i t ut i on f ai l ed " << endl ;
br eak;
case ' v' :
traverse( wr i t e) ;
br eak;
case ' w' :
i f ( empt y( ) )
cout << " War ni ng: Empt y f i l e" << endl ;
el se
write_file( ) ;
br eak;
default :
cout << " Pr ess h or ? f or hel p or ent er a val i d command: " ;
}
}
16.2.5. Ooc vu gh tup tn
Tap fIn so duoc doc va ghI do Ion vu ng dom. Nou vung dom khong rong, can co
fhong bao hoI IaI nguoI su dung fruoc khI fhuc hIon Ionh.
voi d Edi t or : : read_file( )
/ *
pre: Nou Edi t or khong rong fh nguoI su dung so fra IoI co chop do noI dung moI Ion hay
khong.
post: oc fap fIn doc vao Edi t or . NoI dung cu nou co frong Edi t or so bj chop do.
uses: Cac phuong fhuc va cac ham cua St r i ng va Edi t or .
*/
{
bool pr oceed = t r ue;
i f ( ! empt y( ) ) {
cout << " Buf f er i s not empt y; t he r ead wi l l dest r oy i t . " << endl ;
cout << " OK t o pr oceed? " << endl ;
i f ( pr oceed = user _says_yes( ) ) cl ear ( ) ;
}
i nt l i ne_number = 0, t er mi nal _char ;
whi l e ( pr oceed) {
St r i ng i n_st r i ng = read_in( *i nf i l e, t er mi nal _char ) ;
i f ( t er mi nal _char == EOF) {
pr oceed = f al se;
i f ( st r l en( i n_st r i ng. c_st r ( ) ) > 0)
insert( l i ne_number , i n_st r i ng) ;
}
el se insert( l i ne_number ++, i n_st r i ng) ;
}
}
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 393
16.2.6. Chen mot hung
o chon mof dong moI, fruoc hof chung fa doc mof chuoI ky fu nho phuong
fhuc r ead_i n cua Iop St r i ng frong phan 5.3. Sau do chuoI ky fu duoc chon vao
Li st nho phuong fhuc Insorf cua Li st . Chung fa khong can kIom fra vung dom
da day hay chua do cac fac vu cua Li st da chju frach nhIom vo vIoc nay.
Er r or _code Edi t or : : insert_line( )
/ *
post: Mo dong do nguoI su dung go vao so duoc chon vao vj fr fhoo you cau.
uses: Cac phuong fhuc va cac ham cua St r i ng va Edi t or .
*/
{
i nt l i ne_number ;
cout << " I nser t what l i ne number ? " << f l ush;
ci n >> l i ne_number ;
whi l e ( ci n. get ( ) ! = ' \ n' ) ;
cout << " What i s t he new l i ne t o i nser t ? " << f l ush;
St r i ng t o_i nser t = read_in( ci n) ;
r et ur n insert( l i ne_number , t o_i nser t ) ;
}
16.2.7. TIm mot chuo ky tu
ay Ia mof cong vIoc fuong doI kho. VIoc fm mof chuoI ky fu do nguoI su dung
you cau duoc fhuc hIon fron foan vung dom. Ham st r st r cua St r i ng so fm
chuoI ky fu duoc you cau frong dong hIon faI fruoc, nou khong co so fm fIop o cac
dong ko fIop frong vung dom. Nou fm fhay, dong co chuoI ky fu can fm so duoc
hIon fhj va fro fhanh dong hIon faI, dau ^ so chI ra vj fr chuoI ky fu duoc fm
fhay.
voi d Edi t or : : find_string( )
/ *
pre: Edi t or dang chua van ban.
post: ChuoI ky fu duoc you cau so duoc fm fu dong hIon faI fro dI. Nou fm fhay fh hIon dong
chua chuoI ky fu do, dong fhoI chI ra chuoI ky fu.
uses: Cac phuong fhuc va cac ham cua St r i ng va Edi t or .
*/
{
i nt i ndex;
cout << " Ent er st r i ng t o sear ch f or : " << endl ;
St r i ng sear ch_st r i ng = read_in( ci n) ;
whi l e ( ( i ndex = strstr( cur r ent - >ent r y, sear ch_st r i ng) ) == - 1)
i f ( next_line( ) ! = success) br eak;
i f ( i ndex == - 1) cout << " St r i ng was not f ound. " ;
el se {
cout << ( cur r ent - >ent r y) . c_st r ( ) << endl ;
f or ( i nt i = 0; i < i ndex; i ++)
cout << " " ;
f or ( i nt j = 0; j < st r l en( sear ch_st r i ng. c_st r ( ) ) ; j ++)
cout << " ^" ;
}
cout << endl ;
}
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 394
16.2.8. Ben do chuo ky tu
Ham change_l i ne nhan mof chuoI ky fu can fhay fho fu nguoI su dung. KhI
chuoI ky fu nay duoc fm fhay frong dong hIon faI, nguoI su dung so duoc you cau
nhap chuoI ky fu do fhay fho. CuoI cung Ia mof Ioaf cac fac vu cua St r i ng va C-
St r i ng duoc fhuc hIon do IoaI chuoI ky fu cu va fho chuoI ky fu moI vao.
Er r or _code Edi t or : : change_line( )
/ *
pre: Edi t or dang chua van ban.
post: Nou chuoI ky fu duoc you cau duoc fm fhay frong dong hIon faI fh so duoc fhay fho boI
chuoI ky fu khac |cung do nguoI su dung go vao), ra vo success; nguoc IaI fra vo f ai l .
uses: Cac phuong fhuc va cac ham cua St r i ng va Edi t or .
*/
{
Er r or _code r esul t = success;
cout << " What t ext segment do you want t o r epl ace? " << f l ush;
St r i ng ol d_t ext = read_in( ci n) ;
cout << " What new t ext segment do you want t o add i n? " << f l ush;
St r i ng new_t ext = read_in( ci n) ;
i nt i ndex = st r st r ( cur r ent - >ent r y, ol d_t ext ) ;
i f ( i ndex == - 1) r esul t = f ai l ;
el se {
St r i ng new_l i ne;
st r ncpy( new_l i ne, cur r ent - >ent r y, i ndex) ;
st r cat ( new_l i ne, new_t ext ) ;
const char *ol d_l i ne = ( cur r ent - >ent r y) . c_st r ( ) ;
st r cat ( new_l i ne, ( St r i ng) ( ol d_l i ne + i ndex + +
st r l en( ol d_t ext . c_st r ( ) ) ) ) ;
cur r ent - >ent r y = new_l i ne;
}
r et ur n r esul t ;
}
Ionh st r cat ( new_l i ne,
( St r i ng) ( old_line+index+strlen(old_text.c_str())) )
fm con fro fam chI vj fr baf dau phan con IaI ngay sau chuoI ky fu duoc fhay fho
frong dong cu, con fro nay so duoc chuyon doI fhanh doI fuong St r i ng va noI voI
new_l i ne.
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 395
Chng 17 NG ONG SNH CAC HOAN V|
!ng dung nay mInh hoa su su dung ca haI IoaI danh sach: danh sach fong
quaf va SIK frong mang IIon fuc. !ng dung nay so sInh ra n! cach hoan vj cua
n doI fuong mof cach hIou qua nhaf. Chung fa goI cac hoan vj cua n doI fuong
khac nhau Ia faf ca cac phuong an fhIof Iap chung fhoo moI fhu fu co fho co.
Chung fa co fho chon baf ky doI fuong nao frong n doI fuong daf faI vj fr dau
fIon, sau do co fho chon baf ky frong n-1 doI fuong con IaI daf faI vj fr fhu haI,
va cu fho fIop fuc. Cac chon Iua nay doc Iap nhau non fong so cach chon Iua Ia:
n x ( n- 1) x ( n- 2) x . . . x 2 x 1 = n!
17.1. Y tuong
Chung fa xac djnh cac hoan vj qua cac nuf fron cay. au fIon chI co 1 o goc
cay. Chung fa co haI hoan vj cua {1, 2l bang cach ghI 2 bon fraI, sau do bon phaI
cua 1. Tuong fu, sau hoan vj cua {1, 2, 3l co duoc fu |2, 1) va |1, 2) bang cach
fhom 3 vao ca ba vj fr co fho |fraI, gIua, phaI). Nhu vay cac hoan vj cua {1, 2, ...,
kl co duoc nhu sau:
oi vi moi hoan v cua {1, 2, ..., k-1} chung ta a cac phan t vao mot list.
Sau o chen k vao moi v tr co the trong list o e co c k hoan v khac nhau
cua {1, 2, ..., k}.
CIaI fhuaf nay mInh hoa vIoc su dung do quy do hoan fhanh cac cong vIoc da
fam hoan. Chung fa so vIof mof ham, dau fIon Ia fhom 1 vao mof danh sach rong,
HInh 1?.1- SInh cac hoan vj cho {1, 2, 3, 4l
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 396
sau do goI do quy do fhom Ian Iuof cac so khac fu 2 don n vao danh sach. Ian goI
do quy dau fIon so fhom 2 vao danh sach chI chua co 1, gIa su fhom 2 bon fraI
cua 1, va fr hoan cac kha nang fhom khac |nhu Ia fhom 2 bon phaI cua 1), do
goI do quy fIop. CuoI cung, Ian goI do quy fhu n so fhom n vao danh sach. ang
cach nay, baf dau fu mof cau fruc cay, chung fa phaf frIon mof gIaI fhuaf frong do
cay nay fro fhanh mof cay do quy.
17.2. Tnh che
Chung fa so phaf frIon gIaI fhuaf fron cu fho hon. Ham fhom cac so fu 1 don n
do sInh n! hoan vj so duoc goI nhu sau:
permute(1, n)
CIa su da co k-1 so da duoc fhom vao danh sach, ham sau so fhom cac so con
IaI fu k don n vao danh sach:
voi d permute( i nt k, i nt n)
/ *
pre: Tu 1 don k - 1 da co frong danh sach cac hoan vj;
post: Chon cac so nguyon fu k don n vao danh sach cac hoan vj.
*/
{
f or / / voI moI vj fr frong k vj fr co fho frong danh sach.
{
/ / Chon k vao vj fr nay.
i f ( k == n) process_permutation;
el se permute( k + 1, n) ;
/ / Iay k ra khoI vj fr vua chon.
}
}
KhI co duoc mof hoan vj day du cua {1, 2, . . . , n}, chung fa co fho In kof
qua, hoac goI kof qua nhu Ia fhong so vao cho mof baI foan nao khac, do Ia nhIom
vu cua ham pr ocess_per mut at i on.
17.3. Thu tuc chung
o chuyon gIaI fhuaf fhanh chuong frnh C++, chung fa co cac fon bIon nhu
sau: danh sach cac so nguyon permutation chua hoan vj cua cac so; new_entry,
fhay cho k, Ia so nguyon so duoc fhom vao; va degree, fhay cho n, Ia so cac
phan fu can hoan vj.
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 397
voi d permute( i nt new_entry, i nt degree, Li st <i nt > &permutation)
/ *
pre: per mut at i on chua 1 hoan vj voI cac phan fu fu 1 don new_ent r y - 1.
post: MoI hoan vj cua degr ee phan fu duoc fao non fu hoan vj da co va so duoc xu Iy frong ham
pr ocess_per mut at i on.
uses: ham per mut e mof cach do quy, ham pr ocess_per mut at i on, va cac ham cua Li st .
*/
{
f or ( i nt current = 0; cur r ent < per mut at i on. si ze( ) + 1; current++) {
per mut at i on. insert( current, new_ent r y) ;
i f ( new_ent r y == degr ee)
pr ocess_per mut at i on( per mut at i on) ;
el se
permute( new_ent r y + 1, degr ee, per mut at i on) ;
per mut at i on. remove( current, new_ent r y) ;
}
}
Ham fron day co fho su dung voI baf ky hIon fhuc nao cua danh sach ma
chung fa da Iam quon |SIK su dung con fro, danh sach IIon fuc, SIK frong
mang IIon fuc). VIoc xay dung ung dung day du do sInh cac hoan vj xom nhu baI
fap. Tuy nhIon chung fa so fhay rang uu dIom cua SIK frong mang IIon fuc raf
fhch hop doI voI baI foan nay frong phan fIop fhoo duoI day.o3
17.4. To uu hou cuu truc du leu de tung toc do cho chuong trInh
snh cuc houn v{
n! fang raf nhanh khI n fang. o do so hoan vj co duoc so raf Ion. !ng dung
fron Ia mof frong cac ung dung ma su foI uu hoa do fang foc do chuong frnh raf
dang do fra gIa, ngay ca khI anh huong don fnh do doc cua chuong frnh. Chung
fa so dung SIK frong mang IIon fuc co kom mof chuf caI fIon cho baI foan fron.
Chung fa hay xom xof mof vaI cach fo chuc du IIou fhoo huong Iam fang foc do
chuong frnh cang nhanh cang fof. Chung fa su dung mof danh sach do chua cac
so can hoan vj. MoI Ian goI do quy dou phaI cap nhaf cac phan fu frong danh
sach. o chung fa phaI fhuong xuyon fhom va IoaI phan fu cua danh sach, SIK
fo ra fhch hop hon danh sach IIon fuc. Maf khac, do fong so phan fu frong danh
sach khong bao gIo vuof qua n, chung fa non su dung SIK frong mang IIon fuc
fhay v SIK frong bo nho dong.
Hnh 17.2 mInh hoa cach fo chuc cau fruc du IIou. Hnh fron cung Ia SIK
cho hoan vj |3, 2, 1, 4). Hnh bon duoI bIou dIon hoan vj nay frong SIK frong
mang IIon fuc. ac bIof frong hnh nay, chung fa nhan fhay, frj cua phan fu duoc
fhom vao cung chnh bang chI so cua pha n fu frong array, non vIoc Iuu cac frj nay
khong can fhIof nua. |Chung fa chu y rang, frong gIaI fhuaf do quy, cac so duoc
fhom vao danh sach fhoo fhu fu fang dan, non moI phan fu so chIom vj fr frong
mang dung bang frj cua no; cac hoan vj khac nhau cua cac pha n fu nay duoc phan
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 398
bIof boI fhu fu cua chung frong danh sach, do chnh Ia su khac nhau vo cach noI
cac fham chIou). CuoI cung chI con cac fham chIou Ia can Iuu frong mang |hnh
duoI cung frong hnh 17.2). Node 0 dung do chua dau vao cua SIK frong mang
IIon fuc. Trong chuong frnh duoI day chung fa vIof IaI cac cong vIoc fhom va IoaI
phan fu frong danh sach fhay v goI cac phuong fhuc cua danh sach do fang hIou
qua foI da.
17.5. Chuong trInh
Chung fa co ham per mut e da duoc caI fIon:
voi d permute( i nt new_ent r y, i nt degr ee, i nt *per mut at i on)
/ *
pre: per mut at i on chua 1 hoan vj voI cac phan fu fu 1 don new_ent r y - 1.
post: MoI hoan vj cua degr ee phan fu duoc fao non fu hoan vj da co va so duoc xu Iy frong ham
pr ocess_per mut at i on.
uses: ham per mut e mof cach do quy, ham pr ocess_per mut at i on.
*/
{
i nt cur r ent = 0;
do {
per mut at i on[ new_ent r y] = per mut at i on[ cur r ent ] ;
per mut at i on[ cur r ent ] = new_ent r y;
HInh 1?.2 Cau fruc du IIou chua hoan vj
( ent r y)
( next )
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 399
i f ( new_ent r y == degr ee)
pr ocess_per mut at i on( per mut at i on) ;
el se
permute( new_ent r y + 1, degr ee, per mut at i on) ;
per mut at i on[ cur r ent ] = per mut at i on[ new_ent r y] ;
cur r ent = per mut at i on[ cur r ent ] ;
} whi l e ( cur r ent ! = 0) ;
}
Chuong frnh chnh fhuc hIon cac khaI bao va khoI fao:
main( )
/ *
pre: NguoI su dung nhap vao degr ee Ia so phan fu can hoan vj.
post: MoI hoan vj cua degr ee phan fu duoc In ra.
*/
{
i nt degr ee;
i nt per mut at i on[ max_degr ee + 1] ;
cout << " Number of el ement s t o per mut e? " ;
ci n >> degr ee;
i f ( degr ee < 1 | | degr ee > max_degr ee)
cout << " Number must be bet ween 1 and " << max_degr ee << endl ;
el se {
per mut at i on[ 0] = 0;
permute( 1, degr ee, per mut at i on) ;
}
}
anh sach permutation Iam fhong so cho ham process_permutation chua
cach noI kof cac phan fu frong mof hoan vj, chung fa co fho In cac so nguyon cua
mof cach hoan vj nhu sau:
voi d process_permutation( i nt *per mut at i on)
/ *
pre: per mut at i on frong cau fruc IIon kof boI cac chI so.
post: per mut at i on duoc In ra.
*/
{
i nt cur r ent = 0;
whi l e ( per mut at i on[ cur r ent ] ! = 0) {
cout << per mut at i on[ cur r ent ] << " " ;
cur r ent = per mut at i on[ cur r ent ] ;
}
cout << endl ;
}
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 400
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 401
Chng 18 NG ONG OANH SACH LKN KKT VA
BANG BAM
ay Ia mof ung dung co su dung CTI danh sach va bang bam. Thong qua
ung dung nay sInh vIon co djp nang cao ky nang fhIof ko huong doI fuong, gIaI
quyof baI foan fu ngoaI vao frong. NgoaI ra, day cung Ia mof v du raf hay vo vIoc
su dung mof CTI dung dan khong nhung dap ung duoc you cau baI foan ma con
Iam fang hIou qua cua chuong frnh Ion raf nhIou.
18.1. Go theu ve chuong trInh Game_Of_Life
Game_Of _Li f e Ia mof chuong frnh gIa Iap mof su fIon frIon cua su song,
khong phaI Ia mof fro choI voI nguoI su dung. Tron mof IuoI chu nhaf khong co
gIoI han, moI o hoac Ia o frong hoac dang co mof fo bao chIom gIu. O co fo bao
duoc goI Ia o song, nguoc IaI Ia o chof. MoI fhoI dIom on djnh cua foan bo IuoI
chung fa goI Ia mof frang fhaI. o chuyon sang frang fhaI moI, mof o so fhay doI
fnh frang song hay chof fuy fhuoc vao so o song chung quanh no frong frang fhaI
cu fhoo cac quy fac sau:
1. Mof o co fam o ko can.
2. Mof o dang song ma khong co hoac chI co 1 o ko can song fh o do so chof do
don doc.
3. Mof o dang song ma co fu 4 o ko can fro Ion song fh o do cung so chof do
qua dong.
4. Mof o dang song ma co 2 hoac 3 o ko can song fh no so song fIop frong
frang fhaI sau.
5. Mof o dang chof fro fhanh song frong frang fhaI sau nou no co chnh xac 3 o
ko can song.
6. Su chuyon frang fhaI cua cac o Ia dong fhoI, co nghIa Ia can cu vao so o ko
can song hay chof frong mof frang fhaI do quyof djnh su song chof cua cac o
o frang fhaI sau.
18.2. Cuc vI du
Chung fa goI mof doI fuong IuoI chua cac o song va chof nhu vay Ia mof cau
hnh. Trong hnh 18.1, con so o moI o bIou dIon so o song chung quanh no, fhoo
quy fac fh cau hnh nay so khong con o nao song o frang fhaI sau. Trong khI do
cau hnh o hnh 18.2 so bon vung va khong bao gIo fhay doI.
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 402
VoI mof frang fhaI khoI dau nao do, chung fa kho Iuong fruoc duoc dIou g so
xay ra. Mof vaI cau hnh don gIan ban dau co fho bIon doI qua nhIou buoc do
fhanh cac cau hnh phuc fap hon nhIou, hoac chof dan mof cach cham chap, hoac
so daf don su bon vung, hoac chI con Ia su chuyon doI Iap IaI gIua mof vaI frang
fhaI.
18.3. Gu thuut
Muc dch cua chung fa Ia vIof mof chuong frnh hIon fhj cac frang fhaI IIon
fIop nhau cua mof cau hnh fu mof frang fhaI ban dau nao do.
Giai thuat:
KhoI fao mof cau hnh ban dau co mof so o song.
In cau hnh da khoI fao.
Trong khI nguoI su dung van con muon xom su bIon doI cua cac frang fhaI:
- Cap nhaf frang fhaI moI dua vao cac quy fac cua chuong frnh.
- In cau hnh.
HInh 18.1- Mof frang fhaI cua Camo of IIfo
HInh 18.3 HaI cau hnh nay Iuan phIon fhay doI nhau.
HInh 18.2 Cau hnh co frang fhaI bon vung
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 403
Chung fa so xay dung Iop Life ma doI fuong cua no so co fon Ia
configuration. oI fuong nay can 3 phuong fhuc: initialize() do khoI fao,
print() do In frang fhaI hIon faI va update() do cap nhaf frang fhaI moI.
18.4. Chuong trInh chInh cho Game_Of_Life
#i ncl ude " ut i l i t y. h"
#i ncl ude " l i f e. h"
i nt main( ) / / Chuong frnh Game_Of _Li f e.
/ *
pre: NguoI su dung cho bIof frang fhaI ban dau cua cau hnh.
post: Chuong frnh In cac frang fhaI fhay doI cua cau hnh cho don khI nguoI su dung muon
ngung chuong frnh. Cach fhuc fhay doI frang fhaI fuan fhoo cac quy fac cua fro choI.
uses: Iop Li f e voI cac phuong fhuc i ni t i al i ze( ) , pr i nt ( ) , updat e( ) .
Cac ham phu fro i nst r uct i ons( ) , user _says_yes( ) .
*/
{
Life configuration;
i nst r uct i ons( ) ;
conf i gur at i on. initialize( ) ;
conf i gur at i on. print( ) ;
cout << " Cont i nue vi ewi ng new gener at i ons? " << endl ;
whi l e ( user_says_yes( ) ) {
conf i gur at i on. update( ) ;
conf i gur at i on. print( ) ;
cout << " Cont i nue vi ewi ng new gener at i ons? " << endl ;
}
}
VoI chuong frnh Li f e nay chung fa can hIon fhuc nhung phan sau:
Iop Life.
Phuong fhuc initialize() khoI fao cau hnh cua Life.
Phuong fhuc print() hIon fhj cau hnh cua Life.
Phuong fhuc update() cap nhaf doI fuong Life chua cau hnh o frang
fhaI moI.
Ham user_says_yes() do hoI nguoI su dung co fIop fuc xom frang fhaI
ko fIop hay khong.
Ham instruction() hIon fhj huong dan su dung chuong frnh.
VoI cach phac fhao nay chung fa co fho chuyon sang gIaI doan ko, do Ia chon
Iua cach fo chuc du IIou do hIon fhuc Iop Li f e.
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 404
18.4.1. Phen bun thu nhut cho lop Life
Trong phIon ban fhu nhaf nay, chung fa chua su dung mof Iop CTI co san
nao, ma chI suy nghI don gIan rang doI fuong Li f e can mof mang haI chIou cac
so nguyon do bIou dIon IuoI cac o. Trj 1 bIou dIon o song va frI 0 bIou dIon o chof.
Kch fhuoc mang Iay fhom bon bIon du fru do vIoc dom so o song ko can duo c
fhuc hIon do dang cho ca cac o nam fron canh bIon hay goc. Taf nhIon voI cach
chon Iua nay chung fa da phaI Io qua mof doI hoI cua chuong frnh: do Ia IuoI chu
nhaf phaI khong co gIoI han.
NgoaI cac phuong fhuc publ i c, Iop Li f e can fhom mof ham phu fro
neighbor_count do fnh cac o song ko can cua mof o cho fruoc.
const i nt maxr ow = 20, maxcol = 60; / / Kch fhuoc do fhu chuong frnh
cl ass Life {
publ i c:
voi d i ni t i al i ze( ) ;
voi d pr i nt ( ) ;
voi d updat e( ) ;
pr i vat e:
i nt grid[ maxr ow + 2] [ maxcol + 2] ; / / u fru fhom 4 bIon nhu hnh vo duoI day
i nt neighbor_count( i nt r ow, i nt col ) ;
};
uoI day Ia ham neighbor_count duoc goI boI phuong fhuc update.
i nt Li f e: : neighbor_count( i nt r ow, i nt col )
/ *
pre: oI fuong Li f e chua frang fhaI cac o song, chof. row va col Ia foa do hop Io cua mof o.
post: Tra vo so o dang song chung quanh o faI foa do r ow, col .
*/
{
i nt i , j ;
i nt count = 0;
HInh 18.4 IuoI cac o cua Li f e co du fru bon bIon
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 405
f or ( i = r ow - 1; i <= r ow + 1; i ++) / / Quof faf ca 9 o, ko ca faI ( r ow, col )
f or ( j = col - 1; j <= col + 1; j ++)
count += gr i d[ i ] [ j ] ; / / Nou o |I,j) song fh co frj 1 va duoc cong vao count
count - = gr i d[ r ow] [ col ] ; / / Tru dI ban fhan o dang duoc xof
r et ur n count ;
}
Trong phuong fhuc update duoI day chung fa can mof mang fam new_grid
do Iuu frang fhaI moI vua fnh duoc.
voi d Li f e: : update( )
/ *
pre: oI fuong Li f e dang chua mof frang fhaI hIon faI.
post: oI fuong Li f e chua frang fhaI moI.
*/
{
i nt r ow, col ;
i nt new_grid[ maxr ow + 2] [ maxcol + 2] ;
f or ( r ow = 1; r ow <= maxr ow; r ow++)
f or ( col = 1; col <= maxcol ; col ++)
switch ( nei ghbor _count ( r ow, col ) ) {
case 2:
new_grid[ r ow] [ col ] = gr i d[ r ow] [ col ] ; // gIu nguyon fnh frang cu
br eak;
case 3:
new_grid[ r ow] [ col ] = 1; // o so song
br eak;
def aul t :
new_grid[ r ow] [ col ] = 0; // o so chof
}
f or ( r ow = 1; r ow <= maxr ow; r ow++)
f or ( col = 1; col <= maxcol ; col ++)
grid[ r ow] [ col ] = new_grid[ r ow] [ col ] ;
}
Phuong fhuc initialize nhan fhong fIn fu nguoI su dung vo cac o song o
frang fhaI ban dau.
voi d Li f e: : initialize( )
/ *
post: oI fuong Li f e dang chua frang fhaI ban dau ma nguoI su dung mong muon.
*/
{
i nt r ow, col ;
f or ( r ow = 0; r ow <= maxr ow+1; r ow++)
f or ( col = 0; col <= maxcol +1; col ++)
gr i d[ r ow] [ col ] = 0;
cout << " Li st t he coor di nat es f or l i vi ng cel l s. " << endl ;
cout << " Ter mi nat e t he l i st wi t h t he speci al pai r - 1 - 1" << endl ;
ci n >> r ow >> col ;
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 406
whi l e ( r ow ! = - 1 | | col ! = - 1) {
i f ( r ow >= 1 && r ow <= maxr ow)
i f ( col >= 1 && col <= maxcol )
grid[ r ow] [ col ] = 1;
el se
cout << " Col umn " << col << " i s out of r ange. " << endl ;
el se
cout << " Row " << r ow << " i s out of r ange. " << endl ;
ci n >> r ow >> col ;
}
}
voi d Li f e: : print( )
/ *
pre: oI fuong Li f e dang chua mof frang fhaI.
post: Cac o song duoc In cho nguoI su dung xom.
*/
{
i nt r ow, col ;
cout << " \ nThe cur r ent Li f e conf i gur at i on i s: " <<endl ;
f or ( r ow = 1; r ow <= maxr ow; r ow++) {
f or ( col = 1; col <= maxcol ; col ++)
i f ( grid[ r ow] [ col ] == 1) cout << ' *' ;
el se cout << ' ' ;
cout << endl ;
}
cout << endl ;
}
Cuc hum phu tro
Cac ham phu fro duoI day co fho xom Ia khuon mau va co fho duoc sua doI doI
chuf do dung cho cac ung dung khac.
voi d instructions( )
/ *
post: In huong dan su dung chuong frnh Game_Of _Li f e.
*/
{
cout << " Wel come t o Conway' s game of Li f e. " << endl ;
cout << " Thi s game uses a gr i d of si ze "
<< maxr ow << " by " << maxcol << " i n whi ch" << endl ;
cout << " each cel l can ei t her be occupi ed by an or gani smor not . " << endl ;
cout << " The occupi ed cel l s change f r omgener at i on t o gener at i on" << endl ;
cout << " accor di ng t o t he number of nei ghbor i ng cel l s whi ch ar e al i ve. "
<< endl ;
}
bool user_says_yes( )
{
i nt c;
bool i ni t i al _r esponse = t r ue;
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 407
do { / / Iap cho don khI nguoI su dung go mof ky fu hop Io.
i f ( i ni t i al _r esponse)
cout << " ( y, n) ? " << f l ush;
el se
cout << " Respond wi t h ei t her y or n: " << f l ush;
do { / / o qua cac khoang frang.
c = ci n. get ( ) ;
} whi l e ( c == ' \ n' | | c ==' ' | | c == ' \ t ' ) ;
i ni t i al _r esponse = f al se;
} whi l e ( c ! = ' y' && c ! = ' Y' && c ! = ' n' && c ! = ' N' ) ;
r et ur n ( c == ' y' | | c == ' Y' ) ;
}
18.4.2. Phen bun thu hu vo CTOL mo cho Life
PhIon ban fron gIaI quyof duoc baI foan Game_Of _Li f e nhung voI han cho Ia
IuoI cac o co kch fhuoc gIoI han. You cau cua baI foan Ia fam IuoI chua cac o cua
Li f e Ia khong co gIoI han. Chung fa co fho khaI bao Iop Li f e chua mof mang
fhaf Ion nhu sau:
cl ass Life {
publ i c:
/ / Cac phuong fhuc.
pr i vat e:
bool map[ int] [ int] ;
/ / Cac fhuoc fnh khac va cac ham phu fro.
};
nhung cho du no co Ion may dI nua fh cung van co gIoI han, dong fhoI cac gIaI
fhuaf phaI quof hof faf ca cac o frong IuoI Ia hoan foan ph pham. Iou khong
hop Iy o day Ia faI moI fhoI dIom chI co mof so gIoI han cac o cua Li f e Ia song,
fof hon hof chung fa non nhn cac o song nay nhu Ia mof ma fran fhua. Va chung
fa so dung cac cau fruc IIon kof fhch hop.
18.4.2.1. Luu chon gu thuut
Chung fa so fhay, cac cong vIoc can xu Iy fron du IIou gop phan quyof djnh cau
fruc cua du IIou.
KhI can bIof frang fhaI cua mof o dang song hay chof, nou chung fa dung
phuong phap fra cuu cua bang bam fh gIaI fhuaf hIou qua hon raf nhIou: nou o co
frong bang fh co nghIa Ia no dang song, nguoc IaI Ia no dang chof. VIoc duyof
danh sach do xac nhan su co maf cua mof phan fu hay khong khong hIou qua
bang phuong phap bam nhu chung fa da bIof. oI voI baf ky mof o nao co frong
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 408
cau hnh, chung fa co fho xac djnh so o song chung quanh no bang cach fra cuu
frang fhaI cua chung.
Trong hIon fhuc moI cua chung fa cho phuong fhuc update, chung fa so duyof
qua faf ca cac o co kha nang fhay doI frang fhaI, xac djnh so o song chung quanh
moI o nho su dung bang, va chon ra nhung o so fhuc su song frong frang fhaI ko.
18.4.2.2. Ouc tu cuu truc du leu
Tuy rang bang bam chua faf ca cac o dang song, nhung no chI fIon frong vIoc
fra cuu frang fhaI cua fung o ma fhoI. Chung fa cung so can duyof qua cac o song
frong cau hnh do. VIoc duyof mof bang bam fhuong khong hIou qua. o do, ngoaI
bang bam, chung fa can mof danh sach cac o song nhu Ia fhanh phan du IIou fhu
haI cua mof cau hnh Li f e. Cac doI fuong duoc Iuu frong danh sach va bang bam
cua cau hnh Li f e cung chua fhong fIn vo cac o song, nhung chung fa co haI cach
fruy cap khac nhau. Iou nay phuc vu dac Iuc cho gIaI fhuaf cua baI foan nhu da
phan fch o fron. Chung fa so bIou dIon cac o bang cac fho hIon cua mof cau fruc
goI Ia Cell: moI o can mof cap foa do.
st r uct Cell {
Cel l ( ) { r ow = col = 0; } / / Cac constructor
Cel l ( i nt x, i nt y) { r ow = x; col = y; }
i nt r ow, col ;
}
KhI cau hnh Li f e noI rong, cac o o ba ngoaI cua no so xuaf hIon dan dan.
Nhu vay mof o moI so xuaf hIon nho vao vIoc cap phaf dong vung nho, va no so
chI duoc fruy xuaf don fhong qua con fro. Chung fa so dung mof Li st ma moI
phan fu chua con fro don mof o |hnh 18.5). MoI phan fu cua Li st gom haI con
fro: mof chI don mof o dang song va mof chI don phan fu ko frong Li st .
Cho fruoc mof con fro chI mof o dang song, chung fa co fho xac djnh cac foa
do cua o do bang cach Ian fhoo con fro roI Iay haI fhanh phan r ow va col cua no.
Nhu vay, chung fa co fho Iuu cac con fro chI don cac o nhu Ia cac ban ghI frong
bang bam; cac foa do r ow va col cua cac o, duoc xac djnh boI con fro, so Ia ca c
khoa fuong ung.
Chung fa can Iua chon gIua bang bam dja chI mo va bang bam noI kof. Cac
phan fu so chua frong bang bam chI co kch fhuoc nho: moI phan fu chI can chua
mof con fro don mof o dang song. Nhu vay, voI bang bam noI kof, kch fhuoc cua
moI ban ghI so fang 100% do phaI chua fhom cac con fro IIon kof frong cac danh
sach IIon kof. Tuy nhIon, ban fhan bang bam noI kof so co kch fhuoc raf nho ma
van co fho chua so ban ghI Ion gap nhIou Ian kch fhuoc chnh no. VoI bang bam
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 409
dja chI mo, cac ban ghI so nho hon v chI chua dja chI cac o dang song, nhung can
phaI du fru nhIou vj fr frong do franh hIon fuong fran xay ra va do qua frnh
fm kIom khong bj koo daI qua Iau khI dung do fhuong xuyon xay ra.
o fang fnh IInh hoaf, chung fa quyof djnh so dung bang bam noI kof co djnh
nghIa nhu sau:
cl ass Hash_table {
publ i c:
Er r or _code i nser t ( Cel l *new_ent r y) ;
bool r et r i eve( i nt r ow, i nt col ) const ;
pr i vat e:
List<Cell *> table[ hash_si ze] ; / / ung danh sach IIon kof.
};
O day, chung fa chI dac fa haI phuong fhuc: insert va retrieve. VIoc fruy
xuaf bang Ia do bIof bang co chua con fro chI don mof o co foa do cho fruoc hay
khong. o do phuong fhuc retrieve can haI fhong so chua foa do r ow va col va
fra vo mof frj bool . Chung fa danh vIoc hIon fhuc haI phuong fhuc nay nhu Ia
baI fap v chung raf fuong fu voI nhung g chung fa da fhao Iuan vo bang bam noI
kof frong chuong 12.
Chung fa Iuu y rang Hash_t abl e can co nhung phuong fhuc constructor va
destructor cua no. Chang han, destructor cua Hash_t abl e can goI destructor cua
Li st cho fung phan fu cua mang table.
HInh 18.5 anh sach IIon kof gIan fIop.
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 410
18.4.2.3. Lop Life
VoI cac quyof djnh fron, chung fa so guf IaI cach bIou dIon va nhung dIou can
Iuu y cho Iop Li f e. o cho vIoc fhay doI cau hnh duoc do dang chung fa so Iuu
cac fhanh phan du IIou mof cach gIan fIop qua cac con fro. Nhu vay Iop Li f e can
co constructor va destructor do djnh vj cung nhu gIaI phong cac vung nho cap
phaf dong cho cac cau fruc nay.
cl ass Life {
publ i c:
Li f e( ) ;
voi d i ni t i al i ze( ) ;
voi d pr i nt ( ) ;
voi d updat e( ) ;
~Li f e( ) ;
pr i vat e:
Li st <Cel l *> *living;
Hash_t abl e *is_living;
bool retrieve( i nt r ow, i nt col ) const ;
Er r or _code insert( i nt r ow, i nt col ) ;
i nt neighbor_count( i nt r ow, i nt col ) const ;
};
Cac ham phu fro retrieve va neighbor_count xac djnh frang fhaI cua mof
o bang cach fruy xuaf bang bam. Ham phu fro khac, insert, khoI fao mof doI
fuong Cell cap phaf dong va chon no vao bang bam cung nhu danh sach cac o
frong doI fuong Life.
18.4.2.4. Cuc phuong thuc cuu Life
Chung fa so vIof mof vaI phuong fhuc va ham cua Li f e do mInh hoa cach xu Iy
cac o, cac danh sach va nhung g dIon ra frong bang bam. Cac ham con IaI xom
nhu baI fap.
Cup nhut cuu hInh
Phuong fhuc update co nhIom vu xac djnh cau hnh ko fIop cua Li f e fu mof
cau hnh cho fruoc. Trong phIon ban fruoc, chung fa Iam dIou nay bang cach xof
moI o co frong IuoI chua cau hnh grid, fnh cac o ko can chung quanh cho moI o
do xac djnh frang fhaI ko fIop cua no. Cac fhong fIn nay duoc chua frong bIon cuc
bo new_grid va sau do duoc chop vao grid.
Chung fa so Iap IaI nhung cong vIoc nay ngoaI fru vIoc phaI xof moI o co fho
co frong cau hnh do day Ia mof IuoI khong co gIoI han. Thay vao do, chung fa
non gIoI han fam nhn cua chung fa chI frong cac o co kha nang so song frong
frang fhaI ko. o co fho Ia cac o nao7 Ro rang do chnh Ia cac o dang song frong
frang fhaI hIon faI, chung co fho chof dI nhung cung co fho fIop fuc song frong
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 411
frang fhaI ko. NgoaI ra, mof so o dang chof cung co fho fro non song frong frang
fhaI sau, nhung do chI Ia nhung o dang chof nam ko nhung o dang song |cac o co
mau xam frong hnh 9.18). Nhung o xa hon nua khong co kha nang song day do
chung khong co o nao ko can dang song.
Trong phuong fhuc update, bIon cuc bo Li f e new_configuration dung do
chua cau hnh moI: chung fa fhuc hIon vong Iap cho faf ca nhung o dang song va
nhung o ko can cua chung, doI voI moI o nhu vay, fruoc hof can xac djnh xom no
da duoc fhom vao new_configuration hay chua, chung fa can phaI can fhan do
franh vIoc fhom bj Iap IaI haI Ian cho mof o. Nou qua fhaf o dang xof chua co
frong new_configuration, chung fa dung ham neighbor_count do quyof djnh
vIoc co fhom no vao cau hnh moI hay khong.
O cuoI phuong fhuc, chung fa can hoan doI cac fhanh phan List va
Hash_table gIua cau hnh hIon faI va cau hnh moI new_configuration. Su
hoan doI nay Iam cho doI fuong Life co duoc cau hnh da duoc cap nhaf, ngoaI
ra, no con bao dam rang cac o, danh sach, va bang bam frong cau hnh cu cua doI
fuong Life so duoc gIaI phong khoI bo nho cap phaf dong |vIoc nay duoc fhuc
hIon do frnh bIon djch fu dong goI destructor cho doI fuong cuc bo
new_configuration).
voi d Li f e: : update()
/ *
post: oI fuong Li f e chua cau hnh o frang fhaI ko.
uses: Iop Hash_t abl e va Iop Li f e va cac ham phu fro.
*/
{
Li f e new_conf i gur at i on;
Cel l *ol d_cel l ;
HInh 18.6 Cau hnh IIfo voI cac o chof vIon chung quanh.
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 412
f or ( i nt i = 0; i < l i vi ng- >si ze( ) ; i ++) {
l i vi ng- >r et r i eve( i , ol d_cel l ) ; / / Iay mof o dang song.
f or ( i nt r ow_add = - 1; r ow_add < 2; r ow_add ++)
f or ( i nt col _add = - 1; col _add < 2; col _add++) {
i nt new_r ow = ol d_cel l - >r ow + r ow_add,
new_col = ol d_cel l - >col + col _add;
/ / new_r ow, new_col Ia foa do cua o dang xof hoac o ko can cua no.
i f ( ! new_conf i gur at i on. r et r i eve( new_r ow, new_col ) )
switch ( nei ghbor _count ( new_r ow, new_col ) ) {
case 3: / / So o song ko can Ia 3 fh o dang xof fro fhanh song.
new_conf i gur at i on. i nser t ( new_r ow, new_col ) ;
br eak;
case 2: / / So o song ko can Ia 2 fh o dang xof gIu nguyon frang fhaI.
i f ( r et r i eve( new_r ow, new_col ) )
new_conf i gur at i on. i nser t ( new_r ow, new_col ) ;
br eak;
def aul t : / / O so chof.
br eak;
}
}
}
/ / Trao du IIou frong conf i gur at i on voI du IIou frong new_conf i gur at i on.
new_conf i gur at i on so duoc don dop boI destructor cua no.
Li st <Cel l *> *t emp_l i st = l i vi ng;
l i vi ng = new_conf i gur at i on. l i vi ng;
new_conf i gur at i on. l i vi ng = t emp_l i st ;
Hash_t abl e *t emp_hash = i s_l i vi ng;
i s_l i vi ng = new_conf i gur at i on. i s_l i vi ng;
new_conf i gur at i on. i s_l i vi ng = t emp_hash;
}
n cuu hInh
o In duoc faf ca cac o dang song, chung fa co fho IIof ko Ian Iuof moI dong
mof o voI foa do r ow, col cua no. Nguoc IaI nou muon bIou dIon dung vj fr r ow,
col fron IuoI, chung fa nhan fhay rang chung fa khong fho hIon fhj nhIou hon Ia
mof mau nho cua mof cau hnh Li f e khong co gIoI han Ion man hnh. o do
chung fa so In mof cua so chu nhaf do hIon fhj frang fhaI cua 20 x 80 cac vj fr o
frung fam cua cau hnh Li f e.
oI voI moI o frong cua so, chung fa fruy xuaf frang fhaI cua no fu bang bam
va In mof ky fu frang hoac khac frang fuong ung voI frang fhaI chof hoac song
cua no.
voi d Li f e: : print( )
/ *
post: In mof frang fhaI cua doI fuong Li f e.
uses: Li f e: : r et r i eve.
*/
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 413
{
i nt r ow, col ;
cout << endl << " The cur r ent Li f e conf i gur at i on i s: " << endl ;
f or ( r ow = 0; r ow < 20; r ow++) {
f or ( col = 0; col < 80; col ++)
i f ( r et r i eve( r ow, col ) ) cout << ' *' ;
el se cout << ' ' ;
cout << endl ;
}
cout << endl ;
}
Tuo vu them cuc o mo
Phuong fhuc insert fao mof o moI voI foa do cho fruoc va fhom no vao bang
bam is_living va vao danh sach living.
Er r or Code Li f e: : insert( i nt r ow, i nt col )
/ *
pre: O co foa do ( r ow, col ) khong fhuoc vo doI fuong Li f e ( o dang chof)
post: O co foa do ( r ow, col ) duoc bo sung vao doI fuong Li f e ( o fro non song) . Nou vIoc
fhom vao Li st hoac Hash_t abl e khong fhanh cong fh IoI so duoc fra vo.
uses: Cac Iop Li st , Hash_t abl e, va cau fruc Cel l .
*/
{
Er r or _code out come;
Cel l *new_cel l = new Cel l ( r ow, col ) ;
i nt i ndex = l i vi ng- >si ze( ) ;
out come = l i vi ng- >i nser t ( i ndex, new_cel l ) ;
i f ( out come == success)
out come = i s_l i vi ng- >i nser t ( new_cel l ) ;
i f ( out come ! = success)
cout << " War ni ng: new Cel l i nser t i on f ai l ed" << endl ;
r et ur n out come;
}
Constructor vu destructor cho cuc do tuong Life
Chung fa can cung cap constructor va destructor cho Iop Li f e cua chung fa do
djnh vj va gIaI phong cac fhanh phan cap phaf dong cua no. Constructor can fhuc
hIon foan fu nov cho cac fhuoc fnh con fro.
Li f e: : Life( )
/ *
post: Cac fhuoc fnh fhanh phan cua doI fuong Li f e duoc cap phaf dong va duoc khoI fao.
uses: Cac Iop Hash_t abl e, Li st .
*/
{
l i vi ng = new Li st <Cel l *>;
i s_l i vi ng = new Hash_t abl e;
}
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 414
Destructor can gIaI phong moI phan fu duoc cap phaf dong boI baf ky mof
phuong fhuc nao do cua Iop Li f e. on canh haI con fro living va is_living
duoc khoI fao nho constructor con co cac doI fuong Cell ma chung fham chIou
don da duoc cap phaf dong frong phuong fhuc insert. Destructor can gIaI phong
cac doI fuong Cell nay fruoc khI gIaI phong living va s_lvng.
Li f e: : ~Life( )
/ *
post: Cac fhuoc fnh cap phaf dong cua doI fuong Li f e va cac doI fuong do chung fham chIou
duoc gIaI phong.
uses: Cac Iop Hash_t abl e, Li st .
*/
{
Cel l *ol d_cel l ;
f or ( i nt i = 0; i < l i vi ng- >si ze( ) ; i ++) {
l i vi ng- >r et r i eve( i , ol d_cel l ) ;
del et e ol d_cel l ;
}
del et e i s_l i vi ng; / / CoI destructor cua Hash_t abl e.
del et e l i vi ng; / / CoI destructor cua Li st .
}
oI voI nhung cau fruc co nhIou IIon kof bang con fro nhu fho nay, chung fa Iuon
phaI daf van do vo kha nang fao rac do nhung so suaf cua chung fa. Thong
fhuong fh destructor cua mof Iop Iuon Iam fof nhIom vu cua no, nhung no chI don
dop nhung g fhuoc doI fuong cua no, chu khong bIof don nhung g ma doI fuong
cua no fham chIou don. Nou chung fa chu quan, vIoc don dop khong dIon ra dung
nhu chung fa fuong. KhI chay, chuong frnh co fho Ia quon don dop, cung co fho
Ia don dop nhIou hon mof Ian doI voI mof vung nho duoc cap phaf dong. ay cung
Ia mof van do kha Iy fhu ma sInh vIon non fu suy nghI fhom.
Hum bum
Ham bam o day co hoI khac voI nhung g chung fa da gap frong nhung phan
fruoc, fhong so cua no co don haI fhanh phan |r ow va col ), nho vay chung fa co
fho do dang su dung mof vaI dang cua phop fron. Truoc khI quyof djnh non Iam
nhu fho nao, chung fa hay xof fruong hop mof mang chu nhaf nho co anh xa mof
mof duoI day chnh Ia mof ham chI so. Co chnh xac Ia maxrow phan fu frong moI
hang, cac chI so I, j duoc anh xa don I + maxr ow*j do daf mang chu nhaf vao
mof chuoI cac vung nho IIon fuc, hang nay ko fIop hang kIa.
Chung fa non dung cach anh xa fuong fu cho ham bam cua chung fa va so fhay
fho maxr ow bang mof so fhch hop, chang han nhu mof so nguyon fo, do vIoc
phan phoI duoc raI dou va gIam su dung do.
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 415
const i nt f act or = 101;
i nt hash( i nt r ow, i nt col )
/ *
post: Tra vo gIa frj ham bam fu 0 don hash_si ze - 1 fuong ung voI foa do ( r ow, col ) .
*/
{
i nt val ue;
val ue = r ow + f act or * col ;
val ue %= hash_si ze;
i f ( val ue < 0) r et ur n val ue + hash_si ze;
el se r et ur n val ue;
}
Cuc chuong trInh con khuc
Cac phuong fhuc con IaI cua Li f e nhu i ni t i al i ze, r et r i eve, va
nei ghbor _count dou duoc xom xof fuong fu nhu cac ham vua roI hoac nhu cac
ham fuong ung frong phIon ban fhu nhaf. Chung fa danh chung IaI nhu baI fap.
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 416