You are on page 1of 426

Cbuong 1.

Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 1/16
Phan 1 PHAN MO OA

Chng 1 GO THK
1.1. Ve phuong phup phun tIch thet ke huong do tuong
Thong fhuong phan quan frong nhaf cua qua frnh phan fch fhIof ko Ia chIa
van do fhanh nhIou van do nho do hIou va chI fIof hon. Nou chung van con kho
hIou, chung IaI duoc chIa nho hon nua. Trong baf ky mof fo chuc nao, nguoI quan
Iy cao nhaf cung khong fho quan fam don moI chI fIof cung nhu moI hoaf dong.
Ho can fap frung vao muc fIou va cac nhIom vu chnh, ho chIa bof frach nhIom
cho nhung nguoI cong su duoI quyon cua ho. VIoc Iap frnh frong may fnh cung
fuong fu. Ngay ca khI du an du nho cho mof nguoI fhuc hIon fu dau foI cuoI, vIoc
chIa nho cong vIoc cung raf quan frong. Phuong phap phan fch fhIof ko huong
doI fuong dua fron quan dIom nay. CaI kho nhaf Ia djnh ra cac Iop sao cho moI
Iop sau nay so cung cap cac doI fuong co cac hanh vI dung nhu chung fa mong doI.
VIoc Iap frnh gIaI quyof baI foan Ion cua chung fa so duoc fap frung vao nhung
gIaI fhuaf Ion. Chuong frnh khI do duoc xom nhu mof kjch ban, frong do cac doI
fuong so duoc goI do fhuc hIon cac hanh vI cua mnh vao nhung Iuc can fhIof.
Chung fa khong con phaI Io bj maf phuong huong v nhung chI fIof vun vaf khI
can phaI phac fhao mof kjch ban dung dan, mof khI chung fa da fIn fuong hoan
foan vao kha nang hoan fhanh nhIom vu cua cac Iop ma chung fa da gIao pho.
Cac /op Jo nguoi /ap trnb Jjnb ngba Jong oai tro trung tam trong oicc bicn
tbuc giai tbuat.
1.2. Go theu mon hoc Cuu truc du leu (CTOL) vu gu thuut
Thoo quan dIom cua phan fch fhIof ko huong doI fuong, moI Iop so duoc xay
dung voI mof so chuc nang nao do va cac doI fuong cua no so fham gIa vao hoaf
dong cua chuong frnh. Iom manh cua huong doI fuong Ia fnh dong kn va fnh
su dung IaI cua cac Iop. MoI phan mom bIon djch cho mof ngon ngu Iap frnh nao
do dou chua raf nhIou fhu vIon cac Iop nhu vay. Chung fa fhu dIom qua mof so
Iop ma nguoI Iap frnh fhuong hay su dung: cac Iop co nhIom vu doc/ ghI do frao
doI du IIou voI cac fhIof bj ngoaI vI nhu dIa, may In, ban phm,; cac Iop do hoa
cung cap cac chuc nang vo, fo mau co ban; cac Iop dIou khIon cho phop xu Iy vIoc
gIao fIop voI nguoI su dung fhong qua ban phm, chuof, man hnh; cac Iop phuc vu
cac gIao djch fruyon nhan fhong fIn qua mang;Cac Iop CTI ma chung fa sap
ban don cung khong Ia mof fruong hop ngoaI Io. Co fho chIa faf ca cac Iop nay
fhanh haI nhom chnh:
Cac Iop djch vu.
Cac Iop co kha nang Iuu fru va xu Iy Iuong du IIou Ion.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 2/16
Nhom fhu haI muon noI don cac Iop CTI |CTI). Vay co g gIong va khac
nhau gIua cac Iop CTI va cac Iop khac7
Iom gIong nhau gIua cac Iop CTI va cac Iop khac: moI Iop dou phaI
fhuc hIon mof so chuc nang fhong qua cac hanh vI cua cac doI fuong cua
no. Mof khI chung fa da xay dung xong mof Iop CTI nao do, chung fa
hoan foan fIn fuong rang no so hoan fhanh xuaf sac nhung nhIom vu ma
chung fa da fhIof ko va da gIao pho cho no. Iou nay raf khac bIof so voI
nhung faI IIou vIof vo CTI fhoo quan dIom huong fhu fuc fruoc day: vIoc
xu Iy du IIou khong ho co fnh dong kn va fnh su dung IaI. Tuy vo maf
fhuc fhI fh cac chuong frnh nhu fho co kha nang chay nhanh hon,
nhung chung boc Io raf nhIou nhuoc dIom: fhoI gIan phaf frIon gIaI fhuaf
chnh raf cham gay kho khan nhIou cho nguoI Iap frnh, chuong frnh
fhIou fnh frong sang, raf kho sua IoI va phaf frIon.
ac frung rIong cua cac Iop CTI: NhIom vu chnh cua cac Iop CTI Ia
nam gIu du IIou sao cho co fho dap ung moI khI duoc chuong frnh you cau
fra vo mof du IIou cu fho nao do ma chuong frnh can don. Nhung fhao
fac co ban doI voI mof CTI fhuong Ia: fhom du IIou moI, xoa bo du IIou
da co, fm kIom, fruy xuaf.

NgoaI cac fhao fac du IIou co ban, cac CTI khac nhau so khac nhau vo cac
fhao fac bo sung khac. Chnh v dIou nay ma khI fhIof ko nhung gIaI fhuaf do
gIaI quyof cac baI foan Ion, nguoI fa so Iua chon CTI nao Ia fhch hop nhaf.

Chung fa fhu xom xof mof v du fhaf don gIan sau day.
CIa su chung fa can vIof mof chuong frnh nhan vao mof day cac con so, va In
chung ra fhoo fhu fu nguoc voI fhu fu nhap vao ban dau.
o gIaI quyof baI foan nay, nou chung fa nghI don vIoc phaI khaI bao cac bIon do
Iuu cac gIa frj nhap vao nhu fho nao, va sau do Ia fhu fu In ra sao do dap ung you
cau baI foan, fh duong nhu Ia chung fa da quon ap dung nguyon fac Iap frnh
huong doI fuong: chung fa da phaI ban fam don nhung vIoc qua chI fIof. ay chI
Ia mof v du vo cung don gIan, nhung no co fho mInh hoa cho vaI fro cua CTI.
Nou chung fa nho rang, vIoc fo chuc va Iuu du IIou nhu fho nao Ia mof vIoc qua
chI fIof va fI mI khong non fhuc hIon va o Iuc nay, fh do chnh Ia Iuc chung fa da
buoc dau hIou duoc vaI fro cua cac Iop CTI.

Mon CTI va gIaI fhuaf so gIup chung fa hIou ro vo cac Iop CTI co san
frong cac phan mom. Hon fho nua, frong khI hoc cach xay dung cac Iop CTI fu
don gIan don phuc fap, chung fa so nam duoc cac phuong phap cung nhu cac ky
nang fhong qua mof so nguyon fac chung. Tu do, ngoaI kha nang hIou ro do co
fho Iua chon mof cach dung dan nhaf nhung CTI co san, chung fa con co kha
nang xay dung nhung Iop CTI phuc fap hon, fInh fo va fhch hop hon frong
moI baI foan ma chung fa can gIaI quyof. Kha nang fhua ko cac CTI co san do
phaf frIon fhom cac fnh nang mong muon cung Ia mof dIou dang Iuu y.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 3/16

VoI v du fron, nhung aI da fung fIop xuc f nhIou voI vIoc Iap frnh dou khong
xa Ia voI khaI nIom ngan xop. ay Ia mof CTI don gIan nhaf nhung IaI raf
fhong dung, va dI nhIon chung fa so co djp hoc ky hon vo no. O day chung fa
muon muon no do mInh hoa, va cung nham gIup cho nguoI doc Iam quon voI mof
phuong phap fIop can hoan foan nhaf quan frong suof gIao frnh nay.
CIa su CTI ngan xop cua chung fa da duoc gIao cho mof nhIom vu Ia caf gIu
nhung du IIou va fra vo khI co you cau, fhoo mof quy djnh baf dI baf djch Ia du
IIou dua vao sau phaI duoc Iay ra fruoc. ang cach su dung CTI ngan xop,
chuong frnh fro non hof suc don gIan va duoc frnh bay bang ngon ngu gIa nhu
sau:

Iap cho don khI nhap du cac con so mong muon
{
Nhap 1 con so.
Caf vao ngan xop con so vua nhap.
l
Iap frong khI ma ngan xop van con du IIou
{
Iay fu ngan xop ra mof con so.
In so vua Iay duoc.
l

Chung fa so co djp gap nhIou baI foan phuc fap hon ma cung can su dung don
dac fnh nay cua ngan xop. Tnh dong kn cua cac Iop gIup cho chuong frnh vo
cung frong sang. oan chuong frnh fron khong ho cho chung fa fhay ngan xop
da Iam vIoc voI cac du IIou duoc dua vao nhu fho nao, do Ia nhIom vu ma chung fa
da gIao pho cho no va chung fa hoan foan yon fam vo dIou nay. ang cach nay,
khI da co nhung CTI fhch hop, nguoI Iap frnh co fho do dang gIaI quyof cac
baI foan Ion. Ho co fho yon fam fap frung vao nhung dIom mau chof do xay dung,
fInh cho gIaI fhuaf va kIom IoI.

Tron day chung fa chI vua moI gIoI fhIou vo phan CTI nam frong noI dung
cua mon hoc CTI va gIaI fhuaf. Vay gIaI fhuaf Ia g7 ung fron quan dIom
fhIof ko va Iap frnh huong doI fuong, chung fa da hIou vaI fro cua cac Iop. Vay
khI da co cac Iop roI fh nguoI fa can xay dung kjch ban cho cac doI fuong hoaf
dong nham gIaI quyof baI foan chnh. Chung fa can mof cau fruc chuong frnh do
fao ra kjch ban do: vIoc g Iam fruoc, vIoc g Iam sau; vIoc g chI Iam frong nhung
fnh huong dac bIof nao do; vIoc g can Iam Iap IaI nhIou Ian. Chung fa nhac don
gIaI fhuaf chnh Ia quay vo voI khaI nIom cua Iap frnh fhu fuc fruoc kIa. NgoaI
ra, chung fa cung can don gIaI fhuaf khI can hIon fhuc cho moI Iop: xong phan
dac fa cac phuong fhuc - phuong fIon gIao fIop cua Iop voI bon ngoaI - chung fa
can don khaI nIom Iap frnh fhu fuc do gIaI quyof phan hIon fhuc bon frong cua
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 4/16
cac phuong fhuc nay. o Ia vIoc chung fa phaI xu Iy nhung du IIou bon frong cua
chung nhu fho nao moI co fho hoan fhanh duoc chuc nang ma phuong fhuc phaI
dam nhIom.

Nhu vay, vo phan gIaI fhuaf frong mon hoc nay, chu you chung fa so fm hIou
cac gIaI fhuaf ma cac phuong fhuc cua cac Iop CTI dung don, mof so gIaI fhuaf
sap xop fm kIom, va cac gIaI fhuaf frong cac ung dung mInh hoa vIoc su dung cac
Iop CTI do gIaI quyof mof so baI foan do.

Trong gIao frnh nay, y fuong vo cac gIaI fhuaf so duoc frnh bay can ko, phan
chuong frnh dung ngon ngu C++ hoac ngon ngu gIa fhoo quy uoc o cuoI chuong
nay. Phan danh gIa gIaI fhuaf chI nou nhung kof qua da duoc chung mInh va
kIom nghIom, sInh vIon co fho fm hIou ky hon frong cac sach fham khao.
1.3. Cuch tep cun trong quu trInh tIm heu cuc lop CTOL
1.3.1. Cuc buoc trong quu trInh phun tIch thet ke huong do tuong
Qua frnh phan fch fhIof ko huong doI fuong khI gIaI quyof mof baI foan gom
cac buoc nhu sau:
1. jnh ra cac Iop voI cac chuc nang ma chung fa mong doI. Cong vIoc nay cung
gIong nhu cong vIoc phan cong cong vIoc cho cac nhan vIon cung fham gIa
mof du an.
2. CIaI quyof baI foan bang cach Iua chon cac gIaI fhuaf chnh. o Ia vIoc fao ra
mof moI fruong do cac doI fuong cua cac Iop nou fron fuong fac Ian nhau.
CIaI fhuaf chnh duoc xom nhu mof kjch ban dan daf cac doI fuong fhuc hIon
cac hanh vI cua chung vao nhung fhoI dIom can fhIof.
3. HIon fhuc cho moI Iop.

Y fuong chnh o day nam o buoc fhu haI, dau cho cac Iop chua duoc hIon fhuc,
chung fa hoan foan co fho su dung chung sau khI da bIof ro nhung chuc nang ma
moI Iop so phaI hoan fhanh. Trung fhanh voI quan dIom nay cua huong doI fuong,
chung fa cung so nou ra day phuong phap fIop can ma chung fa so su dung mof
cach hoan foan nhaf quan frong vIoc nghIon cuu va xay dung cac Iop CTI.

!ng dung frong chuong 18 vo chuong frnh Camo Of IIfo Ia mof dan chung vo
cac buoc phan fch fhIof ko frong qua frnh xay dung non mof chuong frnh. SInh
vIon co fho fham khao ngay phan nay. RIong phan 18.4.2 phIon ban fhu haI cua
chuong frnh sInh vIon chI co fho fham khao sau khI doc qua chuong 4 vo danh
sach va chuong 12 vo bang bam.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 5/16
1.3.2. Quu trInh xuy dung cuc lop CTOL
Chung fa so Ian Iuof xay dung fu cac Iop CTI don gIan cho don cac Iop
CTI phuc fap hon. Tuy nhIon, qua frnh fhIof ko va hIon fhuc cho moI Iop
CTI dou fuan fhoo dung cac buoc sau day:

1. Xuaf phaf fu mof mo hnh foan hoc hay dua vao mof nhu cau fhuc fo nao
do, chung fa djnh ra cac chuc nang cua Iop CTI chung fa can co. uoc nay
gIong buoc fhu nhaf o fron, v Iop CTI, cung nhu cac Iop khac, so cung cap
cho chung fa cac doI fuong do hoaf dong frong chuong frnh chnh. Va nhu
vay, nhung nhIom vu ma chung fa so gIao cho no so duoc chI ra mof cach ro
rang va chnh xac o buoc ko fIop sau day.

2. ac fa day du cach fhuc gIao fIop gIua Iop CTI dang duoc fhIof ko voI moI
fruong ngoaI |cac chuong frnh so su dung no). Phan gIao fIop nay duoc mo
fa fhong qua djnh nghIa cac phuong fhuc cua Iop. MoI phuong fhuc Ia mof
hanh vI cua doI fuong CTI sau nay, phan dac fa gom cac you fo sau:
KIou cua kof qua ma phuong fhuc fra vo.
Cac fhong so vao / ra.
Cac dIou kIon ban dau fruoc khI phuong fhuc duoc goI |prcconJition).
Cac kof qua ma phuong fhuc Iam duoc |postconJition).
Cac Iop, ham co su dung frong phuong fhuc |uscs).
Thong qua phan dac fa nay, cac CTI hoan foan co fho duoc su dung frong
vIoc xay dung non nhung gIaI fhuaf Ion frong cac baI foan Ion. Phan dac fa
nay co fho duoc xom nhu nhung cam kof ma khong bao gIo duoc quyon fhay
doI. Co nhu vay cac chuong frnh co su dung CTI moI khong bj fhay doI
mof khI da su dung chung.

3. Tm hIou cac phuong an hIon fhuc cho Iop CTI. Chung fa cung non nho
rang, co raf nhIou cach hIon fhuc khac nhau cho cung mof dac fa cua mof Iop
CTI. Vo maf hIou qua, co nhung phuong an gan nhu gIong nhau, nhung
cung co nhung phuong an khac nhau raf xa. Iou nay phu fhuoc raf nhIou
vao cach fo chuc du IIou bon frong ban fhan cua Iop CTI, vao cac gIaI
fhuaf IIon quan don vIoc xu Iy du IIou cua cac phuong fhuc.

4. Chon phuong an va hIon fhuc Iop. Trong buoc nay bao gom ca vIoc kIom fra
do hoan faf Iop CTI nhu Ia mof Iop do bo sung vao fhu vIon, nguoI Iap
frnh co fho su dung chung frong nhIou chuong frnh sau nay. Cong vIoc o
buoc nay ko cung kha vaf va, v chung fa so phaI kIom fra fhaf ky Iuong,
fruoc khI dua san pham ra nhu nhung dong goI, ma nguoI khac co fho hoan
foan yon fam khI su dung chung.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 6/16
o co duoc nhung san pham hoan hao fhuc hIon dung nhung dIou da cam kof,
buoc fhu haI fron day duoc xom Ia buoc quan frong nhaf. Va do co duoc mof djnh
nghIa va mof dac fa day du va chnh xac nhaf cho mof CTI moI nao do, buoc
fhu haI phaI duoc fhuc hIon hoan foan doc Iap voI haI buoc sau no. ay Ia nguyon
fac vo cung quan frong ma chung fa so phaI fuan fhu mof cach frIof do. V frong
fruong hop nguoc IaI, vIoc xom xof som cac chI fIof cu fho so Iam cho chung fa do
co caI nhn phIon dIon, dIou nay do dan don nhung dac fa mang nhIou so suaf.
1.4. Mot so d{nh nghIu co bun
Chung fa baf dau bang djnh nghIa cua mof kIou du IIou |typc):
1.4.1. O{nh nghIu keu du leu
jnb ngba: Mof kIou du IIou Ia mof fap hop, cac phan fu cua fap hop nay duoc
goI Ia cac frj cua kIou du IIou.

Chung fa co fho goI mof kIou so nguyon Ia mof fap cac so nguyon, kIou so fhuc
Ia mof fap cac so fhuc, hoac kIou ky fu Ia mof fap cac ky hIou ma chung fa mong
muon su dung frong cac gIaI fhuaf cua chung fa.
Iuu y rang chung fa da co fho chI ra su phan bIof gIua mof kIou du IIou fruu
fuong va cach hIon fhuc cua no. Chang han, kIou Inf frong C++ khong phaI Ia fap
cua faf ca cac so nguyon, no chI chua cac so nguyon duoc bIou dIon fhuc su boI
mof may fnh xac djnh, so nguyon Ion nhaf frong fap phu fhuoc vao so bIf nguoI
fa danh do bIou dIon no |fhuong Ia mof fu gom 2 byfos fuc 16 bIfs). Tuong fu, kIou
fIoaf va double frong C++ bIou dIon mof fap cac so fhuc co dau cham dong nao
do, va do chI Ia mof fap con cua fap faf ca cac so fhuc.
1.4.2. Keu nguyen to vu cuc keu co cuu truc
Cac kIou nhu int, float, char duoc goI Ia cac kIou nguyon fo |atomic) v
chung fa xom cac frj cua chung chI Ia mof fhuc fho don, chung fa khong co mong
muon chIa nho chung. Tuy nhIon, cac ngon ngu may fnh fhuong cung cap cac
cong cu cho phop chung fa xay dung cac kIou du IIou moI goI Ia cac kIou co cau
fruc |structurcJ typcs). Chang han nhu mof sfrucf frong C++ co fho chua nhIou
kIou nguyon fo khac nhau, frong do khong IoaI fru mof kIou co cau fruc khac Iam
fhanh phan. Trj cua mof kIou co cau fruc cho chung fa bIof no duoc fao ra boI cac
phan fu nao.
1.4.3. Chuo no tep vu dunh such
jnb ngba: Mof chuoI noI fIop |scqucncc) kch fhuoc 0 Ia mof chuoI rong. Mof
chuoI noI fIop kch fhuoc n 1 cac phan fu cua fap T Ia mof cap co fhu
fu |Sn-1, f), frong do Sn-1 Ia mof chuoI noI fIop kch fhuoc n 1 cac
phan fu cua fap T, va f Ia mof phan fu cua fap T.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 7/16
Tu djnh nghIa nay chung fa co fho fao non mof chuoI noI fIop daI fuy y, baf
dau fu mof chuoI noI fIop rong va fhom moI Ian mof phan fu cua fap T.

Chung fa phan bIof haI fu: noI fIop |scqucntia/) ngu y cac phan fu fhuoc mof
chuoI noI fIop vo maf Iuan Iy, con fu IIon fuc |contiguous) ngu y cac phan fu nam
ko nhau frong bo nho. Trong djnh nghIa fron day chung fa chI dung fu noI fIop
ma fhoI, chung fa chua ho quan fam vo maf vaf Iy.

Tu djnh nghIa chuoI noI fIop huu han cho phop chung fa djnh nghIa mof danh
sach |/ist):
jnb ngba: Mof danh sach cac phan fu fhuoc kIou T Ia mof chuoI noI fIop huu
han cac phan fu kIou T.
1.4.4. Cuc keu du leu truu tuong

jnb ngba: CTI |Data 8tructurc) Ia mof su kof hop cua cac kIou du IIou nguyon
fo, va/ hoac cac kIou du IIou co cau fruc, va/ hoac cac CTI khac vao
mof fap, cung cac quy fac vo cac moI quan ho gIua chung.

Trong djnh nghIa nay, cau fruc co nghIa Ia fap cac quy fac kof noI cac du IIou
voI nhau. Maf khac, dung fron quan dIom cua huong doI fuong, chung fa so xay
dung moI CTI nhu Ia mof Iop ma ngoaI kha nang chua du IIou, no con co cac
hanh vI dac frung rIong, do chnh Ia cac fhao fac cho phop cap nhap, fruy xuaf
cac gIa frj du IIou cho fung doI fuong. Nho do, chung fa co duoc mof khaI nIom
moI: kIou du IIou fruu fuong |abstract Jata typc), fhuong vIof faf Ia AT.

Nguyon fac quan frong o day Ia mof djnh nghIa cua baf ky mof kIou du IIou
fruu fuong nao cung gom haI phan: phan fhu nhaf mo fa cach ma cac phan fu
frong kIou IIon quan don nhau, phan fhu haI Ia su IIof ko cac fhao fac co fho fhuc
hIon fron cac phan fu cua kIou du IIou fruu fuong do.

Iuu y rang khI djnh nghIa cho mof kIou du IIou fruu fuong chung fa hoan foan
khong quan fam don cach hIon fhuc cua no. Mof djnh nghIa cho mof kIou du IIou
fruu fuong phu fhuoc vao nhung nhIom vu ma chung fa frong doI no phaI fhuc
hIon duoc. uoI day Ia mof so van do chung fa fhuong hay xom xof:
Co quan fam don fhu fu fhom vao cua cac phan fu hay khong7
VIoc fruy xuaf phan fu phu fhuoc fhu fu fhom vao cua cac phan fu, hay co
fho fruy xuaf phan fu baf ky dua vao khoa cho fruoc7
VIoc fm kIom phan fu fhoo khoa, nou duoc phop, Ia hoan foan nhu nhau
doI voI baf ky khoa nao, hay phu fhuoc vao fhu fu khI fhom vao, hay phu
fhuoc vao fan suaf ma khoa duoc fruy xuaf7

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 8/16

Mof dac fa cho mof kIou du IIou fruu fuong hoan foan co fho co nhIou cach
hIon fhuc khac nhau. MoI cach hIon fhuc mang IaI fnh kha fhI va fnh hIou qua
khac nhau. Iou nay phu fhuoc vao you cau vo fhoI gIan va khong gIan cua baI
foan. Nhung can nhan manh rang, moI cach hIon fhuc cua mof kIou du IIou fru u
fuong dou Iuon frung fhanh voI dac fa ban dau vo cac chuc nang cua no.

NhIom vu cua chung fa frong vIoc hIon fhuc CTI frong C++ Ia baf dau fu
nhung khaI nIom, fhuong Ia djnh nghIa cua mof AT, sau do fInh cho dan do co
duoc hIon fhuc bang mof Iop frong C++. Cac phuong fhuc cua Iop frong C++ fuong
ung mof cach fu nhIon voI cac fhao fac du IIou fron AT, frong khI nhung fhanh
phan du IIou cua Iop frong C++ fuong ung voI CTI vaf Iy ma chung fa chon do
bIou dIon AT.
1.5. Mot so nguyen tuc vu phuong phup de hoc tot mon CTOL vu gu
thuut
1.5.1. Cuch tep cun vu phuong huong suy nghI tIch cuc
MoI CTI dou duoc frnh bay fhoo dung cac buoc sau day:
jnh nghIa Iop.
ac fa Iop.
Phan fch cac phuong an hIon fhuc.
HIon fhuc Iop.

Luu y rang, su truu tuong oa Jac ta Ju /icu pbai /uon Ji truoc su /ua cbon
cacb tbuc to cbuc /uu tru Ju /icu oa cacb bicn tbuc cbung.

Trong phan djnh nghIa va dac fa Iop, do co fho hIou sau van do va cam fhay
hung fhu hon, sInh vIon non fu xom mnh Ia mof frong nhung nguoI fham gIa vao
cong vIoc fhIof ko. V chuc nang cua Iop hoan foan phu fhuoc vao quan dIom cua
nguoI fhIof ko. Nou chung fa gIoI han cho moI Iop CTI mof so chuc nang fhao
fac du IIou co ban nhaf, chung fa co mof fhu vIon gon nho. Nguoc IaI, fhu vIon so
raf Ion, nhung nguoI Iap frnh co fho goI fhuc hIon baf cu cong vIoc nao ma ho
muon fu nhung phuong fhuc da co san cua moI Iop. Thu vIon cac Iop CTI frong
VC++ Ia mof mInh hoa cho fhay moI Iop CTI co san raf nhIou phuong fhuc dap
ung duoc nhu cau cua nhIou nguoI dung khac nhau.
Cac phuong fhuc duoc dac fa ky cang cho moI Iop frong gIao frnh nay cung
chI Ia do mInh hoa. SInh vIon co fho fu y chon Iua do dac fa mof so phuong fhuc
bo sung khac fhoo y muon.

Truoc khI fm hIou cac phuong an hIon fhuc duoc frnh bay frong gIao frnh
danh cho moI Iop CTI, sInh vIon cung non fu phac hoa fhoo suy nghI cua rIong
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 9/16
ban fhan mnh. VoI cach chu dong nhu vay, sInh vIon so do dang nhn ra cac uu
nhuoc dIom frong fung phuong an. Va nou co duoc nhung y fuong hoan foan moI
mo so voI nhung g duoc frnh bay frong gIao frnh, sInh vIon so fu fIn hon khI
can gIaI quyof cac baI foan. Nhung CTI nham phuc vu cho cac baI foan Ion doI
khI duoc hnh fhanh fu su ghop noI cua mof so CTI don gIan. Chnh su ghop
noI nay Iam nay sInh vo van phuong an khac nhau ma chung fa phaI chon Iua
fhaf fhan frong, do bao dam fnh kha fhI va hIou qua cua chuong frnh. Mof khI
gap mof baI foan can gIaI quyof, nou sInh vIon bIof chon cho mnh nhung phuong
an ghop noI cac CTI don gIan, bIof cach su dung IaI nhung g da co frong fhu
vIon, va bIof cach Iam fho nao do hIon fhuc bo sung nhung g fhuoc vo nhung y
fuong moI mo vua nay sInh, xom nhu sInh vIon da hoc fof mon CTI va gIaI
fhuaf.

So voI nhIou gIao frnh khac, gIao frnh nay fach rIong phan ung dung cac
CTI nham Iam gon nho hon cho phan II Ia phan chI frnh bay vo cac CTI.
Nhu vay so fhuan fIon hon cho sInh vIon frong vIoc fm hIou nhung phan can ban
hay Ia fra cuu mo rong kIon fhuc. Hon nua, co nhIou ung dung IIon quan don
nhIou CTI khac nhau.

1.5.2. Cuc nguyen tuc
1. Truoc khI hIon fhuc baf ky mof Iop CTI nao, chung fa can chac chan rang
chung fa da djnh nghIa CTI va dac fa cac fac vu cho no mof cach fhaf day
du. Co nhu vay moI bao dam duoc rang:
Chung fa da hIou vo no mof cach chnh xac.
Trong khI hIon fhuc chung fa khong phaI quay IaI sua doI cac dac fa cua
no, v vIoc sua doI nay co fho Iam cho chung fa maf phuong huong, CTI
so khong con dung nhu nhung y fuong ban dau ma chung fa da du djnh
cho no.
Cac chuong frnh ung dung khong can phaI duoc chInh sua mof khI da su
dung CTI nay.
Nou chung fa cung cap nhIou hIon fhuc khac nhau cho cung mof CTI,
fh khI doI sang su dung mof hIon fhuc khac, chuong frnh ung dung
khong doI hoI phaI duoc chInh sua IaI. Cac hIon fhuc khac nhau cua cung
mof CTI Iuon co cung mof gIao dIon fhong nhaf.

2. MoI phuong fhuc cua Iop Iuon co nam phan mo fa |kIou fra vo, fhong so vao/
ra, prcconJition, postconJition, uscs)

ay Ia you cau chung frong vIoc Iap faI IIou cho mof ham. Cac CTI cua
chung fa so duoc su dung frong raf nhIou ung dung khac nhau. o do chung
fa can xay dung sao cho nguoI Iap frnh bof duoc moI cong suc co fho. IoI
khuyon o day Ia: phan prcconJition chI nham gIaI fhch y nghIa cac fhong so
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 10/16
vao, chu khong non rang buoc nhung frj hop Io ma fhong so vao phaI fhoa.
NhIom vu frong phan hIon fhuc cua phuong fhuc Ia chung fa phaI Iuong hof
moI kha nang co fho co cua fhong so va o va gIaI quyof fhoa dang fung fruong
hop.

Cbung ta xcm cac CTDL cung nbu cac Jjcb ou, cbung Juoc oict mot
/an oa Juoc su Jung trong rat nbicu ung Jung kbac nbau. Do Jo CTDL
can Juoc xay Jung sao cbo nguoi su Jung bot Juoc cong suc moi /uc co
tbc.
Cac pbuong tbuc pub/ic cua cac CTDL ncn Juoc bicn tbuc kbong co
prcconJition.

3. am bao fnh dong kn |cncapsu/ation) cua Iop CTI. u IIou co fnh dong
kn khI chung chI co fho duoc fruy xuaf boI cac phuong fhuc cua Iop.

!u dIom cua vIoc su dung mof Iop co fnh dong kn Ia khI chung fa dac fa
va hIon fhuc cac phuong fhuc, chung fa khong phaI Io Iang don cac gIa frj
khong hop Io cua cac du IIou dang duoc Iuu frong doI fuong cua Iop.

Cac tbanb pban Ju /icu cua CTDL ncn Juoc kbai bao prioatc.

4. NgoaI fru cac constructor co chu dch, moI doI fuong cua CTI Iuon phaI
duoc khoI fao Ia mof doI fuong rong va chI duoc sua doI boI chnh cac
phuong fhuc cua Iop. VoI cac phuong fhuc da duoc hIon fhuc va kIom fra ky
Iuong, chung fa Iuon an fam rang cac doI fuong CTI Iuon chua nhung du
IIou hop Io. Iou nay gIup chung Iuon hoan fhanh nhIom vu duoc gIao, va do
cung Ia nguyon fac cua huong doI fuong.

1.5.3. Phong cuch lup trInh (style of programming) vu cuc ky nung:
1. Van do xu Iy IoI:
VIoc xu Iy IoI cung cap mof muc do an foan can fhIof ma chung fa non
fhuc hIon moI Iuc co fho frong CTI cua chung fa. Co vaI cach khac nhau
frong vIoc xu Iy IoI. Chang han chung fa co fho In ra fhong bao hoac ngung
chuong frnh khI gap IoI. Hoac fhay vao do, chung fa danh vIoc xu Iy IoI IaI
cho nguoI Iap frnh su dung CTI cua chung fa bang cach fra vo cac ma IoI
fhong qua frj fra vo cua cac phuong fhuc. Cach cuoI cung nay hay hon v no
cung cap kha nang Iua chon cho nguoI Iap frnh. Co nhung fnh huong ma
nguoI Iap frnh fhay can fhIof phaI ngung ngay chuong frnh, nhung cung co
nhung fnh huong IoI co fho bo qua do chuong frnh fIop fuc chay. ang cach
nay, nguoI Iap frnh khI su dung cac CTI hoan foan co fho chu dong doI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 11/16
pho voI moI fnh huong. Hon nua, cac CTI cua chung fa so duoc xay dung
nhu Ia cac fhu vIon dung chung cho raf nhIou chuong frnh.

Kbi su Jung mot pbuong tbuc cua mot /op CTDL, nguoi /ap trnb can
pbai xcm xct /ai ma /oi ma pbuong tbuc tra oc Jc xu /y /oi kbi can tbict.
Cac /op CTDL can pbai Juoc tbict kc sao cbo co tbc cbo pbcp nguoi /ap
trnb cbon /ua cacb tbuc xu /y /oi tbco y muon.

Chung fa so dung khaI bao ErrorCode nhu mof kIou du IIou kIou IIof ko
fap cac frj fuong ung cac fnh huong co fho xay ra khI mof phuong fhuc cua
mof Iop duoc goI: fhanh cong hay fhaf baI, fran bo nho, frj fhong so khong
hop Io, Chung fa so co gang fhIof ko mof cach fhaf nhaf quan: hau hof cac
phuong fhuc cua cac Iop fra vo kIou ErrorCode nay.

8u nbat quan bao gio cung tao ra tboi qucn rat tot trong pbong cacb
/ap trnb. icu nay tict kicm rat nbicu cong suc oa tboi gian cua nguoi /ap
trnb.

2. Cach fruyon nhan du IIou gIua doI fuong CTI voI chuong frnh su dung

Cac gIao fIop fruyon nhan du IIou khac gIua chuong frnh su dung va cac
Iop CTI dI nhIon cung fhong qua danh sach cac fhong so. Trong phuong
fhuc cua Iop CTI so khong co vIoc cho nhan du IIou fruc fIop fu ban phm.
Chung fa non danh cho nguoI Iap frnh quyon chuyon huong dong nhap xuaf
du IIou voI cac fhIof bj bon ngoaI nhu ban phm, man hnh, fap fIn, may In,

3. Van do kIou cua du IIou duoc Iuu frong CTI.

MoI Iop CTI ma chung fa xay dung dou co fnh fong quaf cao, no co fho
chap nhan baf ky mof kIou du IIou nao cho du IIou duoc Iuu frong no. Trong
C++ fu khoa template cho phop chung fa Iam dIou nay. Cac kIou du IIou nay
fhuong duoc you cau phaI co san mof so fhao fac can fhIof nhu so sanh,
nhap, xuaf,

4. Cac khaI bao bon frong mof Iop CTI.

Iop CTI cung cap cac fhao fac du IIou fhong qua cac phuong fhuc duoc
khaI bao Ia public.
Taf ca nhung fhuoc fnh va cac ham con IaI Iuon duoc khaI bao private
hoac protected.
Cac fhuoc fnh cua mof Iop CTI co fho duoc phan Iam haI IoaI:
Thuoc fnh baf buoc phaI co do Iuu du IIou.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 12/16
Thuoc fnh ma doI fuong can co do fu quan Iy, frong so nay co fhuoc fnh
duoc bo sung chI do day nhanh foc do cua cac fhao fac du IIou.

Cac ham duoc cho dau bon frong Iop duoc goI Ia cac ham phu fro |auxIIary
funcfIon), chung chI duoc su dung boI chnh cac phuong fhuc cua Iop CTI
do ma fhoI.

VIoc mo rong fhom cac fac vu cho mof Iop co san co fho fhoo mof frong
haI cach:
o sung fhom phuong fhuc moI.
Xay dung Iop fhua ko.

5. Mof so huong dan can fhIof frong vIoc fhu nghIom chuong frnh.

9 o chuong frnh fhu |Jriocr): ay Ia doan chuong frnh fhuong duoc vIof
frong ham main va chua mof fhuc don |mcnu) cho phop fhu moI phuong
fhuc cua Iop CTI dang duoc xay dung.
Chung fa so vIof, fhu nghIom, va hoan chInh nhIou Iop CTI khac nhau.
o do ngay fu dau chung fa non xay dung mof drIvor sao cho fong quaf, khI
can fhu voI mof CTI nao do chI can chInh sua IaI doI chuf ma fhoI.
Trong drIvor chung fa non chuan hoa vIoc doc ghI fap fIn, xu Iy cac fhao
fac doc fu ban phm va xuaf ra man hnh. Phan con IaI Ia mof monu cho
phop nguoI su dung chay chuong frnh chon cac chuc nang nhu fao doI
fuong CTI moI, goI cac fhao fac fhom, xoa, fm kIom, fruy xuaf, fron
CTI do.

9 Cac mau fam |stub): day Ia mof moo nho nhung raf huu ch. o djch va
chay fhu mof vaI phan nho da vIof, nhung phan chua vIof cua chuong frnh
so duoc fao nhu nhung mau nho va chI can hop cu phap |Xom ung dung
fnh foan cac da fhuc frong chuong 15).
Vi Ju: Trong doan chuong frnh nao do chung fa dang muon chay fhu ma
co su dung Iop A, ham ,, chung fa so fam khaI bao cac stub:
cIass A
{
l; // Mof Iop chua co fhuoc fnh v chung fa chua quyof djnh non chon
kIou fhuoc fnh nhu fho nao.
voId |)
{
l // Mof ham voI fhan ham con rong ma chung fa hon so vIof sau.

Nou mof ham da co djnh nghIa fh chI can fra vo sao cho hop Io:

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 13/16
Inf C|)
{
rofurn 1;
l // chI can can fhan frong fruong hop nou nhu gIa frj fra vo IaI duoc
dung frong mof bIou fhuc Iuan Iy do xof dIou kIon Iap vong fh co
kha nang vong Iap khong duoc fhuc hIon hoac Iap vo fan.

9 Cach fhuc fhoo doI mof chuong frnh dang chay hoac nhu cau khao saf cach
Iam vIoc cua mof frnh bIon djch nao do:
V du goI y:
voId |)
{
counf << `n Ham dang duoc goI `n;
l
Trong C++ cac ham constructor va Jcstructor duoc frnh bIon djch goI khI
mof doI fuong vua duoc fao ra hoac sap bj huy. Vay nou co fhac mac vo fhu
fu goI cac ham nay cua mof Iop fhua ko fu Iop khac, chung fa co fho dung
cach fuong fu do vIof frong constructor va Jcstructor cua fung Iop cha, con.

Nou chung fa co fhac mac vo cach ung xu cua frnh bIon djch khI goI cac
ham nay hay cac ham duoc djnh nghIa do |oocr/oaJcJ, oocruritcn) frong
fruong hop cac Iop fhua ko Ian nhau, hoac mof so fruong hop khac nao do,
fh day Ia cach hay nhaf do chung fa fu kIom nghIom Iay.

Phan Ion cac gIaI fhuaf duoc nghIon cuu fruoc hof chI dua fron y fuong
|bIou dIon bang ngon ngu gIa va doc Iap voI moI ngon ngu Iap frnh). Tuy
nhIon khI hIon fhuc chung fa fhuong gap vuong mac o cho moI ngon ngu
Iap frnh co mof so dac dIom khac nhau, va ngay ca khI dung chung mof
ngon ngu, cac frnh bIon djch khac nhau |khac hang san xuaf hay khac
phIon ban) doI khI cung ung xu khac nhau. Iou do gay raf nhIou kho khan
va Iang ph fhoI gIan cua nhIou sInh vIon.

ChI can Iay mof v du don gIan, do Ia vIoc doc ghI fIIo, vIoc fhuong xuyon
phaI can don khI muon fhu nghIom mof gIaI fhuaf nao do. Cac vong Iap
fhuong nham Ian o dIou kIon kof fhuc fIIo frong ngon ngu C++, ma dIou
nay hoan foan phu fhuoc vao vIoc xu Iy con fro fIIo cua frnh bIon djch.
Ngay mof phan mom nhu VIsuaI C++ hIon faI cung chua cung Iuc frong fhu
vIon khong bIof bao nhIou Iop phuc vu cho vIoc khaI bao va doc ghI fIIo.
Chung fa chI co fho su dung mof frong cac fhu vIon do mof cach chnh xac
sau khI da fm hIou fhaf ky! Mof v du khac cung hay gay nhung IoI maf
raf nhIou fhoI gIan, do Ia vIoc so sanh cac frj: N!II, 0, `0, 0, ma nou
khong khao saf ky chung fa so bj fra gIa boI su chu quan cho rang mnh da
hIou dung quy uoc cua frnh bIon djch.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 14/16

VIoc fm doc faI IIou kom fhoo frnh bIon djch Ia mof vIoc Iam can fhIof, no
cho chung fa su hIou bIof day du va chnh xac. Nhung do ruf ngan fhoI gIan
fh goI y fron day cung Ia mof IoI khuyon quy bau. Khong g nhanh va
chnh xac bang cach fm cau fra IoI frong fhu nghIom. VIoc sua doI chuong
frnh nhu fho nao do co duoc cac stub fhoa nhung nhu cau can fhu nghIom
Ia fuy fhuoc vao su fch cuc, say mo va sang fao cua sInh vIon.

9 Co roI chuong frnh |Jcbug)
ay Ia kha nang fhoo vof chuong frnh o nhung doan ma nguoI Iap frnh
con nghI ngo co IoI. af cu nguoI Iap frnh nao cung co Iuc can phaI chay
dobug. V vay fof hon hof Ia ngay fu dau sInh vIon non fm hIou ky cac kha
nang cua cong cu dobug cua frnh bIon djch ma mnh su dung |cho phop
fhoo doI frj cac bIon, Ijch su cac Ian goI ham,).

Mof goI y frong phan nay Ia sInh vIon can bIof cach co Iap fung phan cua
chuong frnh da vIof bang cach dung ky hIou danh cho phan chu fhch
|commcnt) do khoa bof nhung phan chua don Iuof kIom fra. Hoac khI IoI do
frnh bIon djch bao co vo mo ho, fh cach co Iap bang cach gIoI han dan
doan chuong frnh dang djch fhu so gIup chung fa som xac djnh duoc pham
vI co IoI. Cung co fho Iam nguoc IaI, chI djch fhu va chInh sua fung doan
chuong frnh nho, cho don khI hof IoI moI noI dan pham vI chuong frnh do
djch fIop.
1.6. Go theu ve ngon ngu gu:
Phan Ion chuong frnh duoc frnh bay frong gIao frnh nay dou su dung ngon
ngu C++, sau khI y fuong vo gIaI fhuaf da duoc gIaI fhch can ko. Phan con IaI co
mof so gIaI fhuaf duoc frnh bay bang ngon ngu gIa.

Ngon ngu gIa, hay con goI Ia ma gIa |pscuJocoJc), Ia mof cach bIou dIon doc
Iap voI moI ngon ngu Iap frnh, no khong rang buoc sInh vIon vao nhung cu phap
nghIom ngaf cung nhu cach goI sao cho chnh xac cac fu khoa, cac ham co frong
fhu vIon mof frnh bIon djch nao do. Nho do sInh vIon co fho fap frung vao y
fuong Ion cua gIaI fhuaf.

Cuc quy d{nh ve mu gu duoc su dung trong guo trInh nuy:

Iou dIon su fuan fu cua cac Ionh chuong frnh: cac Ionh duoc fhuc fhI fuan fu
Ionh nay sang Ionh khac so co cung khoang cach canh Io nhu nhau va duoc
danh so fhu fu fang dan, Iuon baf dau fu 1.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 15/16
Cau fruc khoI Iong nhau: mof khoI nam frong mof khoI khac so co khoang
cach canh Io Ion hon.

Trong gIao frnh nay, chI nhung phan duoc frnh bay bang ma gIa moI co so
fhu fu o dau moI dong Ionh.
Vi Ju:
1.
1.
2.
1. // ay Ia dong Ionh co so fhu fu Ia 1.2.1
2.
3.
2.
1.
3.
1.
2.

Su ro nhanh: chung fa su dung cac fu khoa:
if <bIou fhuc Iuan Iy>

endif
if <bIou fhuc Iuan Iy>

else

endif
case
case1:
case2:
case3:
else:
endcase

Su Iap vong:
loop <bIou fhuc Iuan Iy>

endloop // Iap frong khI bIou fhuc Iuan Iy con dung.
repeat

until <bIou fhuc Iuan Iy> // Iap cho don khI bIou fhuc Iuan Iy
dung.



Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 1. Gioi tbicu
Giao trnb Cau truc Ju /icu oa Giai tbuat 16/16

KhaI bao ham:
<kIou fra vo> fon ham |danh sach fhong so)
frong do danh sach fhong so: val/ ref <fon kIou> fon fhong so, vaI/ rof
<fon kIou> fon fhong so,
val: danh cho fham frj; ref: danh cho fham bIon.

KhaI bao cau fruc, Iop:
struct fon kIou du IIou cau fruc
end struct

cIass fon kIou du IIou cau fruc
end class

KhaI bao phuong fhuc cua Iop:
<kIou fra vo> fon Iop::fon ham |danh sach fhong so);

KhaI bao bIon:
<fon kIou> fon bIon













Mot chut lu y ve cach trnh bay trong giao trnh:

o cac doan chuong frnh su dung jont chu Courier New, non cac fon bIon,
fon Iop, fon doI fuong, fon cac ham khI duoc nhac don cung dung jont chu nay.
Cac fu fIong Anh khac duoc In nghIong. ac bIof nhung phan co IIon quan chaf
cho don nhung dac fhu cua ngon ngu Iap frnh C++ fhuong dung kch co chu nho
hon, do phan bIof voI nhung phan quan frong khac khI noI vo y fuong va gIaI
fhuaf, va do moI Ia muc dch chnh cua mon hoc nay.
Co mof so fu hay doan duoc In dam hay gach duoI nham gIup sInh vIon doc do
dang hon.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 17
Phan 2 CAC CA TRC O LK

Chng 2 NGAN XKP

Chung fa so fm hIou mof CTI don gIan nhaf, do Ia ngan xop. Mof cach nhaf
quan nhu phan gIoI fhIou mon hoc da frnh bay, moI CTI dou duoc xay dung
fhoo dung frnh fu:
jnh nghIa.
ac fa.
Phan fch cac phuong an hIon fhuc.
HIon fhuc.
2.1. O{nh nghIu ngun xep
VoI djnh nghIa danh sach frong chuong mo dau, chung fa hIou rang frong
danh sach, moI phan fu, ngoaI fru phan fu cuoI, dou co duy nhaf mof phan fu
dung sau no. Ngan xop Ia mof fruong hop cua danh sach, duoc su dung frong cac
ung dung co IIon quan don su dao nguoc. Trong CTI ngan xop, vIoc fhom hay
Iay du IIou chI duoc fhuc hIon faI mof dau. u IIou fhom vao fruoc so Iay ra sau,
fnh chaf nay con duoc goI Ia vao fruoc ra sau |First In Last Out - IIIO).
au fhom hay Iay du IIou cua ngan xop con goI Ia dInh |top) cua ngan xop.



HInh 2.1- Thom phan fu vao va Iay phan fu ra khoI ngan xop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 18
Vay chung fa co djnh nghIa cua ngan xop duoI day, khong khac g doI voI djnh
nghIa danh sach, ngoaI fru cach fhuc ma ngan xop cho phop fhay doI hoac fruy
xuaf don cac phan fu cua no.

jnb ngba. Mot ngan xcp cac pban tu kicu T /a mot cbuoi noi ticp cac pban
tu cua T, kcm cac tac ou sau.
1. Tao mot Joi tuong ngan xcp rong.
2. ay (push mot pban tu moi oao ngan xcp, gia su ngan xcp cbua Jay (pban
tu Ju /icu moi /uon Juoc tbcm tai Jlnb.
J. Lay (pop mot pban tu ra kboi ngan xcp, gia su ngan xcp cbua rong (pban
tu bj /oai /a pban tu Jang nam tai Jlnb.
4. Xcm pban tu tai Jlnb ngan xcp (top.

Iuu y rang djnh nghIa nay khong quan fam don cach hIon fhuc cua kIou du
IIou fruu fuong ngan xop. Chung fa so fm hIou mof vaI cach hIon fhuc khac nhau
cua ngan xop va faf ca chung dou phu hop voI djnh nghIa nay.
2.2. Ouc tu ngun xep
NgoaI cac fac vu chnh fron, cac phuong fhuc khac co fho bo sung fuy vao nhu
cau ma chung fa fhay can fhIof:
+ empty: cho bIof ngan xop co rong hay khong.
+ full: cho bIof ngan xop co day hay chua.
+ clear: xoa sach faf ca du IIou va Iam cho ngan xop fro non rong.

Chung fa Iuu y rang, khI fhIof ko cac phuong fhuc cho moI Iop CTI, ngoaI
mof so phuong fhuc chnh do fhom vao hay Iay du IIou ra, chung fa co fho bo sung
fhom nhIou phuong fhuc khac. VIoc fhom dua vao quan nIom cua moI nguoI vo su
fIon dung cua Iop CTI do. Nhung dIou dac bIof quan frong o day Ia cac phuong
fhuc do khong fho mau fhuan voI djnh nghIa ban dau cung nhu cac chuc nang ma
chung fa da djnh ra cho Iop. Chang han, frong fruong hop ngan xop cua chung fa,
do bao dam quy Iuaf Vao fruoc ra sau fh fraf fu cua cac phan fu frong ngan xop
Ia raf quan frong. Chung fa khong fho cho chung mof phuong fhuc co fho fhay doI
fraf fu cua cac phan fu dang co, hoac phuong fhuc Iay mof phan fu faI mof vj fr
baf ky nao do cua ngan xop.

Tron day Ia nhung phuong fhuc IIon quan don cac fhao fac du IIou fron ngan
xop.

oI voI baf ky Iop CTI nao, chung fa cung khong fho khong xom xof don haI
phuong fhuc cuc ky quan frong: do chnh Ia haI ham dung Iop va huy Iop:
constructor va destructor. Trong C++ cac ham constructor va Jcstructor duoc
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 19
frnh bIon djch goI khI mof doI fuong vua duoc fao ra hoac sap bj huy. Chung fa
can bao dam cho moI doI fuong CTI duoc fao ra co frang fhaI ban dau Ia hop Io.
Su hop Io nay so fIop fuc duoc duy fr boI cac phuong fhuc fhao fac du IIou bon
fron.

Trang fhaI ban dau hop Io Ia frang fhaI rong khong chua du IIou nao hoac
frang fhaI da chua mof so du IIou fhoo nhu mong muon cua nguoI Iap frnh su
dung CTI. Nhu vay, moI Iop CTI Iuon co mof constructor mac djnh |khong co
fhong so) do fao doI fuong rong, cac constructor co fhong so khac chung fa co fho
fhIof ko bo sung nou fhay hop Iy va can fhIof.

Mof doI fuong CTI khI bj huy phaI dam bao khong do IaI rac frong bo nho.
Chung fa da bIof rang, voI cac bIon cap phaf fInh, frnh bIon djch so fu Iay IaI
nhung vung nho da cap phaf cho chung. VoI cac bIon cap phaf dong fh nguoc IaI,
vung nho phaI duoc chuong frnh gIaI phong khI khong con su dung don. Nhu
vay, doI voI moI phuong an hIon fhuc cu fho cho moI Iop CTI ma co su dung
vung nho cap phaf dong, chung fa so xay dung Jcstructor cho no do Io vIoc gIaI
phong vung nho fruoc khI doI fuong bj huy.

Trong C++, constructor co cung fon voI Iop va khong co kIou fra vo. Constructor cua mof Iop
duoc goI mof cach fu dong khI mof doI fuong cua Iop do duoc khaI bao.

ac fa constructor cho Iop ngan xop, ma chung fa daf fon Ia Iop Stack, nhu
sau:
template <class Entry>
Stack<Entry>::Stack();
pre: khong co.
post: doI fuong ngan xop vua duoc fao ra Ia rong.
uses: khong co.

o dac fa fIop cho cac phuong fhuc khac, chung fa chon ra cac frj cua
ErrorCode du do su dung cho Iop Stack Ia:
success, overflow, underflow
Cac fhong so danh cho cac phuong fhuc duoI day duoc fhIof ko fuy vao chuc nang
va nhu cau cua fung phuong fhuc.

Phuong fhuc IoaI mof phan fu ra khoI ngan xop:
template <class Entry>
ErrorCode Stack<Entry>::pop();
pre: khong co.
post: nou ngan xop khong rong, phan fu faI dInh ngan xop duoc Iay dI, ErrorCode fra vo Ia
success; nou ngan xop rong, ErrorCode fra vo Ia underflow, ngan xop khong doI.
uses: khong co.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 20
Phuong fhuc fhom mof phan fu du IIou vao ngan xop:
template <class Entry>
ErrorCode Stack<Entry>::push(const Entry &item);
pre: khong co.
post: nou ngan xop khong day, item duoc fhom vao fron dInh ngan xop, ErrorCode fra vo Ia
success; nou ngan xop day, ErrorCode fra vo Ia overflow, ngan xop khong doI.
uses: khong co.
Iuu y rang item frong fhong so cua push dong vaI fro Ia fham frj non duoc
khaI bao Ia fham chIou hang |const rcjcrcncc). Trong khI do frong phuong fhuc
top, item Ia fham bIon.

HaI phuong fhuc top va empty duoc khaI bao const v chung khong Iam fhay
doI ngan xop.
template <class Entry>
ErrorCode Stack<Entry>:: top(Entry &item) const;
pre: khong co
post: nou ngan xop khong rong, phan fu faI dInh ngan xop duoc chop vao item, ErrorCode fra
vo Ia success; nou ngan xop rong, ErrorCode fra vo Ia underflow; ca haI fruong hop
ngan xop dou khong doI.
uses: khong co.

template <class Entry>
bool Stack<Entry>::empty() const;
pre: khong co
post: nou ngan xop rong, ham fra vo true; nou ngan xop khong rong, ham fra vo false, ngan
xop khong doI.
uses: khong co.
SInh vIon co fho dac fa fuong fu cho phuong fhuc full, clear, hay cac
phuong fhuc bo sung khac.
Tu nay vo sau, chung fa quy uoc rang nou haI phan prcconJition hoac uscs khong
co fh chung fa khong can phaI ghI ra.

Chung fa co phan gIao fIop ma Iop Stack danh cho nguoI Iap frnh su dung
nhu sau:
template<class Entry>
class Stack {
public:
Stack();
bool empty() const;
ErrorCode pop();
ErrorCode top(Entry &item) const;
ErrorCode push(const Entry &item);
};
VoI mof dac fa nhu vay chung fa da hoan foan co fho su dung Iop Sfack frong
cac ung dung. SInh vIon non fIop fuc xom don phan frnh bay cac ung dung vo
ngan xop frong chuong 14. uoI day Ia chuong frnh mInh hoa vIoc su dung ngan
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 21
xop fhong qua cac dac fa fron. Chuong frnh gIaI quyof baI foan In cac so fhoo fhu
fu nguoc voI fhu fu nhap vao da duoc frnh bay frong phan mo dau.

Vi Ju:
Chuong frnh so doc vao mof so nguyon n va n so fhuc ko do. MoI so fhuc
nhap vao so duoc Iuu vao ngan xop. CuoI cung cac so duoc Iay fu ngan xop va In
ra.
#include <Stack> //Su dung Iop Stack.
int main()
/*
pre: NguoI su dung nhap vao mof so nguyon n va n so fhuc.
post: Cac so so duoc In ra fhoo fhu fu nguoc.
uses: Iop Stack va cac phuong fhuc cua Stack.
*/
{
int n;
double item;
Stack<double> numbers;
cout <<"Type in an integer n followed by n decimal numbers."<< endl;
cout << " The numbers will be printed in reverse order." << endl;
cin >> n;

for (int i = 0; i < n; i++) {
cin >> item;
numbers.push(item);
}

cout << endl << endl;
while (!numbers.empty()) {
numbers.top(item)
cout << item << " ";
numbers.pop();
}
cout << endl;
}

Che duu thong tn: khI su dung Iop Stack chung fa khong can bIof no duoc Iuu
fru frong bo nho nhu fho nao va cac phuong fhuc cua no hIon fhuc ra sao. ay Ia
van do cho dau fhong fIn |injormation biJing).
Mof CTI co fho co nhIou cach hIon fhuc khac nhau, nhung moI cach hIon
fhuc dou co chung phan dac fa cac gIao fIop doI voI bon ngoaI. Nho do ma cac
chuong frnh ung dung gIu duoc su doc Iap voI cac hIon fhuc khac nhau cua cung
mof Iop CTI. KhI can fhay doI hIon fhuc cua CTI ma ung dung dang su dung,
chung fa khong can chInh sua ma nguon cua ung dung.

TInh khu th vu heu quu cuu ung dung: Tuy ung dung can phaI doc Iap voI
hIon fhuc cua cau fruc du IIou, nhung vIoc chon cach hIon fhuc nao anh huong don
fnh kha fhI va hIou qua cua ung dung. Chung fa can hIou cac uu nhuoc dIom cua
moI cach hIon fhuc cua cau fruc du IIou do Iua chon cho phu hop voI fnh chaf cua
ung dung.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 22

TInh trong sung cuu chuong trInh: !u dIom khac cua cho dau fhong fIn Ia
fnh frong sang cua chuong frnh. Nhung fon goI quon fhuoc danh cho cac fhao
fac fron cau fruc du IIou gIup chung fa hnh dung ro rang gIaI fhuaf cua chuong
frnh. Chang han voI fhao fac fron ngan xop, nguoI fa fhuong quon dung cac fu:
push day vao ngan xop, pop Iay ra khoI ngan xop.

Thet ke tu tren xuong: Su fach roI gIua vIoc su dung cau fruc du IIou va cach
hIon fhuc cua no con gIup chung fa fhuc hIon fof hon qua frnh fhIof ko fu fron
xuong |top-Joun Jcsign) ca cho cau fruc du IIou va ca cho chuong frnh ung dung.
2.3. Cuc phuong un hen thuc ngun xep
Trong phan nay chung fa so fm hIou cac phuong an hIon fhuc cho Iop ngan
xop. Cac uu nhuoc dIom cua cac cach hIon fhuc khac nhau doI voI mof dac fa
CTI fhuong IIon quan don nhung van do sau day:
Cho phop hay khong cho phop Iuu fru va fhao fac voI Iuong du IIou Ion.
Toc do xu Iy cua cac phuong fhuc.

V ngan xop Ia mof fruong hop dac bIof cua danh sach, non da don Iuc chung
fa ban don cach Iuu fru cac phan fu frong mof danh sach. Co haI phuong an Iuu
fru chnh:
Cac phan fu nam ko nhau frong bo nho ma chung fa hay dung fu IIon fuc
|contiguous) do noI don.
Cac phan fu khong nam ko nhau frong bo nho ma chung fa dung cong cu Ia
cac bIon kIou con fro |pointcr) do quan Iy, fruong hop nay chung fa goI Ia
danh sach IIon kof |/inkcJ /ist).

HIon fhuc IIon fuc don gIan nhung bj han cho o cho kch fhuoc can duoc bIof
fruoc. Nou dung mang Ion qua so bj Iang ph, nhung nho qua do bj day. HIon fhuc
IIon kof IInh dong hon, no chI bj day khI bo nho fhuc su khong con cho frong nua.
2.4. Hen thuc ngun xep
2.4.1. Hen thuc ngun xep len tuc
o hIon fhuc Iop ngan xop IIon fuc |contiguous stack), chung fa dung mof
mang |array frong C++) do chua cac phan fu cua ngan xop va mof fhuoc fnh
count cho bIof so phan fu hIon co frong ngan xop.

const int max = 10; // ung so nho do kIom fra chuong frnh.
template <class Entry>
class Stack {
public:
Stack();
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 23
bool empty() const;
ErrorCode pop();
ErrorCode top(Entry &item) const;
ErrorCode push(const Entry &item);
private:
int count;
Entry entry[max];
};

Push, pop, vu cuc phuong thuc khuc
Y fuong chung cua cac phuong fhuc nay nhu sau:
VIoc fhom du IIou moI chI fhuc hIon duoc khI ngan xop con cho frong.
VIoc IoaI phan fu khoI ngan xop hoac xom phan fu fron dInh ngan xop chI
fhuc hIon duoc khI ngan xop khong rong.
o count Ia so phan fu hIon co frong ngan xop va chI so cua array frong
C++ duoc baf dau fu 0, non count-1 chnh Ia chI so cua phan fu faI dInh
ngan xop khI can xom hoac can IoaI bo khoI ngan xop.
KhI can fhom phan fu moI, count Ia chI so chI don vj fr con frong ngay
fron dInh ngan xop, cung Ia chI so cua phan fu moI nou duoc fhom vao.
KhI ngan xop duoc fhom hoac Iay phan fu fh fhuoc fnh count Iuon phaI
duoc cap nhaf IaI.
Constructor fao doI fuong ngan xop rong bang cach gan fhuoc fnh count
bang 0. Iuu y rang chung fa khong can quan fam don frj cua nhung phan
fu nam fu vj fr count cho don hof mang (max -1), cac vj fr fu 0 don
count-1 moI fhuc su chua nhung du IIou da duoc dua vao ngan xop.

template <class Entry>
ErrorCode Stack<Entry>::push(const Entry &item)
/*
post: nou ngan xop khong day, item duoc fhom vao fron dInh ngan xop, ErrorCode fra vo Ia
success; nou ngan xop day, ErrorCode fra vo Ia overflow, ngan xop khong doI.
*/
{
ErrorCode outcome = success;
if (count >= max)
outcome = overflow;
else
entry[count++] = item;
return outcome;
}

template <class Entry>
ErrorCode Stack<Entry>::pop()
/*
post: nou ngan xop khong rong, phan fu faI dInh ngan xop duoc Iay dI, ErrorCode fra vo Ia
success; nou ngan xop rong, ErrorCode fra vo Ia underflow, ngan xop khong doI.
*/
{
ErrorCode outcome = success;
if (count == 0)
outcome = underflow;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 24
else --count;
return outcome;
}


template <class Entry>
ErrorCode Stack<Entry>::top(Entry &item) const
/*
post: nou ngan xop khong rong, phan fu faI dInh ngan xop duoc chop vao item, ErrorCode fra
vo Ia success; nou ngan xop rong, ErrorCode fra vo Ia underflow; ca haI fruong hop
ngan xop dou khong doI.
*/
{
ErrorCode outcome = success;
if (count == 0)
outcome = underflow;
else
item = entry[count - 1];
return outcome;
}

template <class Entry>
bool Stack<Entry>::empty() const
/*
post: nou ngan xop rong, ham fra vo true; nou ngan xop khong rong, ham fra vo false, ngan
xop khong doI.
*/
{
bool outcome = true;
if (count > 0) outcome = false;
return outcome;
}





















HInh 2.2- Iou dIon cua du IIou frong ngan xop IIon fuc.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 25
Constructor so khoI fao mof ngan xop rong.

template <class Entry>
Stack<Entry>::Stack()
/*
post: ngan xop duoc khoI fao rong.
*/
{
count = 0;
}

2.4.2. Hen thuc ngun xep len ket
Cau fruc IIon kof duoc fao boI cac phan fu , moI phan fu chua haI phan: mof
chua fhong fIn chnh Ia du IIou cua phan fu, mof chua con fro fham chIou don
phan fu ko, va duoc khaI bao frong C++ nhu sau:
template <class Entry>
struct Node {
// data members
Entry entry;
Node<Entry> *next;
// constructors
Node();
Node(Entry item, Node<Entry> *add_on = NULL);
};

Va day Ia hnh anh cua mof phan fu frong cau fruc IIon kof:

Hnh duoI day bIou dIon mof cau fruc IIon kof co con fro chI don phan fu dau
Ia First_node.
Van do daf ra Ia chung fa non chon phan fu dau hay phan fu cuoI cua cau fruc
IIon kof Iam dInh cua ngan xop. Thoaf nhn, duong nhu vIoc fhom mof node moI
vao cuoI cau fruc IIon kof Ia do hon |fuong fu nhu doI voI ngan xop IIon fuc).
Nhung vIoc IoaI mof phan fu o cuoI Ia kho boI v vIoc xac djnh phan fu ngay fruoc


HInh 2.3- Cau fruc Node chua con fro
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 26
phan fu bj IoaI khong fho fhuc hIon nhanh chong. Iy do Ia cac con fro frong cau
fruc IIon kof chI fhoo mof chIou. KhI IoaI dI mof phan fu o cuoI cau fruc IIon kof,
chung fa phaI baf dau fu dau, Ian fhoo cac con fro, moI xac djnh duoc phan fu
cuoI. o do, cach fof nhaf Ia vIoc fhom vao hay IoaI phan fu dou duoc fhuc hIon o
phan fu dau cua cau fruc IIon kof. Inh cua ngan xop IIon kof duoc chon Ia phan
fu dau cua cau fruc IIon kof.

MoI cau fruc IIon kof can mof fhanh phan con fro chI don phan fu dau fIon.
oI voI ngan xop IIon kof, fhanh phan nay Iuon chI don dInh cua ngan xop. o
moI phan fu frong cau fruc IIon kof co fham chIou don phan fu ko non fu phan fu
dau fIon chung fa co fho don moI phan fu frong ngan xop IIon kof bang cach Ian
fhoo cac fham chIou nay. Tu do, fhong fIn duy nhaf can fhIof do co fho fruy xuaf
du IIou frong ngan xop IIon kof Ia dja chI cua phan fu faI dInh. Phan fu faI day
ngan xop Iuon co fham chIou Ia NULL.

template <class Entry>
class Stack {
public:
Stack();
bool empty() const;
ErrorCode push(const Entry &item);
ErrorCode pop();
ErrorCode top(Entry &item) const;
protected:
Node<Entry> *top_node;
};
o Iop Stack gIo day chI chua mof phan fu du IIou, chung fa co fho cho rang
vIoc dung Iop co fho khong can fhIof, fhay vao do chung fa dung Iuon mof bIon do
chua dja chI cua dInh ngan xop. Tuy nhIon, o day co bon Iy do do su dung Iop
Stack.

Iy do quan frong nhaf Ia su duy fr fnh dong kn: nou chung fa khong su
dung Iop ngan xop, chung fa khong fho xay dung cac phuong fhuc cho ngan
xop.

HInh 2.4- Cau fruc IIon kof
First node
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 27
Iy do fhu haI Ia do duy fr su khac bIof Iuan Iy gIua Iop ngan xop, ma ban
fhan duoc fao boI cac phan fu Ia cac node, voI top cua ngan xop Ia mof con
fro fham chIou don chI mof node. VIoc chung fa chI can nam gIu top cua
ngan xop, Ia co fho fm don moI phan fu khac cua ngan xop fuy Ia hIon
nhIon, nhung khong fhch dang voI cau fruc Iuan Iy nay.
Iy do fhu ba Ia do duy fr fnh nhaf quan voI cac cau fruc du IIou khac cung
nhu cac cach hIon fhuc khac nhau cua mof cau fruc du IIou: mof cau fruc du
IIou bao gom cac du IIou va mof fap cac fhao fac.
CuoI cung, vIoc xom ngan xop nhu mof con fro don dInh cua no khong duoc
phu hop voI cac kIou du IIou. Thong fhuong, cac kIou du IIou phaI co kha
nang ho fro frong vIoc Jcbug chuong frnh bang cach cho phop frnh bIon
djch fhuc hIon vIoc kIom fra kIou mof cach fof nhaf.

Chung fa hay baf dau bang mof ngan xop rong, fop_nodo == N!II, va xom
xof vIoc fhom phan fu dau fIon vao ngan xop. Chung fa can fao mof nodo moI
chua ban sao cua fhong so Ifom nhan vao bo phuong fhuc push. Nodo nay duoc
fruy xuaf boI bIon con fro nov_fop. Sau do dja chI chua frong nov_fop so duoc
chop vao fop_nodo cua Sfack |hnh 2.5a):

Node *new_top = new Node<Entry>(item);
top_node = new_top;

Chu y rang o day, constructor khI fao mof node moI da gan next cua no bang
NULL, va chung fa hoan foan an fam v khong bao gIo co con fro mang frj ngau
nhIon.



















HInh 2.5- Thom mof phan fu vao ngan xop IIon kof.
(b)
(a)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 28
Ncu trung tbanb ooi nguycn tac Kbong bao gio Jc mot bicn con tro mang trj
ngau nbicn, cbung ta sc giam Juoc ganb nang Jang kc trong cong suc /ap trnb
o kbong pbai mat qua nbicu tb gio oa Jau Jau Jo nbung /oi ma no gay ra.

o fIop fuc, xom nhu chung fa da co mof ngan xop khong rong. o dua fhom
phan fu vao ngan xop, chung fa can fhom mof node vao ngan xop. Truoc hof
chung fa can fao mof node moI duoc fham chIou boI con fro new_top, node nay
phaI co du IIou Ia item va IIon kof next fham chIou don top cu cua ngan xop.
Sau do chung fa so fhay doI top_node cua ngan xop fham chIou don node moI
nay |hnh 2.5b). Thu fu cua haI phop gan nay raf quan frong: nou chung fa Iam
fhoo fhu fu nguoc IaI, vIoc fhay doI top_node som so Iam maf kha nang fruy xuaf
cac phan fu da co cua ngan xop. Chung fa co phuong fhuc push nhu sau:

template <class Entry>
ErrorCode Stack<Entry>::push(const Entry &item)
/*
post: nou ngan xop khong day, item duoc fhom vao fron dInh ngan xop, ErrorCode fra vo Ia
success; nou ngan xop day, ErrorCode fra vo Ia overflow, ngan xop khong doI.
*/
{
Node *new_top = new Node<Entry>(item, top_node);
if (new_top == NULL) return overflow;
top_node = new_top;
return success;
}

Kbi tbay Joi cac tbam cbicu (cac bicn con tro, tbu tu cac pbcp gan /uon can
Juoc xcm xct mot cacb ky /uong.
.
Phuong fhuc push fra vo ErrorCode Ia overflow frong fruong hop bo nho
dong khong fm duoc cho frong do cap phaf cho phan fu moI, foan fu new fra vo
frj NULL.

VIoc Iay mof phan fu ra khoI ngan xop fhuc su don gIan:




HInh 2.6- Iay mof phan fu ra khoI ngan xop IIon kof.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 29
template <class Entry>
ErrorCode Stack<Entry>::pop()
/*
post: nou ngan xop khong rong, phan fu faI dInh ngan xop duoc Iay dI, ErrorCode fra vo Ia
success; nou ngan xop rong, ErrorCode fra vo Ia underflow, ngan xop khong doI.
*/
{
Node *old_top = top_node;
if (top_node == NULL) return underflow;
top_node = old_top->next;
delete old_top;
return success;
}

Iuu y rang frong phuong fhuc pop, chI can gan top_node cua ngan xop fham
chIou don phan fu fhu haI frong ngan xop fh phan fu fhu nhaf xom nhu da duoc
IoaI khoI ngan xop. Tuy nhIon, nou khong fhuc hIon vIoc gIaI phong phan fu fron
dInh ngan xop, chuong frnh so gay ra rac. Trong ung dung nho, phuong fhuc pop
van chay fof. Nhung nou ung dung Ion goI phuong fhuc nay raf nhIou Ian, so
Iuong rac so Ion Ion dang ko dan don khong du vung nho do chuong frnh chay
fIop.

Kbi mot cau truc Ju /icu Juoc bicn tbuc, no pbai Juoc xu /y tot trong moi
truong bop Jc co tbc Juoc su Jung trong nbicu ung Jung kbac nbau.

2.4.3. Ngun xep len ket vo su un toun
KhI su dung cac phuong fhuc ma chung fa vua xay dung cho ngan xop IIon kof,
nguoI Iap frnh co fho vo fnh gay non rac hoac pha vo fnh dong kn cua cac doI
fuong ngan xop. Trong phan nay chung fa so xom xof chI fIof vo cac nguy co Iam
maf dI fnh an foan va fm hIou fhom ba phuong fhuc ma C++ cung cap do khac
phuc van do nay, do Ia cac fac vu huy doI fuong |destructor), fao doI fuong bang
cach sao chop fu doI fuong khac |copy constructor) va phop gan duoc djnh nghIa
IaI |overloaded assignment). HaI fac vu dau khong duoc goI fuong mInh boI
nguoI Iap frnh, chung so duoc frnh bIon djch goI Iuc can fhIof; rIong fac vu fhu
ba duoc goI boI nguoI Iap frnh khI can gan haI doI fuong. Nhu vay, vIoc bo sung
nham bao dam fnh an foan cho Iop Stack khong Iam fhay doI vo bo ngoaI cua
Stack doI voI nguoI su dung.
2.4.3.1. Ham huy oi tng (Destructor)
CIa su nhu nguoI Iap frnh vIof mof vong Iap don gIan frong do khaI bao mof
doI fuong ngan xop co fon Ia small va dua du IIou vao. Chang han chung fa xom
xof doan Ionh sau:

for (int i=0; i < 1000000; i++) {
Stack<Entry> small;
small.push(some_data);
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 30
Trong moI Ian Iap, doI fuong small duoc fao ra, du IIou fhom vao fhuoc vung
bo nho cap phaf dong, sau do doI fuong small khong con fon faI khI ra khoI fam
vuc hoaf dong cua no |scopc). CIa su chuong frnh su dung ngan xop IIon kof duoc
hIon fhuc nhu hnh 2.4. Ngay khI doI fuong small khong con fon faI , du IIou
frong ngan xop fro fhanh rac, v ban fhan doI fuong small chI chua con fro
top_node, vung nho ma con fro nay chIom so duoc fra vo cho ho fhong, con cac
du IIou ma con fro nay fham chIou don fhuoc vung nho cap phaf dong van chua
duoc fra vo ho fhong. Vong Iap fron duoc fhuc hIon hang frIou Ian, va rac so bj
fch Iuy raf nhIou. Trong fruong hop nay khong fho buoc foI nguoI Iap frnh: do
vong Iap so chang gay ra van do g nou nguoI Iap frnh su dung hIon fhuc ngan
xop IIon fuc, moI vung nho danh cho du IIou frong ngan xop IIon fuc dou duoc gIaI
phong khI ngan xop ra khoI fam vuc.

Mof dIou chac chan rang khI hIon fhuc ngan xop IIon kof, chung fa can phaI
canh bao nguoI su dung khong duoc do mof doI fuong ngan xop khong rong ra
khoI fam vuc, hoac chung fa phaI Iam rong ngan xop fruoc khI no ra khoI fam
vuc.

Ngon ngu C++ cung cap cho Iop phuong fhuc destructor do gIaI quyof van do nay. oI voI moI
Iop, Jcstructor Ia mof phuong fhuc dac bIof duoc fhuc fhI cho doI fuong cua Iop ngay fruoc khI doI
fuong ra khoI fam vuc. NguoI su dung khong can phaI goI Jcstructor mof cach fuong mInh va
fham ch cung khong can bIof don su fon faI cua no. oI voI nguoI su dung, mof Iop co Jcstructor
co fho duoc fhay fho mof cach don gIan boI mof Iop ma khong co no.

Dcstructor fhuong duoc su dung do gIaI phong cac doI fuong cap phaf dong ma
chung co fho fao non rac. Trong fruong hop cua chung fa, chung fa non bo sung
fhom Jcstructor cho Iop ngan xop IIon kof. Sau hIou chInh nay, nguoI su dung so
khong fho gay ra rac khI do mof doI fuong ngan xop khong rong ra khoI fam vuc.

Dcstructor duoc khaI bao nhu mof phuong fhuc cua Iop, khong co fhong so va
khong co frj fra vo. Ton cua Jcstructor Ia fon Iop co fhom dau ~ pha fruoc.

Stack::~Stack();

o phuong fhuc pop duoc Iap frnh do IoaI mof phan fu ra khoI ngan xop,
chung fa co fho hIon fhuc Jcstructor cho ngan xop bang cach Iap nhIou Ian vIoc
goI pop:
template <class Entry>
Stack::~Stack() // Destructor
/*
post: ngan xop da duoc Iam rong.
*/
{
while (!empty())
pop();
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 31

oi ooi moi cau truc /icn kct cbung ta can oict Jcstructor Jc Jon Jcp cac Joi
tuong truoc kbi cbung ra kboi tam ouc.
2.4.3.2. nh ngha lai phep gan
Ngay khI chung fa da bo sung Jcstructor cho ngan xop IIon kof, nguoI su dung
cung co fho fao rac khI vIof vong Iap fua nhu v du sau.

Stack<Entry> outer_stack;
for (int i=0; i < 1000000; i++) {
Stack<Entry> inner_stack;
inner_stack.push(some_data);
inner_stack = outer_stack;
}

au fIon Ia doI fuong oufor_sfack duoc fao ra, sau do vong Iap duoc fhuc hIon.
MoI Ian Iap Ia mof Ian fao mof doI fuong Innor_sfack, dua du IIou vao
Innor_sfack, gan oufor_sfack vao Innor_sfack. Ionh gan nay gay ra mof van do
nghIom frong cho hIon fhuc ngan xop IIon kof cua chung fa. Thong fhuong, C++
fhuc hIon phop gan cac doI fuong bang cach chop cac fhuoc fnh cua cac doI fuong.
o do, oufor_sfack.fop_nodo duoc ghI do Ion Innor_sfack.fop_nodo, Iam cho du IIou
cu fham chIou boI Innor_sfack.fop_nodo fro fhanh rac. Cung gIong nhu phan
fruoc, nou hIon fhuc ngan xop IIon fuc duoc su dung fh khong co van do g xay
ra. Nhu vay, IoI Ia do hIon fhuc ngan xop IIon kof con fhIou sof.

Hnh 2.7 cho fhay fac vu gan khong duoc fhuc hIon nhu mong muon. Sau phop
gan, ca haI ngan xop cung chIa xo cac node. CuoI moI Ian Iap, Jcstructor cua
inner_stack so gIaI phong moI du IIou cua outer_stack. VIoc gIaI phong du
IIou cua outer_stack con Iam cho outer_stack.top_node fro fhanh fham
chIou froo, co nghIa Ia fham chIou don vung nho khong xac djnh.


HInh 2.?- !ng dung chop ngan xop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 32
Van do sInh ra boI phop gan fron ngan xop IIon kof Ia do no chop cac fham
chIou chu khong phaI chop cac frj. Phop gan frong fruong hop nay duoc goI Ia
phop gan co ngu nghIa fham chIou |rcjcrcncc scmantics) . Nguoc IaI, khI phop gan
fhuc su chop du IIou frong CTI chung fa goI Ia phop gan co ngu nghIa frj |oa/uc
scmantics). Trong hIon fhuc Iop ngan xop IIon kof, hoac chung fa phaI canh bao
cho nguoI su dung rang phop gan chI Ia phop gan co ngu nghIa fham chIou, hoac
chung fa phaI Iam cho frnh bIon djch C++ fhuc hIon phop gan co ngu nghIa frj.

Trong C++, chung fa hIon fhuc mof phuong fhuc dac bIof goI Ia phop gan duoc
djnh nghIa IaI |oocr/oaJcJ assignmcnt) do djnh nghIa IaI cach fhuc hIon phop
gan. KhI frnh bIon djch C++ djch mof phop gan co dang x = y, no uu fIon chon
phop gan duoc djnh nghIa IaI fruoc nou nhu Iop x co djnh nghIa. ChI khI khong co
phuong fhuc nay, frnh bIon djch moI djch phop gan nhu Ia phop gan fung bIf doI
voI cac fhuoc fnh cua doI fuong |nou fhuoc fnh Ia con fro fh phop gan fro fhanh
phop gan co ngu nghIa fham chIou). Chung fa can djnh nghIa IaI do phop gan cho
ngan xop IIon kof fro fhanh phop gan co ngu nghIa frj.

Co mof vaI cach do khaI bao va hIon fhuc phop gan duoc djnh nghIa IaI. Cach
don gIan Ia khaI bao nhu sau:
void Stack<Entry>::operator= ( const Stack &original );

Phop gan nay co fho duoc goI nhu sau:
x.operator = (y);

hoac goI fhoo cu phap fhuong dung:

x = y;

Phop gan djnh nghIa IaI cho ngan xop IIon kof can Iam nhung vIoc sau:

Chop du IIou fu ngan xop duoc fruyon vao fhong qua fhong so.
CIaI phong vung nho chIom gIu boI du IIou cua doI fuong ngan xop dang
duoc fhuc hIon Ionh gan.
Chuyon cac du IIou vua chop duoc cho doI fuong ngan xop duoc gan.

template <class Entry>
void Stack::operator = (const Stack<Entry> &original) // Overload assignment
/*
post: doI fuong ngan xop duoc gan chua cac du IIou gIong hof ngan xop duoc fruyon vao qua
fhong so.
*/
{
Node<Entry> *new_top, *new_copy, *original_node = original.top_node;
if (original_node == NULL) new_top = NULL;
else { // Tao ban sao cac node.
new_copy = new_top = new Node<Entry>(original_node->entry);
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 33
while (original_node->next != NULL) {
original_node = original_node->next;
new_copy->next = new Node<Entry>(original_node->entry);
new_copy = new_copy->next;
}
}
while (!empty()) // Iam rong ngan xop so duoc gan.
pop();
top_node = new_top; // Ngan xop duoc gan so nam gIu ban sao.
}

Iuu y rang frong phuong fhuc fron chung fa fao ra mof ban sao fu ngan xop
original fruoc, roI moI don dop ngan xop so duoc gan bang cach goI phuong
fhuc pop nhIou Ian. Nho vay nou frong ung dung co phop gan x = x fh du IIou
cung khong bj saI.

Phop gan duoc djnh nghIa IaI nhu fron fhoa you cau Ia phop gan co ngu nghIa
frj, fuy nhIon do co fho su dung frong fruong hop:
first_stack=second_stack=third_stack=..., phop gan phaI fra vo
Stack& |fham chIou don Iop Stack).
2.4.3.3. Copy constructor
Truong hop cuoI cung vo su fhIou an foan cua cac cau fruc IIon kof Ia khI frnh
bIon djch can chop mof doI fuong. Chang han, mof doI fuong can duoc chop khI
no Ia thum tr{ goI cho mof ham. Trong C++, fac vu chop mac nhIon Ia chop cac
fhuoc fnh fhanh phan cua Iop. Cung gIong nhu mInh hoa frong hnh 2.7, fac vu
chop mac nhIon nay so dan don vIoc cac doI fuong cung chIa xo du IIou. NoI mof
cach khac, fac vu chop mac djnh co ngu nghIa fham chIou khI doI fuong co fhuoc
fnh kIou con fro. Iou nay Iam cho nguoI su dung co fho vo fnh Iam maf du
IIou:

void destroy_the_stack (Stack<Entry> copy)
{

}
int main()
{
Stack<Entry> vital_data;
destroy_the_stack(vital_data);
}

Ham destroy_the_stack nhan mof ban sao copy cua vital_data. an sao
nay cung chIa xo du IIou voI vital_data, do do khI kof fhuc ham, Jcstructor fhuc
hIon fron ban sao copy so Iam maf Iuon du IIou cua vital_data.

C++ cho phop Iop co fhom phuong fhuc copy constructor do fao mof doI
fuong moI gIong mof doI fuong da co. Nou chung fa hIon fhuc copy constructor
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 34
cho Iop Stack fh frnh bIon djch C++ so uu fIon chon fac vu chop nay fhay cho
fac vu chop mac djnh. Chung fa can hIon fhuc copy constructor do co duoc ngu
nghIa frj.

oI voI moI Iop, khaI bao chuan cho copy constructor cung gIong nhu khaI bao
constructor nhung co fhom fhong so Ia fham chIou hang don doI fuong cua Iop:

Stack<Entry>::Stack ( const Stack<Entry> &original );

o doI fuong goI copy constructor Ia mof doI fuong rong vua duoc fao moI non
chung fa khong phaI Io don dop du IIou nhu fruong hop doI voI phop gan duoc
djnh nghIa IaI. Chung fa chI vIoc chop node dau fIon va sau do dung vong Iap do
chop fIop cac node con IaI.

template <class Entry>
Stack<Entry>::Stack(const Stack<Entry> &original) // copy constructor
/*
post: doI fuong ngan xop vua duoc fao ra co du IIou gIong voI ngan xop original
*/
{
Node<Entry> *new_copy, *original_node = original.top_node;
if (original_node == NULL) top_node = NULL;
else { // Tao ban sao cho cac node.
top_node = new_copy = new Node<Entry>(original_node->entry);
while (original_node->next != NULL) {
original_node = original_node->next;
new_copy->next = new Node<Entry>(original_node->entry);
new_copy = new_copy->next;
}
a(
}

Mof cach fong quaf, doI voI moI Iop IIon kof, hoac chung fa bo sung copy
constructor, hoac chung fa canh bao nguoI su dung rang vIoc chop doI fuong co
ngu nghIa fham chIou.
2.4.4. Ouc tu ngun xep len ket du heu chnh
Chung fa kof fhuc phan nay bang dac fa da duoc hIou chInh duoI day cho ngan
xop IIon kof. Phan dac fa nay co duoc moI dac fnh an foan ma chung fa da phan
fch.

template <class Entry>
class Stack {
public:
// Cac phuong fhuc chuan cua Iop Stack:
Stack();
bool empty() const;
ErrorCode push(const Entry &item);
ErrorCode pop();
ErrorCode top(Entry &item) const;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 35
// Cac dac fa dam bao fnh an foan cho cau fruc IIon kof:
~Stack();
Stack(const Stack<Entry> &original);
void operator =(const Stack<Entry> &original);
protected:
Node<Entry> *top_node;
};

Tron day Ia phan frnh bay day du nhaf vo nhung you cau can co doI voI ngan
xop IIon kof, nhung no cung dung voI cac cau fruc IIon kof khac. Trong cac phan
sau cua gIao frnh nay so khong gIaI fhch fhom vo 3 fac vu nay nua, sInh vIon fu
phaI hoan chInh khI hIon fhuc baf ky CTI nao co fhuoc fnh kIou con fro.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 2 Ngan xcp
Giao trnb Cau truc Ju /icu oa Giai tbuat 36

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 37
Chng 3 HANG OO
3.1. O{nh nghIu hung
Trong cac ung dung may fnh, chung fa djnh nghIa CTI hang Ia mof danh
sach frong do vIoc fhom mof phan fu vao duoc fhuc hIon o mof dau cua danh sach
|cuoI hang), va vIoc Iay du IIou khoI danh sach fhuc hIon o dau con IaI |dau hang).
Chung fa co fho hnh dung CTI hang cung gIong nhu mof hang nguoI Ian Iuo f
cho mua vo, aI don fruoc duoc phuc vu fruoc. Hang con duoc goI Ia danh sach
IIIO |First In First Out)
HInh 3.1- Hang doI

Cac ung dung co su dung hang con pho bIon hon cac ung dung co su dung ngan
xop, v khI may fnh fhuc hIon cac nhIom vu, cung gIong nhu cac cong vIoc frong
cuoc song, moI cong vIoc dou can phaI doI don Iuof cua mnh. Trong mof ho fhong
may fnh co fho co nhIou hang doI cac co ng vIoc dang cho don Iuof duoc In, duoc
fruy xuaf dIa hoac duoc su dung CP!. Trong mof chuong frnh don gIan co fho co
nhIou cong vIoc duoc Iuu vao hang doI, hoac mof cong vIoc co fho khoI fao mof so
cong vIoc khac ma chung cung can duoc Iuu vao hang do cho don Iuof fhuc hIon.

Phan fu dau hang so duoc phuc vu fruoc, fhuong phan fu nay duoc goI Ia
front, hay head cua hang. Tuong fu, phan fu cuoI hang, cung Ia phan fu vua
duoc fhom vao hang, duoc goI Ia rear hay tail cua hang.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 38
nh ngha: Mof hang cac phan fu kIou T Ia mof chuoI noI fIop cac phan fu cua T,
kom cac fac vu sau:
1. Tao moI mof doI fuong hang rong.
2. Thom mof phan fu moI vao hang, gIa su hang chua day |phan fu du IIou moI
Iuon duoc fhom vao cuoI hang).
3. IoaI mof phan fu ra khoI hang, gIa su hang chua rong |phan fu bj IoaI Ia phan
fu faI dau hang, fhuong Ia phan fu vua duoc xu Iy xong).
4. Xom phan fu faI dau hang |phan fu sap duoc xu Iy).
3.2. Ouc tu hung
o hoan faf djnh nghIa cua cau fruc du IIou fruu fuong hang, chung fa dac fa
moI fac vu ma hang fhuc hIon. Cac dac fa nay cung fuong fu nhu cac dac fa cho
ngan xop, chung fa dua ra fon, kIou fra vo, danh sach fhong so, precondition,
postcondition va uses cho moI phuong fhuc. Entry bIou dIon mof kIou fong quaf
cho phan fu chua frong hang.

template <class Entry>
Queue<Entry>::Queue();
post: oI fuong hang da fon faI va duoc khoI fao Ia hang rong.

template <class Entry>
ErrorCode Queue<Entry>::append(const Entry &item);
post: nou hang con cho, item duoc fhom vao faI rear, ErrorCode fra vo Ia success; nguoc IaI,
ErrorCode fra vo Ia overflow, hang khong doI.

template <class Entry>
ErrorCode Queue<Entry>::serve();
post: nou hang khong rong, phan fu faI front duoc Iay dI, ErrorCode fra vo Ia success; nguoc
IaI, ErrorCode fra vo Ia underflow, hang khong doI.

template <class Entry>
ErrorCode Queue<Entry>::retrieve(const Entry &item) const;
post: nou hang khong rong, phan fu faI front duoc chop vao item, ErrorCode fra vo Ia
success; nguoc IaI, ErrorCode fra vo Ia underflow; ca haI fruong hop hang dou khong
doI.

template <class Entry>
bool Queue<Entry>::empty() const;
post: ham fra vo true nou hang rong; nguoc IaI, ham fra vo false.

Tu append |fhom vao hang) va serve |da duoc phuc vu) duoc dung cho cac fac
vu co ban fron hang do chI ra mof cach ro rang cong vIoc fhuc hIon doI voI hang,
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 39
va do franh nham Ian voI nhung fu ma chung fa so dung voI cac cau fruc du IIou
khac.
Chung fa co Iop Queue nhu sau:

template <class Entry>
class Queue {
public:
Queue();
bool empty() const;
ErrorCode append(const Entry &item);
ErrorCode serve();
ErrorCode retrieve(Entry &item) const;
};

NgoaI cac fac vu co ban nhu append, serve, retrieve, va empty doI khI
chung fa can fhom mof so fac vu khac. Chang han nhu fac vu full do kIom fra
xom hang da day hay chua.

Co ba fac vu raf fIon IoI doI voI hang: clear do don dop cac phan fu frong
mof hang co san va Iam cho hang rong, size cho bIof so phan fu hIon co frong
hang, cuoI cung Ia serve_and_retrieve gom haI fac vu serve va retrieve
Iam mof v nguoI su dung fhuong goI haI fac vu nay mof Iuc.

Chung fa co fho bo sung cac fac vu fron vao Iop hang da co o fron. Tuy nhIon,
chung fa co fho fao Iop moI co fho su dung IaI cac phuong fhuc va cach hIon fhuc
cua cac Iop da co. Trong fruong hop nay chung fa xay dung Iop Extended_Queue
do bo sung cac phuong fhuc fhom vao cac phuong fhuc co ban cua Iop Queue. Iop
Extended_Queue duoc goI Ia Iop dan xuaf fu Iop Queue.

KhaI nIom dan xuaf cung cap mof cach djnh nghIa cac Iop moI don gIan bang
cach bo sung fhom cac phuong fhuc vao mof Iop co san. Kha nang cua Iop dan
xuaf su dung IaI cac fhanh phan cua Iop co so duoc goI Ia su fhua ko. Su fhua ko
|inheritance) Ia mof frong cac dac fnh co ban cua Iap frnh huong doI fuong.

Chung fa mInh hoa moI quan ho gIua Iop Queue va Iop dan xuaf
Extended_Queue boI so do fhua ko |hnh 3.2a). MuI fon chI fu Iop dan xuaf don
Iop co so ma no fhua ko. Hnh 3.2b mInh hoa su fhua ko cac phuong fhuc va cac
phuong fhuc bo sung.



Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 40


Chung fa co Iop Extended_Queue:
template <class Entry>
class Extended_Queue: public Queue {
public:
bool full() const;
int size() const;
void clear();
ErrorCode serve_and_retrieve(Entry &item);
};

Tu khoa publc frong khaI bao fhua ko co nghIa Ia kha nang nguoI su dung
nhn fhay doI voI cac fhanh phan ma Iop dan xuaf co duoc qua su fhua ko so
gIong hof nhu kha nang nguoI su dung nhn fhay chung o Iop co so.

ac fa cua cac phuong fhuc bo sung:

template <class Entry>
bool Extended_Queue<Entry>::full() const;
post: fra vo true nou hang day, nguoc IaI, fra vo false. Hang khong doI.

template <class Entry>
void Extended_Queue<Entry>::clear();
post: moI phan fu frong hang duoc IoaI khoI hang, hang fro non rong.

template <class Entry>
int Extended_Queue<Entry>::size() const;
post: fra vo so phan fu hIon co cua hang. Hang khong doI.
HInh 3.2- Su fhua ko va Iop dan xuaf
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 41

template <class Entry>
ErrorCode Extended_Queue<Entry>::serve_and_retrieve(const Entry &item);
post: nou hang khong rong, phan fu faI front duoc chop vao item dong fhoI duoc IoaI khoI
hang, ErrorCode fra vo Ia success; nguoc IaI, ErrorCode fra vo Ia underflow, hang
khong doI.

MoI quan ho gIua Iop Extended_Queue va Iop Queue fhuong duoc goI Ia moI
quan ho is-a v moI doI fuong fhuoc Iop Extended_Queue cung Ia mof doI fuong
fhuoc Iop Queue ma co fhom mof so dac fnh khac, do Ia cac phuong fhuc
serve_and_retrieve, full, size va clear.
3.3. Cuc phuong un hen thuc hung
3.3.1. Cuc phuong un hen thuc hung len tuc
3.3.1.1. Mo hInh vut ly
Tuong fu nhu chung fa da Iam voI ngan xop, chung fa co fho fao mof hang
frong bo nho may fnh bang mof day |kIou du IIou array) do chua cac phan fu
cua hang. Tuy nhIon, o day chung fa can phaI nam gIu duoc ca front va rear.
Mof cach don gIan Ia chung fa gIu front Iuon Ia vj fr dau cua day. Iuc do, do
fhom moI mof phan fu vao hang, chung fa fang bIon dom bIou dIon rear y hof
nhu chung fa fhom phan fu vao ngan xop. o Iay mof phan fu ra khoI hang,
chung fa phaI fra mof gIa daf cho vIoc dI chuyon faf ca cac phan fu hIon co frong
hang foI mof buoc do Iap day cho frong faI front. Mac du cach hIon fhuc nay raf
gIong voI hnh anh hang nguoI sap hang doI do duoc phuc vu, nhung no Ia mof
Iua chon raf do frong may fnh.
3.3.1.2. Hen thuc tuyen tInh
o vIoc xu Iy hang co hIou qua, chung fa dung haI chI so do nam gIu front va
rear ma khong dI chuyon cac phan fu. Muon fhom mof phan fu vao hang, don
gIan chung fa chI can fang rear Ion mof va fhom phan fu vao vj fr nay. KhI Iay
mof phan fu ra khoI hang chung fa Iay phan fu faI vj fr front va fang front
Ion mof. Tuy nhIon phuong phap nay co mof nhuoc dIom Ion, do Ia front va
rear Iuon Iuon fang chu khong gIam. Ngay ca khI frong hang khong bao gIo co
qua haI phan fu, hang van doI hoI mof vung nho khong co gIoI han nou nhu cac
fac vu duoc goI IIon fuc nhu sau:

append, append, serve, append, serve, append, serve, append,
serve, append, ...

Van do o day Ia khI cac phan fu frong hang djch chuyon foI frong day fh cac
vj fr dau cua day so khong bao gIo duoc su dung don. Chung fa co fho hnh dung
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 42
hang Iuc do frong nhu mof con ran Iuon fruon mnh foI. Con ran co Iuc daI ra, co
Iuc ngan IaI, nhung nou cu fruon foI maI fhoo mof huong fh cung phaI don Iuc no
gap dIom dung cua bo nho.

Tuy nhIon, cung can chu y rang frong cac ung dung ma co Iuc hang fro non
rong |khI mof Ioaf cac you cau dang doI da duoc gIaI quyof hof faI mof fhoI dIom
nao do), fh faI fhoI dIom nay hang co fho duoc sap xop IaI, front va rear duoc
gan fro IaI vo dau day. Truong hop nay cho fhay vIoc su dung mof so do don gIan
gom haI chI so va mof bo nho fuyon fnh nhu vua nou Ia mof cach hIon fhuc co
hIou qua cao.
3.3.1.3. Ouy vong
Vo y nIom, chung fa co fho khac phuc fnh fhIou hIou qua frong vIoc su dung
bo nho bang cach hnh dung day co dang vong fhay v fuyon fnh. KhI phan fu
duoc fhom vao hay Iay ra khoI hang, dIom dau cua hang so duoI fhoo dIom cuoI
cua hang vong fhoo day, va nhu vay con ran van co fho fruon foI vo han nhung
van bj nhof frong mof vong co gIoI han. TaI cac fhoI dIom khac nhau, hang so
chIom nhung phan khac nhau frong day vong, nhung chung fa so khong bao gIo
phaI Io vo su vuof gIoI han bo nho fru khI day fhaf su khong con phan fu frong,
fruong hop nay duoc xom nhu hang day, ErrorCode so nhan frj overflow.

Hen thuc cuu duy vong

Van do fIop fhoo cua chung fa Ia dung mof day fuyon fnh do mo phong mof
day vong. Cac vj fr frong vong fron duoc danh so fu 0 don max-1, frong do max
Ia fong so phan fu frong day vong. o hIon fhuc day vong, chung fa cung su dung
cac phan fu duoc danh so fuong fu day fuyon fnh. Su fhay doI cac chI so chI don
gIan Ia phop Iay phan du frong so hoc: khI mof chI so fang vuof qua gIoI han max-
1, no duoc baf dau fro IaI voI frj 0. Iou nay fuong fu vIoc cong fhom gIo frong
dong ho maf fron, cac gIo duoc danh so fu 1 don 12, nou chung fa cong fhom 4 gIo
vao 10 gIo chung fa so co 2 gIo.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 43

Ouy vong trong C++

Trong C++, chung fa co fho fang chI so i frong mof day vong nhu sau:

i = ((i+1) == max) ? 0: (i+1);

hoac if ((i+1) == max) i = 0; else i = i+1;

hoac i = (i+1) % max;

Cuc deu ken ben

Truoc khI vIof nhung gIaI fhuaf fhom hoac IoaI phan fu ra khoI hang, chung fa
hay xom xof don cac dIou kIon bIon |boundary conditions), do Ia cac dau hIou cho
bIof hang con rong hay da day.


Hnh 3.3- Hang trong day vong
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 44
Nou frong hang chI co mof phan fu fh ca front va rear dou chI don phan fu
nay |hnh 3.4 a). KhI phan fu nay duoc IoaI khoI hang, front so fang Ion 1. o
do hang Ia rong khI rear chI vj fr ngay fruoc front |hnh 3.4 b).

o rear dI chuyon vo pha fruoc moI khI fhom phan fu moI, non khI hang sap
day va bang cach dI chuyon vong fh rear cung so gan gap front fro IaI |hnh
3.3 c). Iuc nay khI phan fu cuoI cung duoc fhom vao Iam cho hang day fh rear
cung chI vj fr ngay fruoc front |hnh 3.4 d).

Chung fa gap mof kho khan moI: vj fr fuong doI cua front va rear gIong
hof nhau frong ca haI fruong hop hang day va hang rong.


Cuc cuch gu quyet co the

HInh 3.4- Hnh anh mInh hoa hang rong va hang day
(c)
(d)
(a)
(b)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 45
Co f nhaf 3 cach gIaI quyof cho van do nou fron. Cach fhu nhaf Ia danh
IaI mof vj fr frong khI hang day, rear so cach front mof vj fr gIua. Cach
fhu haI Ia su dung fhom mof bIon, chang han mof bIon co kIou bool so co
frj true khI rear nhch don saf front frong fruong hop hang day |chung
fa co fho fuy y chon fruong hop hang day hay rong), hay mof bIon dom do
dom so phan fu hIon co frong hang. Cach fhu ba Ia cho mof hoac ca haI chI
so front va rear mang mof frj dac bIof nao do do chI ra hang rong, v du
nhu rear so Ia -1 khI hang rong.
3.3.1.4. Tong ket cuc cuch hen thuc cho hung len tuc

o fong kof nhung dIou da ban vo hang, chung fa IIof ko duoI day faf ca cac
phuong phap ma chung fa da fhao Iuan vo cac cach hIon fhuc hang.

Mo hnh vaf Iy: mof day fuyon fnh co front Iuon chI vj fr dau fIon frong
hang va moI phan fu cua hang phaI dI chuyon foI mof buoc khI phan fu faI
front duoc Iay dI. ay Ia phuong phap raf do frong may fnh noI chung.
Mof day fuyon fnh co haI chI so front va rear Iuon Iuon fang. ay Ia
phuong phap fof nou nhu hang co fho duoc Iam rong.
Mof day vong co haI chI so front,rear va mof vj fr do frong.
Mof day vong co haI chI so front,rear va mof co cho bIof hang day |hoac
rong).
Mof day vong co haI chI so front,rear va mof bIon dom so phan fu hIon co
frong hang.
Mof day vong co haI chI so front,rear ma haI chI so nay so mang frj dac
bIof frong fruong hop hang rong.

3.3.2. Phuong un hen thuc hung len ket
ang cach su dung bo nho IIon fuc, vIoc hIoc fhuc hang kho hon vIoc hIon fhuc
ngan xop raf nhIou do chung fa dung vung nho fuyon fnh do gIa Iap fo chuc vong
va gap kho khan frong vIoc phan bIof mof hang day voI mof hang rong. Tuy
nhIon, hIon fhuc hang IIon kof IaI fhuc su do dang nhu hIon fhuc ngan xop IIon
kof. Chung fa chI can nam gIu haI con fro, front va rear do fham chIou don
phan fu dau va phan fu cuoI cua hang. Cac fac vu fhom hay IoaI phan fu fron
hang duoc mInh hoa frong hnh 3.5.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 46

3.4. Hen thuc hung
3.4.1. Hen thuc hung len tuc
Hen thuc vong cho hung len tuc trong C++

Phan nay frnh bay cac phuong fhuc cua cach hIon fhuc hang bang day vong
co bIon dom cac phan fu. Chung fa co djnh nghIa Iop Queue nhu sau:
const int maxQueue = 10; // GIa frj nho chI do kIom fra CTI Queue.

template <class Entry>
class Queue {
public:
Queue();
bool empty() const;
ErrorCode serve();
ErrorCode append(const Entry &item);
ErrorCode retrieve(Entry &item) const;
protected:
int count;
int front, rear;
Entry entry[maxQueue];
};

Cac du IIou fhanh phan frong Iop Queue duoc khaI bao protected. oI voI nguoI su dung so
khong co g fhay doI, nghIa Ia chung van khong duoc nguoI su dung nhn fhay va van dam bao su
cho dau fhong fIn. Muc dch o day Ia khI chung fa xay dung Iop Extended_Queue dan xuaf fu Iop
Queue fh Iop dan xuaf so su dung duoc cac du IIou fhanh phan nay. KhI cac du IIou fhanh phan
cua Iop co so duoc khaI bao Ia private fh Iop dan xuaf cung so khong nhn fhay chung.
template <class Entry>
Queue<Entry>::Queue()
/*
post: oI fuong hang da fon faI va duoc khoI fao Ia hang rong.
*/


HInh 3.5 Cac fac vu fhom va IoaI phan fu fron hang IIon kof
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 47
{
count = 0;
rear = maxQueue - 1;
front = 0;
}

template <class Entry>
bool Queue<Entry>::empty() const
/*
post: ham fra vo true nou hang rong; nguoc IaI, ham fra vo false.
*/
{ return count == 0;
}

template <class Entry>
ErrorCode Queue<Entry>::append(const Entry &item)
/*
post: nou hang con cho, item duoc fhom vao faI rear, ErrorCode fra vo Ia success; nguoc IaI,
ErrorCode fra vo Ia overflow, hang khong doI.
*/
{
if (count >= maxQueue) return overflow;
count++;
rear = ((rear + 1) == maxQueue) ? 0 : (rear + 1);
entry[rear] = item;
return success;
}
template <class Entry>
ErrorCode Queue<Entry>::serve()
/*
post: nou hang khong rong, phan fu faI front duoc Iay dI, ErrorCode fra vo Ia success; nguoc
IaI, ErrorCode fra vo Ia underflow, hang khong doI.
*/
{
if (count <= 0) return underflow;
count--;
front = ((front + 1) == maxQueue) ? 0 : (front + 1);
return success;
}

template <class Entry>
ErrorCode Queue<Entry>::retrieve(Entry &item) const
/*
post: nou hang khong rong, phan fu faI front duoc chop vao item, ErrorCode fra vo Ia
success; nguoc IaI, ErrorCode fra vo Ia underflow; ca haI fruong hop hang dou khong
doI.
*/
{
if (count <= 0) return underflow;
item = entry[front];
return success;
}

Chung fa danh phuong fhuc empty IaI nhu Ia baI fap. Phuong fhuc size duoI
day raf don gIan do Iop Extended_Queue su dung duoc fhuoc fnh count cua Iop
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 48
Queue, nou nhu count duoc khaI bao Ia private fh phuong fhuc size cua Iop
Extended_Queue phaI su dung hang Ioaf cau Ionh goI cac phuong fhuc public
cua Queue nhu serve, retrieve, append moI fhuc hIon duoc. Cac phuong fhuc
con IaI cua Extended_Queue cung fuong fu, va chung fa danh IaI phan baI fap.

template <class Entry>
int Extended_Queue<Entry>::size() const
/*
post: fra vo so phan fu hIon co cua hang. Hang khong doI.
*/
{
return count;
}

3.4.2. Hen thuc hung len ket
3.4.2.1. Cuc khu buo co bun
VoI moI hang, chung fa dung kIou Entry cho kIou cua du IIou Iuu frong hang.
oI voI hIon fhuc IIon kof, chung fa khaI bao cac node fuong fu nhu da Iam cho
ngan xop IIon kof frong chuong 2. Chung fa co dac fa duoI day:



template <class Entry>
class Queue {
public:
// Cac phuong fhuc chuan cua hang
Queue();
bool empty() const;
ErrorCode append(const Entry &item);
ErrorCode serve();
ErrorCode retrieve(Entry &item) const;
// Cac phuong fhuc bao dam fnh an foan cho hang IIon kof
~Queue();
Queue(const Queue<Entry> &original);
void operator =(const Queue<Entry> &original);
protected:
Node<Entry> *front, *rear;
};

Constructor fhu nhaf khoI fao mof hang rong:

template <class Entry>
Queue<Entry>::Queue()
/*
post: oI fuong hang da fon faI va duoc khoI fao Ia hang rong.
*/
{
front = rear = NULL;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 49

Phuong fhuc append fhom mof phan fu vao dau rear cua hang:

template <class Entry>
ErrorCode Queue<Entry>::append(const Entry &item)
/*
post: nou hang con cho, item duoc fhom vao faI rear, ErrorCode fra vo Ia success; nguoc
IaI, ErrorCode fra vo Ia overflow, hang khong doI.
*/
{
Node *new_rear = new Node<Entry> (item);
if (new_rear == NULL) return overflow;
if (rear == NULL) front = rear = new_rear; // fruong hop dac bIof: fhom vao hang
dang rong.
else {
rear->next = new_rear;
rear = new_rear;
}
return success;
}

Truong hop hang rong can phan bIof voI cac fruong hop bnh fhuong khac, do
khI fhom mof node vao mof hang rong can phaI gan ca front va rear fham
chIou don node nay, frong khI vIoc fhom mof node vao mof hang khong rong chI
co rear Ia can duoc gan IaI.

Phuong fhuc IoaI mof phan fu ra khoI hang duoc vIof nhu sau:

template <class Entry>
ErrorCode Queue::serve()
/*
post: nou hang khong rong, phan fu faI front duoc Iay dI, ErrorCode fra vo Ia success; nguoc
IaI, ErrorCode fra vo Ia underflow, hang khong doI.
*/
{
if (front == NULL) return underflow;
Node *old_front = front;
front = old_front->next;
if (front == NULL) rear= NULL;// trng hp ac biet: loai phan t cuoi cung cua hang
delete old_front;
return success;
}

Mof Ian nua fruong hop hang rong can duoc xom xof rIong. KhI phan fu duoc
IoaI khoI hang khong phaI Ia phan fu cuoI frong hang, chI co front can duoc gan
IaI, nguoc IaI ca front va rear can phaI gan vo N!II.

Cac phuong fhuc khac cua hang IIon kof duoc danh IaI cho phan baI fap.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 3 Hang i
Giao trnh Cau truc d lieu va Giai thuat 50
Nou so sanh voI hang IIon fuc, chung fa so fhay rang hang IIon kof do hIou
hon ca vo maf khaI nIom ca vo cach hIon fhuc chuong frnh.
3.4.3. Hung len ket mo rong
HIon fhuc IIon kof cua Iop Queue cung cap mof Iop co so cho cac Iop khac.
jnh nghIa duoI day danh cho Iop dan xuaf Extended_Queue hoan foan fuong fu
nhu hang IIon fuc.

template <class Entry>
class Extended_queue: public Queue {
public:
bool full() const;
int size() const;
void clear();
ErrorCode serve_and_retrieve(Entry &item);
};

Mac du Iop Extended_Queue nay co hIon fhuc IIon kof, nhung no khong can cac phuong fhuc
nhu copy contructor, overloaded assignment, hoac destructor. oI voI mof frong cac phuong fhuc
nay, frnh bIon djch so goI cac phuong fhuc mac djnh cua Iop Extended_Queue. Phuong fhuc mac
djnh cua mof Iop dan xuaf so goI phuong fhuc fuong ung cua Iop co so. Chang han, khI mof doI
fuong cua Iop Extended_Queue chuan bj ra khoI fam vuc, destructor mac djnh cua Iop
Extended_Queue so goI destructor cua Iop Queue: moI node cap phaf dong cua Extended_Queue
dou duoc gIaI phong. o Iop Extended_Queue cua chung fa khong chua fhom fhuoc fnh con fro
nao ngoaI cac fhuoc fnh con fro fhua ko fu Iop Queue, destructor ma frnh bIon djch goI da Iam
duoc faf ca nhung dIou ma chung fa mong muon.

Cac phuong fhuc duoc khaI bao cho Iop Extended_Queue can duoc vIof IaI cho
phu hop voI cau fruc IIon kof cua hang. Chang han, phuong fhuc size can su dung
mof con fro fam window do duyof hang |noI cach khac, con fro window so dI
chuyon doc fhoo hang va Ian Iuof chI don fung node frong hang).

template <class Entry>
int Extended_queue<Entry>::size() const
/*
post: fra vo so phan fu hIon co cua hang. Hang khong doI.
*/
{
Node *window = front;
int count = 0;
while (window != NULL) {
window = window->next;
count++;
}
return count;
}

Cac phng thc khac cua Extended_Queue IIon kof xem nh bai tap.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 51
Chng 4 OANH SACH

Chung fa da Iam quon voI cac danh sach han cho nhu ngan xop va hang, frong
do vIoc fhom/ bof du IIou chI fhuc hIon o cac dau cua danh sach. Trong chuong
nay chung fa fm hIou cac danh sach fhong fhuong hon ma frong do vIoc fhom,
IoaI hoac fruy xuaf phan fu co fho fhuc hIon faI baf ky vj fr nao frong danh sach.
4.1. O{nh nghIu dunh such
Chung fa baf dau bang vIoc djnh nghIa kIou cau fruc du IIou fruu fuong goI Ia
danh sach |list). Cung gIong nhu ngan xop va hang, danh sach bao gom mof chuoI
noI fIop cac phan fu du IIou. Tuy nhIon, khac voI ngan xop va hang, danh sach
cho phop fhao fac fron moI phan fu.

nh ngha: anh sach cac phan fu kIou T Ia mof chuoI noI fIop huu han cac
phan fu kIou T cung cac fac vu sau:
1. Tao mof danh sach rong.
2. Xac djnh danh sach co rong hay khong.
3. Xac djnh danh sach co day hay chua.
4. Tm so phan fu cua danh sach.
5. Iam rong danh sach.
6. Thom phan fu vao mof vj fr nao do cua danh sach.
7. IoaI phan fu faI mof vj fr nao do cua danh sach.
8. Truy xuaf phan fu faI mof vj fr nao do cua danh sach.
9. Thay fho phan fu faI mof vj fr nao do cua danh sach.
10. uyof danh sach, fhuc hIon mof cong vIoc cho fruoc fron moI phan fu.

NgoaI ra con mof so fac vu khac co fho ap Ion mof chuoI noI fIop cac phan fu.
Chung fa co fho xay dung raf nhIou dang khac nhau cho cac kIou cau fruc du IIou
fruu fuong fuong fu bang cach su dung cac goI fac vu khac nhau. af ky mof frong
cac dang nay dou co fho duoc djnh nghIa cho fon goI CTI danh sach. Tuy nhIon,
chung fa chI fap frung vao mof danh sach cu fho ma cac fac vu cua no co fho duoc
xom nhu mof khuon mau do mInh hoa y fuong va cac van do can gIaI quyof fron
danh sach.
4.2. Ouc tu cuc phuong thuc cho dunh such
KhI baf dau fm hIou ngan xop, chung fa nhan manh vIoc cho dau fhong fIn
bang cach phan bIof gIua vIoc su dung ngan xop va vIoc Iap frnh cho cac fac vu
fron ngan xop. oI voI hang, chung fa fIop fuc y fuong nay va da nhanh chong
fm duoc raf nhIou cach hIon fhuc co fho co. Cac danh sach fhong dung cho phop
fruy xuaf va fhay doI baf ky phan fu nao. o do nguyon fac cho dau fhong fIn doI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 52
voI danh sach cang quan frong hon nhIou so voI ngan xop va hang. Chung fa hay
dac fa cho cac fac vu fron danh sach:

Constructor can co fruoc khI danh sach duoc su dung:

template <class Entry>
List<Entry>::List();
post: doI fuong danh sach rong da duoc fao.

Tac vu fhuc hIon fron mof danh sach da co va Iam rong danh sach:

template <class Entry>
void List<Entry>::clear();
post: MoI phan fu cua danh sach da duoc gIaI phong, danh sach fro non rong.

Cac fac vu xac djnh frang fhaI cua danh sach:

template <class Entry>
bool List<Entry>::empty() const;
post: fra vo true nou danh sach rong, nguoc IaI fra vo false. anh sach khong doI.

template <class Entry>
bool List<Entry>::full() const;
post: fra vo true nou danh sach day, nguoc IaI fra vo false. anh sach khong doI.

template <class Entry>
int List<Entry>::size() const;
post: fra vo so phan fu cua danh sach. anh sach khong doI.

Chung fa xom xof fIop cac fac vu fruy xuaf cac phan fu cua danh sach. Tuong
fu nhu doI voI ngan xop va hang, cac fac vu nay so fra vo ErrorCode khI can
fhIof.

Chung fa dung mof so nguyon do chI vj fr |position) cua phan fu frong danh
sach. Vj fr o day duoc hIou Ia fhu fu cua phan fu frong danh sach. Cac vj fr
frong danh sach duoc danh so 0, 1, 2, ...VIoc xac djnh mof phan fu frong danh
sach fhong qua vj fr raf gIong voI su su dung chI so frong day, fuy nhIon van co
mof so dIom khac nhau quan frong. Nou chung fa fhom mof phan fu vao mof vj
fr nao do frong danh sach fh vj fr cua faf ca cac phan fu pha sau so fang Ion 1.
Nou IoaI mof phan fu fh vj fr cac phan fu pha sau gIam 1. Vj fr cua cac phan
fu frong danh sach duoc xac djnh khong xof don cach hIon fhuc. oI voI danh
sach IIon fuc, hIon fhuc bang day, vj fr phan fu ro rang Ia chI so cua phan fu
frong day. Nhung chung fa cung van fhong qua vj fr do fm cac phan fu frong
danh sach IIon kof du rang danh sach IIon kof khong co chI so.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 53

Chung fa so dac fa chnh xac cac phuong fhuc IIon quan don chI mof phan fu
cua danh sach duoI day.

template <class Entry>
ErrorCode List<Entry>::insert(int position, const Entry &x);
post: Nou danh sach chua day va 0 position n, n Ia so phan fu hIon co cua danh sach,
phuong fhuc fra vo success: moI phan fu fu position don cuoI danh sach so co vj fr
fang Ion 1, x duoc fhom vao faI position; nguoc IaI, danh sach khong doI, ErrorCode so
cho bIof IoI cu fho.

Phuong fhuc insert chap nhan position bang n v no chap nhan fhom phan
fu moI ngay sau phan fu cuoI. Tuy nhIon, cac phuong fhuc sau chI chap nhan
position<n, v chung chI fhuc hIon fron nhung phan fu da co san.

template <class Entry>
ErrorCode List<Entry>::remove(int position, Entry &x);
post: Nou 0 position < n, n Ia so phan fu hIon co cua danh sach, phuong fhuc fra vo
success: phan fu faI position duoc IoaI khoI danh sach, frj cua no duoc chop vao x, cac
phan fu pha sau gIam vj fr bof 1; nguoc IaI, danh sach khong doI, ErrorCode so cho bIo f
IoI cu fho.

template <class Entry>
ErrorCode List<Entry>::retrieve(int position, Entry &x) const;
post: Nou 0 position < n, n Ia so phan fu hIon co cua danh sach, phuong fhuc fra vo
success: phan fu faI position duoc chop vao x, danh sach khong doI; nguoc IaI,
ErrorCode so cho bIof IoI cu fho. Ca haI fruong hop danh sach dou khong doI.

template <class Entry>
ErrorCode List<Entry>::replace(int position, const Entry &x);
post: Nou 0 position < n, n Ia so phan fu hIon co cua danh sach, phuong fhuc fra vo
success: phan fu faI position duoc fhay fho boI x; nguoc IaI, danh sach khong doI,
ErrorCode so cho bIof IoI cu fho.

Phuong fhuc duyof danh sach do fhuc hIon mof nhIom vu nao do cho fung
phan fu cua danh sach fhuong fo ra co IoI, dac bIof cho muc dch kIom fra. NguoI
su dung goI phuong fhuc nay khI muon fhuc hIon mof cong vIoc g do fron fung
phan fu cua danh sach. Chang han, nguoI su dung co haI ham

void update(List_Entry &x) va void modify(List_Entry &x),

va mof doI fuong the_list cua Iop List, co fho su dung Ionh

the_list.traverse(update) hoac the_list.traverse(modify)

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 54
do fhuc hIon mof frong haI ham fron Ion moI phan fu cua danh sach. Nou nguoI
su dung muon In moI phan fu cua danh sach fh goI nhu sau:

the_list.traverse(print)

voI void print(Entry &x) Ia mof ham dung do In mof phan fu cua danh sach.

KhI goI phuong fhuc traverse, nguoI su dung goI fon cua ham Iam fhong so.
Trong C++, fon cua ham ma khong co cap dau ngoac chnh Ia con fro chI don ham. Thong so hnh
fhuc visit duoI day cua phuong fhuc traverse can duoc khaI bao nhu mof con fro chI don ham.
NgoaI ra, khaI bao con fro ham Iam fhong so phaI co kIou fra vo Ia void va co fhong so fham
chIou don Entry.

template <class Entry>
void List<Entry>::traverse(void(*visit)(Entry &x));
post: Cong vIoc dac fa boI ham *visit duoc fhuc hIon Ian Iuof fron fung phan fu cua danh sach,
baf dau fu phan fu fhu 0.

Cung gIong nhu moI fhong so khac, visit chI Ia fon hnh fhuc va chI duoc
gan boI mof con fro fhuc su khI traverse baf dau fhuc fhI. Iou dIon *visit
fhay maf cho ham so duoc su dung do xu Iy cho fung phan fu cua danh sach khI
traverse fhuc fhI.

Trong phan ko fIop chung fa so hIon fhuc cac phuong fhuc nay.
4.3. Hen thuc dunh such
Chung fa da dac fa day du cac fac vu mong muon doI voI danh sach. Phan nay
so hIon fhuc chI fIof chung frong C++. Ngan xop va hang da duoc hIon fhuc ca
haI dang IIon fuc va IIon kof. Chung fa cung so Iam fuong fu cho danh sach.
4.3.1. Hen thuc dunh such len tuc
Trong hIon fhuc danh sach IIon fuc |contiguous list), cac phan fu cua danh
sach co kIou Ia Entry duoc chua frong day kch fhuoc Ia max_list. Cung gIong
nhu hIon fhuc ngan xop IIon fuc, o day chung fa can mof bIon count dom so phan
fu hIon co frong danh sach. Sau day Ia djnh nghIa Iop List co haI fhuoc fnh
fhanh phan va faf ca cac phuong fhuc ma chung fa da dac fa.

template <class Entry>
class List {
public:
// Cac phuong fhuc cua kIou du IIou fruu fuong danh sach
List();
int size() const;
bool full() const;
bool empty() const;
void clear();
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 55
void traverse(void (*visit)(Entry &));
ErrorCode retrieve(int position, Entry &x) const;
ErrorCode replace(int position, const Entry &x);
ErrorCode remove(int position, Entry &x);
ErrorCode insert(int position, const Entry &x);

protected:
// Cac fhuoc fnh cho hIon fhuc danh sach IIon fuc
int count;
Entry entry[max_list];
};

Hau hof cac phuong fhuc (List, clear, empty, full, size, retrieve)
raf do hIon fhuc.

template <class Entry>
int List<Entry>::size() const
/*
post: fra vo so phan fu cua danh sach. anh sach khong doI.
*/
{
return count;
}

Chung fa danh cac phuong fhuc don gIan khac IaI cho phan baI fap. O day
chung fa so fap frung vao cac phuong fhuc fruy xuaf du IIou. KhI fhom mof phan
fu moI, cac phan fu frong day phaI duoc dI chuyon do nhuong cho.

template <class Entry>
ErrorCode List<Entry>::insert(int position, const Entry &x)
/*
post: Nou danh sach chua day va 0 position n, n Ia so phan fu hIon co cua danh sach,
phuong fhuc fra vo success: moI phan fu fu position don cuoI danh sach so co vj fr
fang Ion 1, x duoc fhom vao faI position; nguoc IaI, danh sach khong doI, ErrorCode so
cho bIof IoI cu fho.
*/
{
if (full())
return overflow;
if (position < 0 || position > count)
return range_error;
for (int i = count - 1; i >= position; i--)
entry[i + 1] = entry[i];
entry[position] = x;
count++;
return success;
}

Co bao nhIou cong vIoc ma ham fron ca n phaI Iam7 Nou phan fu moI duoc
fhom vao cuoI danh sach fh ham chI phaI fhuc hIon mof so khong doI cac Ionh.
Trong fruong hop nguoc IaI, nou phan fu duoc fhom vao dau danh sach, ham so
phaI djch chuyon mof so phan fu Ion nhaf do fao cho frong, nou danh sach da
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 56
kha daI fh cong vIoc can Iam raf nhIou. Xof bnh quan, nou chung fa gIa su moI
vj fr frong danh sach dou co kha nang fhom phan fu moI nhu nhau, ham fron so
phaI djch chuyon mof nua so phan fu frong danh sach. Chung fa noI rang so vIoc
can Iam frong ham fI Io voI chIou daI n cua danh sach.

Tuong fu, vIoc IoaI phan fu frong danh sach cung can phaI djch chuyon cac
phan fu do Iap cho frong va vIoc IoaI nay cung fon fhoI gIan fI Io voI chIou daI n
cua danh sach.

Khac voI haI fruong hop fron, hau hof cac phuong fhuc con IaI khong can fhuc
hIon vong Iap nao va fhoI gIan fhuc hIon Ia hang so. Tom IaI,

Trong xu Iy danh sach IIon fuc co n phan fu:
insert va remove can fhoI gIan fI Io voI n.
List, clear, empty, full, size, replace va retrieve fhuc hIon
frong fhoI gIan khong doI.
Chung fa chua ko ra day phuong fhuc traverse v fhoI gIan fhuc hIon con
phu fhuoc vao fhong so ham vIsIf. RIong traverse fh f nhaf cung can fhoI gIan
fI Io voI n do phaI co vong Iap do duyof qua hof cac phan fu cua danh sach. Tuy
nhIon, voI cung mof ham visit fh traverse can fhoI gIan fI Io voI n.

template <class Entry>
void List<Entry>::traverse(void (*visit)(Entry &))
/*
post: Cong vIoc dac fa boI ham *visit duoc fhuc hIon Ian Iuof fron fung phan fu cua danh sach,
baf dau fu phan fu fhu 0.
*/
{
for (int i = 0; i < count; i++)
(*visit)(entry[i]);
}
4.3.2. Hen thuc dunh such len ket don gun
4.3.2.1. Cuc khu buo
o hIon fhuc danh sach IIon kof |linked list), chung fa baf dau voI khaI bao
Node. Node duoI day cung fuong fu nhu frong ngan xop IIon kof va hang IIon
kof.
template <class Entry>
struct Node {
// Cac fhuoc fnh
Entry entry;
Node<Entry> *next;
// constructors
Node();
Node(Entry item, Node<Entry> *link = NULL);
};
template <class Entry>
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 57
class List {
public:
// Cac phuong fhuc cua danh sach IIon kof |cung gIong nhu cua danh sach IIon fuc)
// Cac phuong fhuc bao dam fnh an foan cho CTI co chua fhuoc fnh con fro.
~List();
List(const List<Entry> &copy);
void operator =(const List<Entry> &copy);
protected:
// Cac fhuoc fnh cho hIon fhuc IIon kof cua danh sach
int count;
Node<Entry> *head; // Con fro chI phan fu dau cua danh sach.

// The following auxiliary function is used to locate list positions
Node<Entry> *set_position(int position) const;
};

Trong djnh nghIa fron chung fa khong IIof ko IaI cac phuong fhuc cua danh
sach IIon kof v chung cung fuong fu nhu doI voI danh sach IIon fuc. Trong phan
protected chung fa co bo sung phuong fhuc set_position ma chung fa so fhay
ch IoI cua no frong khI hIon fhuc cac phuong fhuc public khac.
4.3.2.2. VI du
Hnh 4.1 mInh hoa vIoc fhom bof du IIou frong danh sach qua mof v du sua
doI van ban. MoI phan fu frong danh sach chua mof fu va mof fham chIou don
phan fu ko. Hnh a Ia danh sach chua cau ban dau Ia Stacks are lists . No u
chung fa fhom fu simple fruoc fu lists chung fa co danh sach nhu hnh b. TIop
fhoo chung fa quyof djnh fhay fho fu lists boI fu structures va fhom ba fu but
important data fh co hnh c. CuoI cung chung fa IaI quyof djnh bo dI cac fu
simple but do co duoc cau cuoI cung Stacks are important data structures.
4.3.2.3. TIm den mot v{ trI trong dunh such
Chung fa fhIof ko mof ham set_position do duoc goI frong mof vaI phuong
fhuc. Ham nay nhan fhong so Ia position |mof so nguyon chI vj fr phan fu
frong danh sach) va fra vo con fro fham chIou don phan fu fuong ung frong danh
sach.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 58

Nou nguoI su dung nhn fhay duoc set_position fh ho so co fho fruy xuaf
don moI phan fu frong danh sach. V vay, do duy fr fnh dong kn cua du IIou,
chung fa so khong cho phop nguoI su dung nhn fhay ham set_position. ang
cach khaI bao protected chung fa bao dam rang ham nay chI duoc goI frong cac
phuong fhuc khac cua danh sach.

Cach do nhaf do xay dung ham set_position Ia baf dau duyof fu dau cua
danh sach cho don phan fu ma chung fa muon fm.

template <class Entry>
Node<Entry> *List<Entry>::set_position(int position) const
/*
HInh 4.1- Cac fhao fac fron danh sach IIon kof.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 59
Pre: position phaI hop Io; 0 <= position < count.
Post: fra vo dja chI cua phan fu faI position.
*/
{
Node<Entry> *q = head;
for (int i = 0; i < position; i++) q = q->next;
return q;
}

o chung fa nam duoc chnh xac cac phuong fhuc nao can goI don
set_position, frong ham nay chung fa khong can kIom fra IoI. Thay vao do
chung fa bao dam bang precondition cho no. Co nghIa Ia cac phuong fhuc fruoc
khI goI set_position so kIom fra fruoc va chI goI khI dIou kIon hop Io. VIoc
kIom fra so khong phaI Iap IaI frong ham nay, chuong frnh so hIou qua hon.
Nou moI phan fu duoc fruy xuaf voI xac suaf ngang nhau fh frung bnh ham
set_position so phaI duyof qua mof nua so phan fu frong danh sach do don
duoc vj fr can fhIof. ThoI gIan nay fI Io voI chIou daI n cua danh sach.
4.3.2.4. Them phun tu vuo dunh such
TIop fhoo chung fa so xom xof van do fhom mof phan fu moI vao danh sach.
Nou chung fa co mof phan fu moI va chung fa muon chon phan fu nay vao mof vj
fr nao do frong danh sach, ngoaI fru vj fr dau danh sach, nhu hnh 4.2, chung fa
can co haI con fro previous va following chI don haI phan fu fruoc va sau vj
fr can chon. Nou con fro new_node dang chI phan fu moI can chon fh cac Ionh
gan sau so chon duoc phan fu moI vao danh sach:

new_node->next = following;
previous->next = new_node;

Trong phuong fhuc insert duoI day phop gan new_node->next= following
duoc fhuc hIon fhong qua constructor co nhan fhong so fhu haI Ia following.
VIoc fhom phan fu vao dau danh sach can duoc xu Iy rIong, do fruong hop nay
khong co phan fu nao nam fruoc phan fu moI non chung fa khong su dung con fro
previous, fhay vao do fhuoc fnh head chI don phan fu dau cua danh sach phaI
duoc gan IaI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 60



template <class Entry>
ErrorCode List<Entry>::insert(int position, const Entry &x)
/*
post: Nou danh sach chua day va 0 position n, n Ia so phan fu hIon co cua danh sach,
phuong fhuc fra vo success: moI phan fu fu position don cuoI danh sach so co vj fr fang
Ion 1, x duoc fhom vao faI position; nguoc IaI, danh sach khong doI, ErrorCode so cho
bIof IoI cu fho.
*/
{
if (position < 0 || position > count)
return range_error;
Node<Entry> *new_node, *previous, *following;
if (position == 0) // Truong hop dac bIof: phan fu moI fhom vao dau danh sach.
following = head;
else { // Truong hop fong quaf.
previous = set_position(position - 1); // Tm phan fu pha fruoc vj fr can fhom
phan fu moI.
following = previous->next;
}

new_node = new Node<Entry>(x, following);
if (new_node == NULL)
return overflow;
if (position == 0) // Truong hop dac bIof: phan fu moI fhom vao dau danh sach.
head = new_node;
else // Truong hop fong quaf.
previous->next = new_node;
count++;
return success;
}


HInh 4.2- Thom phan fu vao danh sach IIon kof.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 61
NgoaI Ionh goI ham set_position, cac Ionh con IaI frong insert khong phu
fhuoc vao chIou daI n cua danh sach. o do insert, cung gIong nhu
set_position, so co fhoI gIan fhuc hIon fI Io voI chIou daI n cua danh sach.
4.3.2.5. Cuc tuc vu khuc
Cac phuong fhuc con IaI cua danh sach IIon kof xom nhu baI fap. VIoc fm
kIom mof phan fu nao do frong cac phuong fhuc Iuon phaI goI ham
set_position. Hau hof cac phuong fhuc nay cung gIong nhu insert, su dung
cac Ionh chIom fhoI gIan khong doI, ngoaI fru Iuc goI ham set_position. ChI co
phuong fhuc clear va traverse Ia phaI duyof qua cac phan fu cua danh sach.
Chung fa co kof Iuan nhu sau:

Trong vIoc xu Iy mof danh sach IIon kof co n phan fu:

insert, remove, retrieve va replace can fhoI gIan fI Io voI n.
List, empty, full va size fhuc hIon voI fhoI gIan khong doI.

Mof Ian nua, chung fa chua ko don phuong fhuc traverse o day, v fhoI gIan
no can con phu fhuoc vao fhong so visit. Tuy nhIon, cung nhu phan fruoc, voI
cung mof ham vIsIf fh traverse can fhoI gIan fI Io voI n.
4.3.3. Luu lu v{ trI hen tu
a so cac ung dung fruy xuaf cac phan fu cua danh sach fhoo fhu fu cac phan
fu. NhIou ung dung khac fruy xuaf cung mof phan fu nhIou Ian, fhuc hIon cac fac
vu fruy xuaf hoac fhay fho fruoc khI chuyon qua phan fu khac. oI voI faf ca cac
ung dung nay, cach hIon fhuc danh sach hIon faI cua chung fa fo ra khong hIou
qua, do moI Ian fruy xuaf mof phan fu, ham sof_posIfIon dou phaI fm fu dau
danh sach don phan fu mong muon. Nou chung fa co fho nho IaI phan fu vua duoc
fruy xuaf frong danh sach, va fac vu ma ung dung you cau fIop fhoo cung xom xof
phan fu nay hoac phan fu ko fh vIoc fm kIom baf dau fu vj fr duoc nho nay
nhanh hon raf nhIou.

Tuy nhIon, khong phaI vIoc nho IaI vj fr vua duoc fruy xuaf nay Iuon co hIou
Iuc doI voI moI ung dung. Chang han voI ung dung fruy xuaf cac phan fu frong
danh sach fhoo fhu fu nguoc, moI fruy xuaf dou phaI baf dau fu dau danh sach do
cac fham chIou frong cac phan fu chI co mof chIou.

Chung fa dung fhuoc fnh current_position do Iuu vj fr vua noI fron.
Thuoc fnh nay so duoc set_position su dung cung nhu so cap nhaf IaI moI khI
ham nay duoc goI. Iou can Iuu y Ia set_position duoc goI frong cac phuong fhuc khac cua
danh sach, frong do co mof so phuong fhuc duoc dac fa Ia const co nghIa Ia khong duoc Iam fhay
doI danh sach, frong khI do current_position phaI duoc fhay doI. Nhu vay, chung fa so dung fu
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 62
khoa mutable cua C++ nhung Iuu y rang khong phaI fu khoa nay Iuon duoc cung cap boI moI
frnh bIon djch C++. KhI mof fhuoc fnh cua mof Iop duoc khaI bao Ia mutable fh no co fho duoc
fhay doI ngay ca frong cac ham duoc khaI bao Ia const.

jnh nghIa danh sach moI nhu sau:

template <class Entry>
class List {
public:
// Cac phuong fhuc cua danh sach IIon kof |cung gIong nhu cua danh sach IIon fuc)
// Cac phuong fhuc bao dam fnh an foan cho CTI co chua fhuoc fnh con fro.

protected:
// Cac fhuoc fnh cho hIon fhuc IIon kof cua danh sach co Iuu vj fr hIon faI.
int count;
mutable int current_position;
Node<Entry> *head;
mutable Node<Entry> *current;

// Ham phu fro do fm mof phan fu.
void set_position(int position) const;
};

HaI fhuoc fnh duoc fhom vao current_position va current dou duoc khaI
bao protected, do do doI voI nguoI su dung Iop List van khong co g fhay doI so
voI djnh nghIa cu.

Ham set_position duoc vIof IaI nhu sau:

template <class Entry>
void List<Entry>::set_position(int position) const
/*
pre: position hop Io: 0 <= position < count.
post: Thuoc fnh current chua dja chI phan fu duoc fm fhay faI position,
current_position duoc cap nhaf fuong ung.
*/
{
if (position < current_position) { // Truong hop phaI fm fu dau danh sach
current_position = 0;
current = head;
}
for ( ; current_position != position; current_position++)
current = current->next;
}

Nou mof phan fu frong danh sach duoc fruy xuaf Iap IaI nhIou Ian fh cac Ionh
frong if cung nhu frong vong for cua ham fron dou khong phaI fhuc hIon, ham
so khong ho chIom fhoI gIan chay. Nou phan fu ko duoc fruy xuaf, cac Ionh frong
vong for chI chay mof Ian, ham van fhuc hIon raf nhanh. Trong fruong hop xau
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 63
nhaf, nou can phaI baf dau fu dau danh sach, ham cung so Iam vIoc gIong nhu
cach chung fa da hIon fhuc fruoc day.
4.3.4. Ounh such len ket kep
Mof vaI ung dung fhuong xuyon you cau djch chuyon foI va IuI fron danh sach.
Trong phan fruoc chung fa da gIaI quyof vIoc djch chuyon fhoo mof chIou frong
qua frnh duyof danh sach. Nhung vIoc Iap frnh hoI kho khan va fhoI gIan chay
chuong frnh phu fhuoc vao danh sach, nhaf Ia khI danh sach co nhIou phan fu.

o khac phuc van do nay, co nhIou chIon Iuoc khac nham gIaI quyof vIoc fm
phan fu nam fruoc phan fu hIon faI frong danh sach. Trong phan nay chung fa
fm hIou mof chIon Iuoc don gIan nhaf nhung cung IInh dong va phu hop frong
raf nhIou fruong hop.


4.3.4.1. Cuc khu buo cho dunh such len ket kep
Nhu hnh 4.3 mInh hoa, y fuong o day Ia vIoc Iuu ca haI con fro chI haI
huong nguoc nhau frong cung mof node cua danh sach. ang cach djch chuyon
fhoo fham chIou fhch hop chung fa co fho duyof danh sach fhoo huong mong
muon. CTI nay duoc goI Ia danh sach IIon kof kop |doubly linked list).

template <class Node_entry>
struct Node {
// Cac fhuoc fnh
Node_entry entry;
Node<Node_entry> *next;
Node<Node_entry> *back;
// constructors
Node();
Node(Node_entry, Node<Node_entry> *link_back = NULL,
Node<Node_entry> *link_next = NULL);
};

Constructor cho Node cua danh sach IIon kof kop gan gIong constructor cho
Node cua danh sach IIon kof don. uoI day Ia dac fa cho Iop danh sach IIon kof
kop:




HInh 4.3- anh sach IIon kof kop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 64
template <class Entry>
class List {
public:
// Cac phuong fhuc fhong fhuong cua danh sach.
// Cac phuong fhuc bao dam fnh an foan cho CTI co fhuoc fnh con fro.
protected:
// Cac fhuoc fnh
int count;
mutable int current_position;
mutable Node<Entry> *current;

// Ham phu fro do fm don mof phan fu frong danh sach
void set_position(int position) const;
};

Trong cach hIon fhuc nay chung fa chI can gIu mof con fro fham chIou don
mof phan fu nao do frong danh sach Ia chung fa co fho duyof danh sach fhoo
huong nay hoac huong kIa. Nhu vay, chung fa dung Iuon con fro current chI don
phan fu hIon faI do Iam nhIom vu nay, va chung fa khong can gIu con fro chI don
dau hoac cuoI danh sach.
4.3.4.2. Cuc tuc vu tren dunh such len ket kep
Trong danh sach IIon kof kop, vIoc duyof danh sach fhoo ca haI huong do fm
mof phan fu, vIoc fhom hoac IoaI phan fu faI vj fr nao do co fho duoc fhuc hIon
do dang. Mof vaI fac vu co fhay doI chuf f so voI danh sach IIon kof don, nhu
insert va delete, do phaI cap nhaf day du ca haI con fro fhoo haI huong cua
danh sach .

Truoc hof, do fm mof vj fr nao do, chung fa chI can quyof djnh non duyof
fhoo huong nao frong danh sach baf dau fu con fro current.

template <class Entry>
void List<Entry>::set_position(int position) const
/*
pre: position hop Io: 0 <= position < count.
post: fhuoc fnh current chua dja chI cua phan fu faI position.
*/
{
if (current_position <= position)
for ( ; current_position != position; current_position++)
current = current->next;
else
for ( ; current_position != position; current_position--)
current = current->back;
}

VoI ham nay chung fa vIof fac vu insert sau day. Hnh 4.4 mInh hoa cac con
fro can phaI cap nhaf. Chung fa cung dac bIof chu y haI fruong hop hoI dac bIof,
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 65
do Ia khI fhom phan fu vao mof frong haI dau cua danh sach hoac fhom vao mof
danh sach rong.

template <class Entry>
ErrorCode List<Entry>::insert(int position, const Entry &x)
/*
post: Nou danh sach chua day va 0 position n, n Ia so phan fu hIon co cua danh sach,
phuong fhuc fra vo success: moI phan fu fu position don cuoI danh sach so co vj fr
fang Ion 1, x duoc fhom vao faI position; nguoc IaI, danh sach khong doI, ErrorCode so
cho bIof IoI cu fho.
*/
{
Node<Entry> *new_node, *following, *preceding;
if (position < 0 || position > count) return range_error;
if (position == 0) {
if (count == 0) following = NULL; // Truong hop dac bIo f: danh sach dang
rong.
else {
set_position(0);
following = current;
}
preceding = NULL; // Truong hop dac bIo f: fhom phan fu moI
vao dau danh sa ch, khong co pha n fu
dung fruoc.
}
else {
set_position(position - 1);
preceding = current;
following = preceding->next; // Truo ng hop fong qua f: fhom pha n fu
vao gIua, nhung gop ca fruong hop
fhom vao cuo I |position = n)
following so nha n frj NULL.
}
new_node = new Node<Entry>(x, preceding, following);

if (new_node == NULL) return overflow;
if (preceding != NULL) preceding->next = new_node;
if (following != NULL) following->back = new_node;
current = new_node;
HInh 4.4- Thom phan fu va danh sach IIon kof kop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 66
current_position = position;
count++;
return success;
}
CIa phaI fra doI voI danh sach IIon kof kop Ia vung nho cho fham chIou fhu
haI frong moI Node. VoI phan Ion ung dung, do vung entry can chua fhong fIn
frong Node Ion hon nhIou vung nho danh cho cac con fro, non fong dung Iuong bo
nho fang khong dang ko.
4.4. So sunh cuc cuch hen thuc cuu dunh such
Chung fa da xom xof mof vaI gIaI fhuaf xu Iy cho danh sach IIon kof va mof
vaI bIon fho vo cau fruc va cach hIon fhuc. Trong phan nay chung fa so phan fch
cac uu nhuoc dIom cua danh sach IIon kof va danh sach IIon fuc.

!u dIom Ion nhaf cua danh sach IIon kof frong bo nho dong Ia fnh mom doo.
Khong co van do fran bo nho fru khI bo nho may fnh fhuc su da duoc su dung
hof. ac bIof khI mof entry chua fhong fIn qua Ion, chung fa kho co fho xac djnh
fong dung Iuong vung nho nhu fho nao cho vua du do khaI bao mof day, frong khI
chung fa cung can phaI xof don phan bo nho con IaI sao cho du do danh cho cac
bIon khac. Trong bo nho dong, chung fa khong can phaI quyof djnh dIou nay
fruoc khI chuong frnh chay.

Trong danh sach IIon kof, vIoc fhom hay IoaI phan fu co fho fhuc hIon nhanh
hon so voI frong danh sach IIon fuc. oI voI cac CTI Ion, vIoc fhay doI mof vaI
con fro nhanh hon raf nhIou so voI vIoc chop du IIou sang cho khac.

Nhuoc dIom dau fIon cua danh sach IIon kof Ia fon vung nho cho cac con fro.
Trong phan Ion ho fhong, mof con fro chIom vung nho bang vung nho cua mof so
nguyon. Nhu vay mof danh sach IIon kof cac so nguyon so doI hoI vung nho gap
doI mof danh sach IIon fuc cac so nguyon.

Trong nhIou ung dung fhuc fIon, mof node frong danh sach fhuong Ion, du
IIou fhuong chua hang fram bytes, vIoc su dung danh sach IIon kof chI fon fhom
khoan mof phan fram vung nho. Thuc ra, danh sach IIon kof fIof kIom vung nho
hon nhIou, nou xof don nhung vung nho duoc khaI bao du fru san cho vIoc fhom
phan fu frong danh sach IIon fuc ma chua duoc dung don. Nou moI entry chIom
100 bytes fh vung nho IIon fuc chI fIof kIom khI so phan fu su dung fhuc su frong
day Ion don 99 bytes.

Nhuoc dIom chnh cua danh sach IIon kof Ia no khong fhch hop voI vIoc fruy
xuaf ngau nhIon. Trong vung nho IIon fuc, vIoc fruy xuaf don baf ky vj fr nao
cung raf nhanh va khong khac g so voI nhung vj fr khac. Trong danh sach IIon
kof, co fho phaI duyof ca chang duong daI moI don duoc phan fu mong muon. VIoc
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 67
fruy xuaf mof node frong vung nho IIon kof cung chIom hon mof chuf fhoI gIan v
fruoc hof phaI co duoc con fro va sau do moI don duoc dja chI can fm, fuy nhIon
dIou nay fhuong khong quan frong. NgoaI ra, cac fac vu xu Iy frong danh sach
IIon kof fhuong phaI Iap frnh cong phu hon.

anh sach IIon fuc, noI chung, fhuong duoc chon khI:
MoI entry raf nho.
Kch fhuoc cua danh sach duoc bIof fruoc khI Iap frnh.
If co nhu cau fhom hoac IoaI phan fu fru fruong hop phan fu cuoI danh
sach.
VIoc fruy xuaf ngau nhIon fhuong xay ra.

anh sach IIon kof fo ra uu fho khI:
MoI entry Ion.
Kch fhuoc cua danh sach khong duoc bIof fruoc khI ung dung chay.
Co you cau vo fnh IInh hoaf: fhom, IoaI phan fu hoac fo chuc IaI cac
phan fu.

o chon Iua CTI voI cach hIon fhuc fhch hop, nguoI Iap frnh can xom xof
cac fac vu nao so duoc fhuc hIon fron cau fruc do, fac vu nao frong so do Ia quan
frong nhaf. VIoc fruy xuaf Ia cuc bo nou mof phan fu duoc fruy xuaf, no co fho
duoc fruy xuaf Ian nua. Va nou cac phan fu fhuong duoc fruy xuaf fhoo fhu fu, fh
non nho IaI vj fr phan fu vua duoc fruy xuaf nhu Ia mof fhuoc fnh cua danh
sach. Con nou vIoc fruy xuaf fhoo haI huong cua danh sach Ia can fhIof fh non
chon cach hIon fhuc danh sach IIon kof kop.
4.5. Ounh such len ket trong mung len tuc
Mof vaI ngon ngu fuy xua nhung raf pho bIon nhu Iorfran, CoboI va asIc
khong cung cap kha nang su dung bo nho dong hoac con fro. Nou can su dung
cac ngon ngu nay do gIaI quyof cac baI foan ma frong do cac fac vu fron danh
sach IIon kof |SIK) fo ra co uu fho hon han fron danh sach IIon fuc |vIoc fhay
doI mof vaI con fro do dang va nhanh chong hon nhIou vIoc phaI chop IaI mof so
Iuong Ion du IIou), chung fa van co fho su dung mang IIon fuc do mo phong SIK.
Trong phan nay chung fa so fm hIou mof hIon fhuc cua SIK ma khong can con
fro. Hay noI cach khac, chung fa khong dung con fro chua dja chI, ma so dung con
fro Ia mof so nguyon, va SIK so duoc hIon fhuc frong mof mang IIon fuc.
4.5.1. Phuong phup
Y fuong chnh o day baf dau fu mof mang IIon fuc dung do chua cac phan fu
cua mof SIK. Chung fa xom mang nay nhu mof vung nho chua su dung va
chung fa so fu phan phoI Iay. Chung fa so xay dung mof so ham do quan Iy mang
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 68
nay: nhan bIof vung nao frong mang chua duoc su dung, noI kof cac phan fu frong
mang fhoo mof fhu fu mong muon.

Mof dac dIom cua SIK ma chung fa phaI bo qua frong phan nay Ia vIoc
djnh vj bo nho dong, ngay fu dau chung fa phaI xac djnh kch fhuoc can fhIof cho
mang. MoI uu dIom con IaI khac cua SIK dou duoc gIu nguyon, nhu fnh mom
doo frong vIoc fo chuc IaI vung nho cho cac phan fu co kch fhuoc Ion, hoac fnh
do dang va hIou qua frong vIoc fhom hay bof baf cu phan fu nao frong danh sach.

HIon fhuc SIK frong mang IIon fuc cung fo ra raf hIou qua frong nhung
ngon ngu fua C++ co cung cap con fro va cach djnh vj bo nho dong. Cac ung dung
duoI day duoc xom Ia fhch hop khI su dung SIK frong mang IIon fuc :

So phan fu foI da frong danh sach duoc bIof fruoc.
Cac fham chIou fhuong xuyon duoc fo chuc IaI, nhung vIoc fhom hoac IoaI
phan fu fuong doI f xay ra.
Cung du IIou nhung co khI can xu Iy nhu SIK co khI IaI can xu Iy nhu
danh sach IIon fuc.

Hnh 4.5 Ia mof v du mInh hoa cho nhung ung dung nhu vay. ay Ia mof
phan du IIou chua cac fhong fIn vo sInh vIon. Ma sInh vIon duoc gan cho cac sInh
vIon fhoo fhu fu nhap fruong, fon va dIom so khong fhoo mof fhu fu dac bIof
nao. Thong fIn vo sInh vIon co fho duoc fm fhay nhanh chong dua vao ma sInh
vIon do so nay duoc dung nhu chI so do fm frong mang IIon fuc. Tuy nhIon, fhInh
fhoang chung fa can In danh sach sInh vIon co fhu fu fhoo fon, va dIou nay co fho
Iam duoc bang cach Ian fhoo cuc thum cheu duoc luu trong mung
next_name. Tuong fu, cac dIom so cung co fho sap fhu fu nho cac fham chIou
frong cac mang fuong ung.

o fhay duoc cach hIon fhuc nay cua SIK Iam vIoc nhu fho nao, chung fa
hay duyof SIK next_name frong phan dau cua hnh 4.5. au vao cua danh
sach chua frj Ia 8, co nghIa Ia phan fu frong vj fr 8, Arfhur, ., Ia phan fu dau
fIon cua danh sach. Vj fr 8 cua next_name chua frj 0, co nghIa Ia fon o vj fr 0,
CIark, I., Ia phan fu fhu haI. Vj fr 0 cua next_name chu frj 5, vay vans, ., Ia
phan fu ko fIop. Vj fr 5 chI don vj fr 3 |CarcIa, T.), vj fr 3 IaI chI v fr 4 |HaII,
W.), va vj fr 4 chI vj fr 1 |SmIfh, A.). TaI vj fr 1, next_name chua frj -1, co
nghIa Ia vj fr 1 Ia phan fu cuoI cung cua danh sach.

Tuong fu, mang next_math bIou dIon mof SIK, cho phop fruy xuaf mang
math fhoo fhu fu gIam dan. Phan fu dau fIon faI vj fr 5, ko don Ia 3, 1, 0, 4, 8.
Thu fu cac phan fu xuaf hIon frong SIK bIou dIon boI next_CS Ia 1, 3, 5, 8, 4,
0.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 69

Nhu v du frong hnh 4.5, hIon fhuc cua SIK frong mang IIon fuc co duoc
fnh IInh hoaf cua SIK doI voI nhung su fhay doI. NgoaI ra no con co kha nang
chIa so fhong fIn |chang han fon sInh vIon) gIua cac SIK khac nhau. HIon fhuc
nay cung con co uu dIom cua danh sach IIon fuc Ia co fho fruy xuaf ngau nhIon
cac phan fu nho cach su dung chI so fruy xuaf fruc fIop.

Trong hIon fhuc cua SIK frong mang IIon fuc, cac con fro fro fhanh cac chI
so fuong doI so voI dIom baf dau cua danh sach. Cac fham chIou cua danh sach
chua frong mof mang, moI phan fu cua mang chua mof so nguyon chI don vj fr
cua phan fu ko cua danh sach frong mang chua du IIou. o phan bIof voI cac con
fro |pointer) cua SIK frong bo nho dong, chung fa so dung fu ch so |index) do
goI cac fham chIou nay.

Chung fa can khaI bao haI mang IIon fuc cho moI SIK, entry[ ] do chua du
IIou, va next_node[ ] do chua chI so chI don phan fu ko. oI voI phan Ion cac
ung dung, entry Ia mof mang ma moI phan fu Ia mof cau fruc, hoac mof vaI
mang frong fruong hop ngon ngu Iap frnh khong cung cap kIou cau fruc. Ca haI
mang entry va next_node can danh chI so fu 0 don max_list-1, max_list Ia
mof hang so bIof fruoc.

o chung fa dung chI so baf dau fu 0, chung fa so dung frj dac bIof 1 do bIou
dIon danh sach da kof fhuc, fuong fu nhu frj NULL cua con fro frong bo nho dong.

HInh 4.5- SIK frong mang IIon fuc.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 70
4.5.2. Cuc tuc vu quun ly vung nho

NhIom vu dau fIon cua chung fa Ia nam duoc cac vung nho con frong do vIof
mof so ham fm mof vj fr moI hay fra mof vj fr khong su dung nua vo IaI vung
nho frong. Khac voI phan 4.3.2, foan bo vung nho ma chung fa so dung o day Ia
mof mang IIon fuc goI Ia workspace, cac phan fu cua no fuong ung voI cac phan
fu frong SIK |hnh 4.6). Chung fa cung so goI cac phan fu frong workspace Ia
node va so khaI bao Node do chua du IIou. MoI Node Ia mof cau fruc gom haI
phan: entry kIou Entry chua du IIou, va next kIou index. KIou index duoc hIon
fhuc bang so nguyon, co cac frj bIou dIon vj fr cac phan fu frong mang IIon fuc,
va nhu vay no fhay fho kIou con fro nhu frong cac SIK fruoc day.

Cac vj fr frong frong workspace co haI dang:
Cac node chua duoc su dung foI.
Cac node da fung duoc su dung nhung da duoc gIaI phong.

Chung fa so baf dau su dung fu dau mang IIon fuc va dung chI so last_used
chua vj fr cuoI vua moI su dung frong mang. Cac vj fr frong mang co chI so Ion
hon last_used Ia cac vj fr chua ho duoc su dung.

Cac node dang chua du IIou so fhuoc mof SIK co dau vao Ia head. Head chua
vj fr cua phan fu dau cua SIK frong mang. Cac node ko fIop frong SIK nay
duoc fruy xuaf fhong qua cac chI so frong fhanh phan next cua cac node, bIou
dIon boI cac muI fon bon fraI cua next_node frong hnh 4.6. Node cuoI cung cua
SIK co chI so Ia 1. Chung fa doc duoc danh sach co cac fon sap fhoo fhu fu
alphabet baf dau fu head = 8, Arfhur, . nam dau danh sach, roI don cac fon faI
cac vj fr 0, 5, 3, 4, 1 cua mang; SmIfh, A. Ia fon nam cuoI danh sach.

oI voI nhung node da fung su dung va da duoc gIaI phong, chung fa so dung
mof dang cua cau fruc IIon kof do noI kof chung IaI voI nhau va do co fho fruy
xuaf don, fu node nay don node ko. o ngan xop IIon kof Ia mof dang don gIan
nhaf cua cau fruc IIon kof, chung fa so dung ngan xop IIon kof cho fruong hop
nay. Ngan xop IIon kof cung duoc noI kof nho chI so next frong moI node,
available Ia mof chI so chua top cua ngan xop.

Cac muI fon bon phaI cua next_node frong hnh 4.6, voI dau vao Ia
available, chI cac node frong mof ngan xop bao gom cac node da fung duoc su
dung va da duoc gIaI phong. Chu y rang chI so frong cac vung next cua ngan xop
IIon kof nay chnh xac Ia cac so last_used, do cung Ia cac vj fr frong mang
hIon faI khong co du IIou. af dau fu available = 7, roI don 6, 9, 10, 2. Con cac
vj fr fu last_used+1 fro dI Ia cac vj fr chua ho co du IIou.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 71

KhI co mof node bj IoaI khoI SIK chua du IIou |chang han IoaI fon mof sInh
vIon ra khoI danh sach), vj fr cua no frong mang duoc gIaI phong va duoc push
vao ngan xop IIon kof. Nguoc IaI, khI can fhom mof node moI vao SIK, chung
fa fm vj fr frong bang cach pop mof phan fu ra khoI ngan xop IIon kof: frong
hnh 4.6 fh node moI so duoc fhom vao vj fr 7 cua mang, con available duoc
cap nhaf IaI Ia 6. ChI khI can fhom mof node moI vao SIK ma available=-1
|ngan xop IIon kof rong), chung fa moI dung don mof node moI chua ho su dung
don, do Ia vj fr last_used+1, last_used duoc cap nhaf IaI. KhI last_used
daf max_list1, ma available=-1, fh workspace day, danh sach cua chung fa
khong cho phop fhom node moI nua.

KhI doI fuong List duoc khoI fao, available va last_used phaI duoc gan -
1: available=-1 chI ra rang ngan xop chua cac vung nho da fung duoc su dung
va da duoc gIaI phong Ia rong, last_used=-1 chI rang chua co vung nho nao
frong mang da duoc su dung.

Chung fa co khaI bao SIK frong mang IIon fuc nhu sau:

typedef int index;
const int max_list = 7; // gIa frj nho danh cho vIoc kIom fra CTI.
template <class Entry>
class Node {
public:
Entry entry;
index next;
};

template <class Entry>
class List {

HInh 4.6- SIK frong mang IIon fuc va ngan xop IIon kof chua cac vung co fho su dung.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 72
public:
// Methods of the list ADT
List();
int size() const;
bool full() const;
bool empty() const;
void clear();
void traverse(void (*visit)(Entry &));
Error_code retrieve(int position, Entry &x) const;
Error_code replace(int position, const Entry &x);
Error_code remove(int position, Entry &x);
Error_code insert(int position, const Entry &x);

protected:
// Cac fhuoc fnh
Node<Entry> workspace[max_list];
index available, last_used, head;
int count;

// Cac ham phu fro
index new_node();
void delete_node(index n);
int current_position(index n) const;
index set_position(int position) const;
};

Cac phuong fhuc public fron duoc dac fa hoan foan gIong voI cac hIon fhuc khac
cua List fruoc day. Iou nay co nghIa Ia hIon fhuc moI cua chung fa co fho fhay
fho baf ky mof hIon fhuc nao khac cua CTI fruu fuong List frong cac ung
dung. Mof so ham phu fro protected duoc bo sung do quan Iy cac node frong
workspace. Chung duoc su dung do xay dung cac phuong fhuc public nhung
khong duoc nhn fhay boI nguoI su dung. Cac ham new_node va delete_node
fhay fho cho cac fac vu new va delete cua C++. Chang han, new_node fra vo chI
so cua mof vung dang frong cua workspace |do fhom phan fu moI cho danh
sach).

template <class Entry>
index List<Entry>::new_node()
/*
post: Tra vo chI so cua phan fu dau fIon co fho su dung frong workspace; cac fhuoc fnh
available, last_used, va workspace duoc cap nhaf nou can fhIou .
Nou workspace fhuc su day, fra vo -1.
*/

{
index new_index;

if (available != -1) { // ngan xop chua rong.
new_index = available; // pop fu ngan xop.
available = workspace[available].next; // cap nhaf cho ngan xop.
} else if (last_used<max_list - 1){// ngan xop rong va vorkspaco chua day.
new_index = ++last_used;
} else return -1;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 73

workspace[new_index].next = -1;
return new_index;
}


template <class Entry>
void List<Entry>::delete_node(index old_index)
/*
pre: anh sach co mof phan fu Iuu faI chI so old_index.
post: Vung nho co chI so old_index duoc day vao ngan xop cac cho frong co fho su dung IaI;
cac fhuoc fnh available, last_used, va workspace duoc cap nhaf nou can fhIof.
*/
{
index previous;
if (old_index == head) head = workspace[old_index].next;
else {
previous = set_position(current_position(old_index) - 1);
workspace[previous].next = workspace[old_index].next;
}
workspace[old_index].next = available; // day vao ngan xop.
available = old_index;
}

Ca haI ham nay fhuc ra Ia fhuc hIon vIoc push va pop ngan xop. Nou muon
chung fa co fho vIof cac ham xu Iy ngan xop rIong roI moI vIof ham su dung
chung.

Cac ham phu fro protected khac Ia set_position va current_position.
Cung gIong nhu cac hIon fhuc fruoc, set_position nhan vj fr |fhu fu) cua phan
fu frong danh sach va fra vo chI so phan fu do frong workspace. Ham
current_position nhan chI so phan fu frong workspace va fra vo vj fr |fhu
fu) cua phan fu frong danh sach. HIon fhuc cua chung duoc xom nhu baI fap.

index List<Entry>::set_position(int position) const;
pre: position Ia vj fr hop Iy frong danh sach; 0 position < count.
post: fra vo chI so frong workspace cua node faI vj fr position frong danh sach..

int List<Entry>::current_position(index n) const;
post: fra vo vj fr frong danh sach cua node faI chI so n frong workspace, hoac 1 nou khong co
node nay.
4.5.3. Cuc tuc vu khuc
Chung fa hIon fhuc cac phuong fhuc xu Iy cho SIK frong mang IIon fuc bang
cach fhay doI cac phuong fhuc da co cua SIK frong phan 4.3.2. Phan Ion vIoc
hIon fhuc nay duoc danh IaI xom nhu baI fap, o day chung fa so vIof ham duyof
danh sach va fhom phan fu moI vao danh sach.
template <class Entry>
void List<Entry>::traverse(void (*visit)(Entry &))
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 4 Danh sach
Giao trnh Cau truc d lieu va Giai thuat 74
/*
post: Cong vIoc can Iam boI ham *visit duoc fhuc hIon fron fung phan fu cua danh sach, baf
dau fu phan fu fhu 0.
*/
{
for (index n = head; n != -1; n = workspace[n].next)
(*visit)(workspace[n].entry);
}

So sanh phuong fhuc nay voI phuong fhuc fuong ung doI voI SIK dung con
fro va bo nho dong frong phan 4.3.2, chung fa do dang nhan fhay moI dong Ionh
Ia mof su chuyon doI don gIan mof dong Ionh cua hIon fhuc fruoc. ang cach
chuyon doI fuong fu chung fa cung co duoc phuong fhuc fhom mof phan fu moI
vao SIK frong mang IIon fuc.
template <class Entry>
Error_code List<Entry>::insert(int position, const Entry &x)
/*
post: Nou danh sach chua day va 0 <= position <= n, voI n Ia so phan fu hIon co frong
danh sach, phuong fhuc so fhuc hIon fhanh cong vIoc chon x vao faI position va cac
phan fu pha sau bj day IuI fhu fu boI 1 don vj. Nguoc IaI, phuong fhuc fra vo ma IoI fhch
hop.
*/
{
index new_index, previous, following;

if (position < 0 || position > count) return range_error;

if (position > 0) { Tm phan fu fruoc va sau vj fr
previous = set_position(position - 1); can fhom phan fu moI.
following = workspace[previous].next;
}
else following = head;
if ((new_index = new_node()) == -1) return overflow; // Tm vung frong.
workspace[new_index].entry = x; // Cap nhaf du IIou vao vung frong.
workspace[new_index].next = following;

if (position == 0)
head = new_index; // Truong hop dac bIof: fhom
vao dau DSLK. Thom phan fu moI
else vao SIK.
workspace[previous].next = new_index;
count++;
return success;
}
4.5.4. Cuc ben the cuu dunh such len ket trong mung len tuc
Mang IIon fuc cung cac chI so khong nhung duoc dung cho SIK, chung con co
hIou qua fuong fu doI voI SIK kop hoac voI vaI bIon fho khac. oI voI SIK
kop, kha nang ap dung phop fnh so hoc cho cac chI so cho phop mof hIon fhuc
ma frong do cac fham chIou foI va IuI chI can chua frong mof vung chI so don |su
dung ca frj am Ian frj duong cho cac chI so).

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 75
Chng 5 CHO KY T

Trong phan nay chung fa so hIon fhuc mof Iop bIou dIon mof chuoI noI fIop
cac ky fu. V du fa co cac chuoI ky fu: ay Ia mof chuoI ky fu, Ton7 frong do
cap dau khong phaI Ia bo phan cua chuoI ky fu. Mof chuoI ky fu rong duoc ky
hIou . ChuoI ky fu cung Ia mof danh sach cac ky fu. Tuy nhIon, cac fac vu fron
chuoI ky fu co hoI dac bIof va khac voI cac fac vu fron mof danh sach fruu fuong
ma chung fa da djnh nghIa, chung fa so khong dan xuaf Iop chuoI ky fu fu mof
Iop List nao fruoc day.

Trong cac fac vu fhao fac fron chuoI ky fu, fac vu fm kIom Ia kho khan nhaf.
Chung fa so fm hIou haI gIaI fhuaf fm kIom vao cuoI chuong nay. Trong phan
dau, chung fa dac bIof quan fam don vIoc khac phuc fnh fhIou an foan cua chuoI
ky fu frong ngon ngu C ma da so nguoI Iap frnh da fung su dung. o do phan
frnh bay fIop fhoo day IIon quan chaf cho don ngon ngu C va C++.
5.1. Chuo ky tu trong C vu trong C++
Ngon ngu C++ cung cap haI cach hIon fhuc chuoI ky fu. Cach nguyon fhuy Ia
hIon fhuc string cua C. CIong nhu nhung phan khac, hIon fhuc string cua ngon
ngu C co fho chay frong moI hIon fhuc cua C++. Chung fa so goI cac doI fuong
string cung cap boI C Ia C-String. C-String fho hIon ca cac dIom manh va ca
cac dIom you cua ngon ngu C: chung raf pho bIon, raf hIou qua nhung cung raf
hay bj dung saI. C-String IIon quan don mof Ioaf cac fap quan ma chung fa so
xom IaI duoI day.

Mof C-String co kIou char*. o do, mof C-String fham chIou don mof dja
chI frong bo nho; dja chI nay Ia dIom baf dau cua fap cac byfos chua cac ky fu
frong chuoI ky fu. Vung nho chIom boI mof chuoI ky fu phaI duoc kof fhuc bang
mof ky fu dac bIof \0. Trnh bIon djch khong fho kIom fra gIup quy djnh nay,
su fhIou sof so gay IoI fhoI gIan chay. NoI cach khac, C-String khong co fnh
dong kn va fhIou an foan.

Tap fIn chuan <cstring> chua fhu vIon cac ham xu Iy C-String. Trong cac
frnh bIon djch C++ cu, fap fIn nay fhuong co fon Ia <string.h>. Cac ham fhu
vIon nay raf fIon IoI, hIou qua va chua hau hof cac fac vu fron chuoI ky fu ma
chung fa can. CIa su s va f Ia cac C-String. Tac vu strlen(s) fra vo chIou daI
cua s, strcmp(s,t) so sanh fung ky fu cua s va f, va strstr(s,t) fra vo con
fro fham chIou don vj fr baf dau cua f frong s. NgoaI ra, frong C++ fac vu xuaf
<< duoc djnh nghIa IaI cho C-String, nho vay, Ionh don gIan << s so In chuoI
ky fu s.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 76
Mac du hIon fhuc C-String co nhIou uu dIom fuyof voI, nhung no cung co
nhung nhuoc dIom nghIom frong. Thuc vay, no co nhung van do ma chung fa da
gap phaI khI nghIon cuu CTI ngan xop IIon kof frong chuong 2 cung nhu cac
CTI co chua fhuoc fnh con fro noI chung. Thaf do dang khI nguoI su dung co
fho fao b danh cho chuoI ky fu, cung nhu gay non rac. Trong hnh 5.1, chung fa
fhay ro phop gan s = f dan don ca haI van do fron.


Mof van do khac cung fhuong nay sInh frong cac ung dung co su dung C-
String. Mof C-String chua khoI fao can duoc gan NULL. Tuy nhIon, raf nhIou
ham fhu vIon cua C-String so gap su co frong fhoI gIan chay khI gap doI fuong
C-String Ia N!II. Chang han, Ionh

char* x = NULL;
cout << strlen(x);

duoc mof so frnh bIon djch chap nhan, nhung voI nhIou hIon fhuc khac cua fhu
vIon C-String, fh gap IoI frong fhoI gIan chay. o do, nguoI su dung phaI kIom
fra ky Iuong dIou kIon fruoc khI goI cac ham fhu vIon.

Trong C++, vIoc dong goI string vao mof Iop co fnh dong kn va an foan
duoc fhuc hIon do dang. Thu vIon chuan STI co Iop String an foan chua frong
fap fIn <string>. Thu vIon nay hIon fhuc Iop co fon std::String vua fIon IoI,
an foan vua hIou qua.

Trong phan nay chung fa so fu xay dung mof Iop String do co djp hIou ky vo
cach fao non mof CTI co fnh dong kn va an foan cao. Chung fa so khong phaI
vIof IaI foan bo ma chI su dung IaI fhu vIon da co C-String.

HInh 5.1- Su fhIou an foan cua C-String.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 77
5.2. ac fa cua Iop String
o fao mof hIon fhuc Iop String an foan, chung fa dong goI C-String nhu
mof fhuoc fnh fhanh phan cua no va do fhuan fIon hon, chung fa fhom mof
fhuoc fnh chIou daI cho chuoI ky fu. o fhuoc fnh char` Ia mof con fro, chung fa
can fhom cac fac vu gan djnh nghIa IaI |overloaded assignment), copy constructor,
destructor, do Iop String cua chung fa franh duoc cac van do b danh, fao rac,
hoac vIoc su dung doI fuong ma chua duoc khoI fao.

5.2.1. Cuc phep so sunh
VoI mof so ung dung, so hof suc fhuan fIon nou chung fa bo sung fhom cac fac
vu so sanh <, >, <=, >=, ==, != do so sanh fung cap doI fuong String fhoo fung
ky fu. V fho, Iop String cua chung fa so chua cac fac vu so sanh duoc djnh
nghIa IaI |overloaded comparison operators).

5.2.2. Mot so constructor ten dung
Tuo do tuong String tu mot C-String
Chung fa so xay dung constructor voI fhong so char* cho Iop String.
Constructor nay cung cap mof cach chuyon doI fhuan fIon mof doI fuong C-
String sang doI fuong String. VIoc chuyon doI fhong qua cach goI fuong mInh
nhu sau:
String s(some_string);

Trong Ionh nay, doI fuong String s duoc fao ra chua du IIou Ia some_string.

Constructor nay doI khI con duoc goI mof cach khong fuong mInh boI frnh
bIon djch moI khI chuong frnh can don su op kIou |type cast) fu kIou char* sang
String. Iay v du,
String s;
s = some_string;

o chay Ionh fhu haI, frnh bIon djch C++ fruoc hof goI constructor cua chung fa
do chuyon some_string fhanh mof doI fuong String fam. Sau do phop gan
djnh nghIa IaI cua String duoc goI do chop doI fuong fam nay vao s. CuoI cung
destructor cho doI fuong fam duoc fhuc hIon.
Tuo do tuong String tu mot dunh such cuc ky tu
Tuong fu, chung fa cung non co constructor do chuyon mof danh sach cac ky fu
sang mof doI fuong String. Chang han, khI doc mof chuoI ky fu fu nguoI su
dung, chung fa non doc fung ky fu vao mof danh sach cac ky fu do chua bIof fruoc
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 78
chIou daI cua no. Sau do chung fa so chuyon doI danh sach nay sang mof doI
fuong String.
Chuyen tu mot do tuong String sung mot C-String
CuoI cung, nou co fho chuyon doI nguoc fu mof doI fuong String sang mof doI
fuong C-String fh so raf co IoI cho nhung fruong hop string can duoc xom Ia
char*. o Ia nhung Iuc chung fa can su dung IaI cac ham fhu vIon cua C-String
cho cac doI fuong String. Phuong fhuc nay so duoc goI Ia c_str() va phaI fra vo
const char* Ia mof con fro fham chIou don du IIou bIou dIon String. Phuong
fhuc c_str() co fho duoc goI nhu sau:

String s = some_String;
const char* new_s = s.c_str();

Iou quan frong o day Ia c_str() fra vo mof C-String nhu Ia cac ky fu hang.
Chung fa co fho fhay duoc su can fhIof nay nou chung fa xom xof don vung nho
chIom boI chuoI ky fu new_s. Vung nho nay ro rang Ia fhuoc doI fuong cua Iop
String. Chung fa fhay rang Iop String non chju frach nhIom vo vung nho nay,
v dIou do cho phop chung fa hIon fhuc ham chuyon doI mof cach hIou qua, dong
fhoI franh duoc cho nguoI su dung khoI phaI chju frach nhIom vo vIoc quon xoa
mof C-String da duoc chuyon doI fu mof doI fuong String. o do, chung fa khaI
bao c_str() fra vo const char* do nguoI su dung khong fho su dung con fro
fra vo nay ma fhay doI cac ky fu du IIou duoc fham chIou don, su fhay doI nay chI
fhuoc quyon cua Iop String ma fhoI.

VoI mof so f dac fnh duoc mo fa fron chung fa co duoc mof cach xu Iy chuoI
ky fu vo cung IInh hoaf, hIou qua va an foan. Iop String cua chung fa Ia mof
AT dong kn hoan foan, nhung no cung cap mof gIao dIon fhaf day du.

Chung fa co dac fa Iop String nhu sau:

class String {
public:
String();
~String();
String (const String &copy); // copy constructor
String (const char * copy); // Chuyon doI fu C-string
String (List<char> &copy); // Chuyon doI fu List cac ky fu

void operator =(const String &copy);
const char *c_str() const; // Chuyon doI sang C-string

protected:
char *entries;
int length;
};

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 79
bool operator ==(const String &first, const String &second);
bool operator >(const String &first, const String &second);
bool operator <(const String &first, const String &second);
bool operator >=(const String &first, const String &second);
bool operator <=(const String &first, const String &second);
bool operator !=(const String &first, const String &second);
5.3. HIon fhuc Iop String
Cac constructor chuyon doI C-String va danh sach cac ky fu sang doI fuong
String:

String::String (const char *in_string)
/*
pre: Con fro in_string fham chIou don mof C-string.
post: oI fuong String duoc khoI fao fu chuoI ky fu C-string in_string, va no nam gIu
mof ban sao cua in_string, chuoI ky fu frong in_string khong fhay doI.
*/
{
length = strlen(in_string);
entries = new char[length + 1];
strcpy(entries, in_string);
}

String::String (List<char> in_list)
/*
post: oI fuong String duoc khoI fao fu danh sach cac ky fu frong doI fuong List, va no nam
gIu mof ban sao khac, doI fuong in_list khong fhay doI.
*/
{
length = in_list.size();
entries = new char[length + 1];
for (int i = 0; i < length; i++) in_list.retrieve(i,entries[i]);
entries[length] = '\0';
}

Chung fa chon cach hIon fhuc phuong fhuc chuyon doI doI fuong String sang
const char* nhu sau:

const char*String::c_str() const
/*
post: fra vo con fro chI ky fu dau fIon cua chuoI ky fu frong doI fuong String. Iuu y rang o day
co vIoc chIa so cung mof chuoI ky fu.
*/
{
return (const char *) entries;
}

Cach hIon fhuc nay cung khong hoan foan fhch dang do no cho phop fruy
xuaf du IIou bon frong cua doI fuong String. Tuy nhIon chung fa so fhay nhung
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 80
cach gIaI quyof khac cung gap mof so van do. Cach gIaI quyof nay con co duoc uu
dIom Ia fnh hIou qua.

Phuong fhuc c_str() fra vo con fro chI don mang cac ky fu chI co fho doc chu
khong fho sua doI do chung fa da op kIou sang const char*. Tuy nhIon nguoI
Iap frnh co fho op kIou nguoc fro IaI va gan vao mof con fro khac Iam pha vo
fnh dong kn cua du IIou cua chung fa. Mof van do nghIom frong hon chnh Ia b
danh duoc fao boI phuong fhuc nay. Chung fa fhay rang nguoI Iap frnh non su
dung con fro fra vo ngay sau khI vua goI phuong fhuc, nou khong nhung g xay ra
so khong Iuong fruoc duoc. Iay v du sau:

String s = "abc";
const char *new_string = s.c_str();
s = "def";
cout << new_string;

Ionh s = "def" da Iam fhay doI du IIou ma new_string chI don.

Mof chIon Iuoc khac cho phuong fhuc c_str() co fho Ia djnh vj vung nho
dong moI do chop du IIou cua doI fuong String sang. Cach hIon fhuc nay ro rang
Ia kom hIou qua hon, dac bIof doI voI String daI. NgoaI ra no con co mof nhuoc
dIom nghIom frong, do Ia kha nang fao rac. String ma c_str() fra vo khong
con chIa so du IIou voI doI fuong String nua, va nhu vay nguoI Iap frnh phaI
nho delete no khI khong con su dung. Chang han, nou chI vIoc In ra nhu duoI
day fh frong bo nho da do IaI rac do cach hIon fhuc vua nou.

String s = "Some very long string";
cout << s.c_str();

Tom IaI, fuy chung fa van gIu phuong an dau fIon cho phuong fhuc c_str(),
nhung nguoI Iap frnh khong non su dung phuong fhuc nay v no pha vo fnh
dong kn cua doI fuong String, fru khI muon su dung IaI cac ham fhu vIon cua C-
String va da hIou fhaf ro vo ban chaf cua su vIoc.

CuoI cung, chung fa xom xof cac fac vu so sanh duoc djnh nghIa IaI. HIon fhuc
sau day cua phop so sanh bang duoc djnh nghIa IaI fhaf ngan gon va hIou qua
nho phuong fhuc c_str().

bool operator ==(const String &first, const String &second)
/*
post: Tra vo true nou doI fuong first gIong doI fuong second. Nguoc IaI fra vo false.
*/
{
return strcmp(first.c_str(), second.c_str()) == 0;
}
Cac fac vu so sanh djnh nghIa IaI khac co hIon fhuc hau nhu fuong fu.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 81
5.4. Cac fac vu fron String
Chung fa so phaf frIon mof so fac vu Iam vIoc fron cac doI fuong String.
Trong nhIou fruong hop, cac ham cua C-String co fho duoc goI fruc fIop cho cac
doI fuong String da chuyon doI:

String s = "some_string";
cout << s.c_str() << endl;
cout << strlen(s.c_str()) << endl;

oI voI nhung ham khong fhay doI cac fhong so String nhu strcpy, chung
fa so vIof cac phIon ban djnh nghIa IaI co fhong so Ia doI fuong String fhay v
char*. Nhu chung fa da bIof, frong C++, mof ham duoc goI Ia co djnh nghIa IaI nou haI hoac ba
phIon ban khac nhau cua no co frong cung mof chuong frnh. Chung fa da co cac constructor va
cac fac vu gan djnh nghIa IaI. KhI mof ham duoc djnh nghIa IaI, chung phaI co cac fhong so kha c
nhau. Can cu vao cac fhong so duoc goI khI goI ham, frnh bIon djch bIof duoc can phaI su dung
phIon ban nao.

PhIon ban djnh nghIa IaI cho strcat co khaI bao nhu sau:

void strcat(String &add_to, const String &add_on)

NguoI su dung co fho goI strcat(s,t) do noI chuoI ky fu f vao chuoI ky fu s.
s Ia mof String, f co fho Ia String hoac C-String. Nou f Ia C-String fh fruoc
hof constructor co fhong so char* so fhuc hIon do chuyon f fhanh mof doI fuong
String cho hop kIou fhong so ma strcat you cau.

void strcat(String &add_to, const String &add_on)
/*
post: String add_on duoc noI vao sau String add_to.
*/
{
const char *cfirst = add_to.c_str();
const char *csecond = add_on.c_str();
char *copy = new char[strlen(cfirst) + strlen(csecond) + 1];
strcpy(copy, cfirst);
strcat(copy, csecond);
add_to = copy;
delete []copy;
}

Trong phuong fhuc fron co goI strcat voI haI fhong so Ia char* va const
char*, faI day frnh bIon djch so goI dung ham fhu vIon cua C-String chu
khong phaI goI do quy chnh phuong fhuc nay.

o add_to Ia doI fuong String, Ionh add_to = copy fruoc hof goI
constructor do chuyon copy kIou char* sang doI fuong String, sau do moI goI
phop gan djnh nghIa IaI cua Iop String. NoI cach khac, dIou nay dan don vIoc
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 82
chop chuoI ky fu haI Ian. o franh dIou nay chung fa hay fhu fhay doI dong Ionh.
Chang han, mof cach don gIan chung fa khaI bao strcat Ia mof ham friend cua
Iop String. KhI do chung fa co fho fruy cap don fhuoc fnh entries cua Iop
String: add_to.entries = copy.

Chung fa can ham do doc cac doI fuong String. Chung fa co fho fhuc hIon
fuong fu nhu doI voI C-String, fac vu << so duoc djnh nghIa IaI do nhan fhong
so Ia mof String. Tuy nhIon, chung fa cung co fho dung cach khac do xay dung
ham read_in nhu sau:

String read_in(istream &input)
/*
post: Tra vo mof doI fuong String doc fu fhong so istream (ky fu kof fhuc chuoI ky fu duoc
quy uoc Ia ky fu xuong hang hoac kof fhuc fap fIn)
*/
{
List<char> temp;
int size = 0;
char c;
while ((c = input.peek()) != EOF && (c = input.get()) != '\n')
temp.insert(size++, c);
String answer(temp);
return answer;
}

Ham fron su dung mof doI fuong temp do gom cac ky fu fu fhong so input,
sau do goI constructor do chuyon doI temp nay fhanh doI fuong String. Ky fu ko f
fhuc chuoI ky fu Ia ky fu xuong hang hoac ky fu kof fhuc fap fIn.

Mof phIon ban duoc do nghj khac cho ham read_in Ia fhom fhong so fhu haI
do chI ra ky fu kof fhuc chuoI ky fu mong muon:

String read_in(istream &input, int &terminator);

post: Tra vo mof doI fuong String doc fu fhong so istream (ky fu kof fhuc chuoI ky fu duoc quy uoc
Ia ky fu xuong hang hoac kof fhuc fap fIn, ky fu nay cung duoc fra vo fhong qua fham bIon
terminator.)

Tuong fu chung fa co phuong fhuc do In mof doI fuong String:
void write(String &s)
/*
post: oI fuong String s duoc In ra cout.
*/
{
if (strlen(s.c_str())>0)
cout << s.c_str() << endl;
}

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 83
Trong cac phan fIop fhoo chung fa so su dung cac ham fhu vIon cho Iop
String nhu sau:
void strcpy(String &copy, const String &original);
post: Ham chop String original sang String copy.

void strncpy(String &copy, const String &original, int n);
post: Ham chop nhIou nhaf Ia n ky fu fu String original sang String copy.

int strstr(const String &text, const String &target);
post: Nou String target Ia chuoI con |subtring) cua String text, ham fra vo vj fr xuaf hIon
dau fIon cua target frong text; nguoc IaI, ham fra vo -1.

Cac hIon fhuc cua cac ham nay fhoo cach su dung IaI fhu vIon C-String duoc
xom nhu baI fap.
5.5. Cuc gu thuut tIm mot chuo con trong mot chuo
Phan sau day chung fa so fm hIou IaI cach hIon fhuc cua mof vaI ham fhu
vIon cua C-String. Cac phop xu Iy co ban fron chuoI ky fu bao gom: fm mof
chuoI con frong mof chuoI, fhay fho mof chuoI con bang mof chuoI khac, chon mof
chuoI con vao mof chuoI, IoaI mof chuoI con frong mof chuoI, Trong do phop fm
mof chuoI con frong mof chuoI co fho xom Ia phop co ban nhaf, nhung phop con
IaI co fho duoc fhuc hIon do dang sau khI da xac djnh duoc vj fr cua chuoI con.
Chung fa so fm hIou haI gIaI fhuaf fm chuoI con frong mof chuoI cho fruoc.

5.5.1. Gu thuut Brute-Force
Y fuong gIaI fhuaf nay vo cung don gIan, do Ia fhu so frung chuoI con faI moI
vj fr baf dau frong chuoI da cho |Hnh 5.2). CIa su chung fa can fm vj fr cua
chuoI a frong chuoI s. Cac vj fr baf dau so frung a fron s Ia 0, 1, 2, MoI Ian so
frung, chung fa Ian Iuof so sanh fung cap ky fu cua a va s fu fraI sang phaI. KhI
gap haI ky fu khac nhau, chung fa IaI phaI baf dau so frung fu dau chuoI a voI vj
fr moI. Vj fr baf dau so frung fron s Ian fhu I so Ia vj fr baf dau so frung fron s
Ian fhu I-1 cong fhom 1. Cac ky fu In nghIong frong hnh vo bon duoI Ia vj fr
fhaf baI frong mof Ian so frung, phan co non xam bon fraI chung Ia nhung ky fu
so frung da fhanh cong. Mof Ian so frung nao do ma chung fa da duyof qua duoc
hof chIou daI cua a xom nhu da fm fhay a frong s va gIaI fhuaf dung.

Cho I Ia chI so chay fron s va j Ia chI so chay fron a, j Iuon duoc gan vo 0 khI baf
dau mof Ian so frung. KhI gap fhaf baI frong mof Ian so frung nao do fh ca I va j
dou da fIon duoc j buoc so voI Iuc baf dau so frung. o do do baf dau so frung cho
Ian sau, I can IuI vo j-1 buoc.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 84
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
s 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1


a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1

HInh 5.2- MInh hoa gIaI fhuaf rufo-Iorco

Truong hop xau nhaf cua gIaI fhuaf rufo-Iorco Ia chuoI con a frung voI phan
cuoI cung cua chuoI s. KhI do chung fa da phaI Iap IaI lsla+1 Ian so frung, voI
// CIaI fhuaf rufo-Iorco
int strstr(const String &s, const String &a);
/*
post: Nou chuoI a Ia chuoI con cua chuoI s, ham fra vo vj fr xuaf hIon dau fIon cua a frong
s; nguoc IaI, ham fra vo -1.
*/
{
int i = 0, // ChI so chay fron s.
j = 0, // ChI so chay fron a.
ls = s.strlen(); // So ky fu cua s.
la = a.strlen(), // So ky fu cua a.
const char* pa = a.c_str(); //ja chI ky fu dau fIon cua a.
const char* ps = s.c_str(); //ja chI ky fu dau fIon cua s.
do {
if (pa[j] == ps[i]){
i++;
j++;
};
else {
i = i (j 1); // IuI vo cho Ian so frung ko fIop.
j = 0;
}
} while ((j<la) && (i<ls));
if (j>=la) return i la;
else return 1;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 85
ls va la Ia chIou daI cua chuoI s va chuoI a. MoI Ian so frung da phaI so sanh la
ky fu. So Ian so sanh foI da Ia la*(ls-la+1) la*ls.

5.5.2. Gu thuut Knuth-Morrs-Prutt
CIaI fhuaf nay do Knufh, MorrIs va Praff dua ra, con goI Ia gIaI fhuaf KMP-
Soarch.
Trong v du fron chung fa fhay gIaI fhuaf rufo-Iorco phaI so frung don Ian
fhu 11 moI phaf hIon duoc vj fr can fm. CIaI fhuaf KMP-Search duoI day fIof
kIom duoc mof so Ian so frung va chI phaI so frung don Ian fhu 5. Hon fho nua,
chI so I chay fron s cung khong bao gIo phaI IuI IaI. o co duoc dIou nay, chung fa
hay co gang ruf ra nhan xof fu hnh 5.3 bon duoI. Trong Ian so frung fhu nhaf,
khI I=4 fh a
j
s
I
, khI do a so duoc djch chuyon vo pha phaI sao cho doan dau cua
a frung khop voI doan cuoI cua a frong phan da duoc duyof qua |chI fnh phan
mau xam). Trong hnh vo Ia haI ky fu 1 va 0 co gach duoI. Ian so frung ko fIop
chnh Ia fu vj fr nay, va nhung Ian so frung frung gIan gIua haI Ian nay co fho
bo qua. Iou nay co fho Iy gIaI nhu sau: nou phan dau cua a frung voI phan cuoI
cua a fh no cung frung voI phan fuong ung cua s bon fron, do phan cuoI cua a vua
moI duoc so frung fhanh cong voI phan fuong ung cua s. uoc nhu vay fh I moI
hoan foan khong phaI IuI IaI. Trong Ian so frung moI, chnh s
I
nay so duoc so
sanh voI a
j
, voI j so duoc fnh foan fhch hop ma chung fa so ban don sau. Trong
v du chung fa fhay j = 2, Ian so sanh dau fIon cua Ian so frung fhu haI Ia so sanh
gIua s
4
va a
2
.

Tuong fu, khI Ian so frung fhu haI fhaf baI faI s
8
, chuoI con a so duoc djch chuyon
raf xa, fIof kIom duoc raf nhIou Ian so frung. Chung fa do dang kIom chung, voI
nhung vj fr frung gIan khac, phan dau cua a khong frung voI phan cuoI |chI fnh
phan mau xam) cua a, non cung khong fho frung voI phan fuong ung fron s, co
fhuc hIon so frung cung so fhaf baI ma fhoI.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
s 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
a 1 0 1 0 0 1 1 1
HInh 5.3- MInh hoa gIaI fhuaf Knufh-MorrIs-Praff

af dau Ian so frung fhu haI
|I = 4, j = 2)
af dau Ian so frung fhu ba
|I = 8, j = 1)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 86
Hnh vo duoI day gIup chung fa hIou duoc cach fnh chI so j fhch hop cho dau
moI Ian so frung |frong khI I khong IuI vo ma gIu nguyon do fIop fuc fIon foI).

Trch fu hnh vo fron, chung fa co duoc kof qua sau day.
Xof vj fr i = 4, j = 4, do so sanh s
i
voI a
j
fhaf baI, chung fa dang muon bIof
phan cuoI cua a ko fu dIom nay fro vo fruoc |fuc chI fnh phan mau xam) va phan
dau cua a frung duoc bao nhIou ky fu. CoI a = a. Chung fa so nhn quof fu cuoI
phan mau xam cua a va fu dau cua a, chung fa so bIof duoc co bao nhIou ky fu
frung. o Ia haI ky fu 1 va 0 duoc gach duoI.


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
s 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1





a 1 0 1 0 0 1 1 1


a 1 0 1 0 0 1 1 1

Nhu vay, dIou nay hoan foan khong con phu fhuoc vao s nua. Chung fa co fho
fnh so ky fu frung fhoo j dua fron a va a. ong fhoI fa fhay so ky fu frung nay
cung Ia chI so ma j phaI IuI vo cho Ian so frung ko fIop a
j
voI s
I
, I khong doI.
Chung fa baf dau voI j = 1 va xom hnh 5.4 sau day.
j=4, so ky fu frung Ia 2
i
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 87


a 1 0 1 0 0 1 1 1
next
1
= 0

a 1 0 1 0 0 1 1 1

a 1 0 1 0 0 1 1 1
next
2
= 0

a 1 0 1 0 0 1 1 1

a 1 0 1 0 0 1 1 1
next
3
= 1

a 1 0 1 0 0 1 1 1

a 1 0 1 0 0 1 1 1
next
4
= 2

a 1 0 1 0 0 1 1 1

a 1 0 1 0 0 1 1 1
next
5
= 0

a 1 0 1 0 0 1 1 1



a 1 0 1 0 0 1 1 1
next
6
= 1

a 1 0 1 0 0 1 1 1

a 1 0 1 0 0 1 1 1
next
7
= 1

a 1 0 1 0 0 1 1 1
HInh 5.4- MInh hoa gIaI fhuaf Knufh-MorrIs-Praff

CIa su chung fa da fao duoc danh sach next ma phan fu fhu j chua frj ma j
phaI IuI vo khI dang so sanh a
j
voI s
I
ma fhaf baI |a
j
s
I
), do baf dau Ian so frung
ko fIop |I gIu nguyon khong doI). Hnh 5.4 cho fhay noxf
1
Iuon bang 0 voI moI a.
Chung fa co gIaI fhuaf KMP-Search nhu duoI day.

Ian so frung fhu nhaf Iuon baf dau fu ky fu dau cua s va a, non haI chI so I va
j dou Ia 0.
Truong hop do hIou nhaf Ia frong khI ma a
j
=s
i
fh I va j dou duoc nhch
foI. Iou kIon dung cua vong Iap hoan foan nhu gIaI fhuaf rufo-Iorco
fron, co nghIa Ia j dI duoc hof chIou daI cua a |fm fhay a frong s), hoac I dI
qua chIou daI cua s |vIoc fm kof fhuc fhaf baI).
j=1, so ky fu frung Ia 0 |khI dom so ky fu frung, Iuon phaI djch chuyon a sang
phaI so voI a, fuc chI so sanh phan cuoI cua a voI phan dau cua a, fruong hop
nay xom nhu khong co ky fu frung).
j=2, so ky fu frung Ia 0
j=3, so ky fu frung Ia 1
j=4, so ky fu frung Ia 2
j=5, so ky fu frung Ia 0
j=6, so ky fu frung Ia 1
j=7, so ky fu frung Ia 1
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 88
Truong hop a
j
s
i
(voI j0) frong mof Ian so frung nao do fh nhu da noI
o fron, chI vIoc cho j IuI vo vj fr da duoc chua frong phan fu fhu j frong
danh sach next. Nho vay frong Ian Iap ko fIop so fIop fuc so sanh a
j
nay
voI s
I
ma I khong doI.
RIong fruong hop dac bIof, voI j = 0 ma a
j
s
i
, fa xom hnh duoI day




s 1 1 0 0 1 0 0 1 1 1 0 1 1




a 1 0 1 0 0 1 1 1

af cu mof Ian so sanh s
I
nao do voI a
0
ma fhaf baI fh chuoI a cung phaI djch
chuyon sang phaI mof buoc, do Ian so sanh ko fIop |cung Ia Ian so frung moI) co
fho so sanh u
0
voI s
+1
. Nhu vay fa chI can fang I va gIu nguyon j ma fhoI.

j=0, so ky fu frung Ia 0
i
// CIaI fhuaf Knufh- MorrIs Praff

int strstr(const String &s, const String &a);
/*
post: Nou a Ia chuoI con cua s, ham fra vo vj fr xuaf hIon dau fIon cua a frong s;
nguoc IaI, ham fra vo -1.
*/
{
List<int> next;
int i = 0, // ChI so chay fron s.
j = 0, // ChI so chay fron a.
ls = s.strlen(); // So ky fu cua s.
la = a.strlen(), // So ky fu cua a.
const char* pa = a.c_str(); //ja chI ky fu dau fIon cua a.
const char* ps = s.c_str(); //ja chI ky fu dau fIon cua s.
InitNext(a, next); // KhoI gan cac phan fu noxf
1
, noxf
2
,,noxf
Ia-1
.
// Khong su dung noxf
0
.
do {
if (pa[j]==ps[i]){// Van con ky fu frung frong mof Ian so frung
i++; // nao do, I va j duoc quyon nhch foI.
j++;
}
else
if (j == 0) // ay Ia fruong hop dac bIof, phaI djch a sang phaI
I++; // mof buoc, co nghIa Ia cho I nhch foI.
else
next.retrieve(j, j); // Cho j IuI vo frj da chua frong noxf
j
.
} while ((j<la) && (i<ls));
if (j>=la) return i la;
else return 1;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 89
Sau day chung fa so vIof ham InitNext gan cac frj cho cac phan fu cua
next, fuc Ia fm so phan fu frung fhoo hnh vo 5.4. Co mof dIou kha fhu vj frong
gIaI fhuaf nay, do chnh Ia ham fao danh sach next IaI su dung ngay chnh danh
sach nay. Chung fa fhay rang do fm so phan fu frung nhu da noI, chung fa can
djch chuyon a vo bon phaI so voI a, ma vIoc djch chuyon a fron a cung hoan
foan gIong nhu vIoc djch chuyon a fron s frong khI dI fm a frong s.

Ham fao next duoc chop IaI fu gIaI fhuaf KMP-Search fron, chI co vaI dIom
bo sung nhu sau: voI i chay fron a va j chay fron a, va a Iuon phaI djch phaI
so voI a, chung fa khoI gan i=1 va j=0.

o I fang don dau Ia chung fa xom nhu da so frung xong phan cuoI cua a |ko
fu vj fr I nay fro vo fruoc) voI phan dau cua a, non next
i
da duoc xac djnh.
Trong qua frnh so frung, frong khI ma a
i
van con bang a
j
, i va j dou nhch
foI. V vay, chung fa do fhay rang j chnh Ia so phan fu da frung duoc cua a so
voI a, chung fa co phop gan next
i
=j.

// Ham phu fro gan cac phan fu cho danh sach noxf.

void InitNext(const String &a, List<int> &next);
/*
post: Can cac frj cho cac phan fu cua noxf dua fron chuoI ky fu a.
*/
{
int i = 1, // ChI so chay fron a.
j = 0, // ChI so chay fron a.
la = a.strlen(), // So ky fu cua a |cung Ia cua a).
const char* pa = a.c_str(); //ja chI ky fu dau fIon cua a |cung Ia cua a).
next.clear();
next.insert(1, 0); // Iuon dung voI moI a.
do {
if (pa[j]==pa[i]){ // Van con ky fu frung frong mof Ian so frung
i++; // nao do, I va j duoc quyon nhch foI.
j++; // Tu vj fr I fron a fro vo fruoc, j xom nhu da
next.insert(i, j);// quof duoc so phan fu frung cua a so voI a.
}
else
if (j == 0){ // Truong hop dac bIof, phaI djch a sang phaI
I++; // mof buoc, co nghIa Ia cho I nhch foI.
next.insert(i, j);
};
else
next.retrieve(j, j); // Cho j IuI vo frj da chua frong noxf
j
.
} while (i<la); // i=la Ia da gan xong la phan fu cua next,
// khong su dung next
0
.
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 5 Chuoi ky t
Giao trnh Cau truc d lieu va Giai thuat 90
KhI a
i
a
j
, chung fa su dung y fuong cua KMP-Search Ia cho j IuI vo
next
j
. Van do con IaI can kIom chung Ia gIa frj cua next
j
phaI co fruoc khI no
duoc su dung. o chung fa da gan vao next
i
va da su dung next
j
, ma i Iuon Iuon
dI fruoc j, non chung fa hoan foan yon fam vo dIou nay.

CuoI cung, chI con mof dIou nho ma chung fa can xom xof. o Ia fruong hop co
nhIou phuog an cho so ky fu frung nhau. Chang han voI a Ia 10101010111 va
j=8, so ky fu frung khI djch a=a vo bon phaI so voI a Ia:



a 1 0 1 0 1 0 1 0 1 1 1... So ky fu frung Ia 6
a 1 0 1 0 1 0 1 0 1 1 1...

a 1 0 1 0 1 0 1 0 1 1 1...
a 1 0 1 0 1 0 1 0 1 1 1... So ky fu frung Ia 4

a 1 0 1 0 1 0 1 0 1 1 1...
a 1 0 1 0 1 0 1 0 1 1 1... So ky fu frung Ia 2

SInh vIon hay fu suy nghI xom cach chon phuong an nao Ia dung dan nhaf va
kIom fra IaI cac doan chuong frnh fron xom chung co can phaI duoc sua doI g
hay khong.

NgoaI ra, gIaI fhuaf KMP-Search con co fho caI fIon mof dIom nho, do Ia
fruoc khI gan next
i
=j frong InitNext, chung fa kIom fra nou pa
j
=pa
i
fh so
gan next
i
=next
j
. o khI so frung pa
I
ma fhaf baI fh co IuI vo pa
nexti
=paj cung
so fhaf baI, chung fa non IuI han vo pa
nextj
.

So Ian so sanh foI da frong KMP-Search Ia ls+la.


Vj fr j dang xof
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 91
Chng 6 OK QY

Chuong nay frnh bay vo do quy |rccursion) mof phuong phap ma frong do
do gIaI mof baI foan, nguoI fa gIaI cac fruong hop nho hon cua no. Chung fa can
fm hIou mof vaI ung dung va chuong frnh mau do fhay duoc mof so frong raf
nhIou dang baI foan ma vIoc su dung do quy do gIaI raf co IoI. Mof so v du don
gIan, mof so khac fhuc su phuc fap. Chung fa cung so phan fch xom do quy
fhuong duoc hIon fhuc frong may fnh nhu fho nao, khI nao non dung do quy va
khI nao non franh.
6.1. Go theu ve de quy
6.1.1. Co cuu ngun xep cho cuc lun go hum
KhI mof ham goI mof ham khac, fh faf ca cac frang fhaI ma ham goI dang co
can duoc khoI phuc IaI sau khI ham duoc goI kof fhuc, do ham nay fIop fuc fhuc
hIon cong vIoc do dang cua mnh. Trang fhaI do gom co: dIom quay vo |dong Ionh
ko sau Ionh goI ham); cac frj frong cac fhanh ghI, v cac fhanh ghI frong bo xu Iy
so duoc ham duoc goI su dung don; cac frj frong cac bIon cuc bo va cac fham frj
cua no. Nhu vay moI ham can co mof vung nho danh rIong cho no. Vung nho nay
phaI duoc fon faI frong suof fhoI gIan ko fu khI ham fhuc hIon cho don khI no kof
fhuc cong vIoc.

CIa su chung fa co ba ham A, , C, ma A goI , goI C. so khong kof fhuc
fruoc khI C kof fhuc. Tuong fu, A khoI su cong vIoc dau fIon nhung IaI kof fhuc
cuoI cung. Su dIon fIon cua cac hoaf dong cua cac ham xay ra fhoo fnh chaf vao
sau ra fruoc |Last In First Out LIFO. Nou xof don nhIom vu cua may fnh frong
vIoc fo chuc cac vung nho fam danh cho cac ham nay su dung, chung fa fhay rang
cac vung nho nay cung phaI nam frong mof danh sach co cung fnh chaf fron, co
nghIa Ia ngan xop. V fho, ngan xop dong mof vaI fro chu chof IIon quan don cac
ham frong ho fhong may fnh. Trong hnh 6.1, M bIou dIon chuong frnh chnh,
A, , C Ia cac ham fron.

HInh 6.1- Co cau ngan xop cho cac Ian goI ham
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 92
Hnh 6.1 bIou dIon mof day cac vung nho fam cho cac ham, moI cof Ia hnh
anh cua ngan xop faI mof fhoI dIom, cac fhay doI cua ngan xop co fho duoc nhn
fhay bang cach doc fu fraI sang phaI. Hnh anh nay cung cho chung fa fhay rang
khong co su khac nhau frong cach dua mof vung nho fam vao ngan xop gIua haI
fruong hop: mof ham goI mof ham khac va mof ham goI chnh no. Oe quy Ia fon
goI fruong hop mof ham goI chnh no, hay fruong hop cac ham Ian Iuof goI nhau
ma frong do co mof ham goI fro IaI ham dau fIon. Thoo cach nhn cua co cau ngan
xop, su goI ham do quy khong co g khac voI su goI ham khong do quy.

6.1.2. Cuy beu den cuc lun go hum
So do cay |trcc Jiagram) co fho Iam ro hon moI IIon quan gIua ngan xop va
vIoc goI ham. So do cay hnh 6.2 fuong duong voI co cau ngan xop o hnh 6.1.

Chung fa baf dau fu goc cua cay, fuong ung voI chuong frnh chnh. |Cac fhuaf
ngu dung cho cac fhanh phan cua cay co fho fham khao frong chuong 9) MoI vong
fron goI Ia nuf cua cay, fuong ung voI mof Ian goI ham. Cac nuf ngay duoI goc cay
bIou dIon cac ham duoc goI fruc fIop fu chuong frnh chnh. MoI ham frong so
fron co fho goI ham khac, cac ham nay IaI duoc bIou dIon boI cac nuf o sau hon.
ang cach nay cay so Ion Ion nhu hnh 6.2 va chung fa goI cay nay Ia cay bIou
dIon cac Ian goI ham.

o fhoo vof cac Ian goI ham, chung fa baf dau fu goc cua cay va dI chuyon qua
hof cay fhoo muI fon frong hnh 6.2. Cach dI nay duoc goI Ia phep duyet cuy
|traocrsa/). KhI dI xuong va gap mof nuf, do Ia Iuc goI ham. Sau khI duyof qua hof
phan cay bon duoI, chung fa gap fro IaI nuf nay, do Ia Iuc kof fhuc ham duoc goI.
Cac nuf Ia bIou dIon cac ham khong goI mof ham nao khac.


HInh 6.2- Cay bIou dIon cac Ian goI ham.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 93
Chung fa dac bIof chu y don do quy, do do fhong fhuong chung fa chI vo mof
phan cua cay bIou dIon su goI do quy, va chung fa goI Ia cuy de quy |rccursion
trcc). Trong so do cay chung fa cung Iuu y mof dIou Ia khong co su khac nhau gIua
cach goI do quy voI cach goI ham khac. Su do quy don gIan chI Ia su xuaf hIon cua
cac nuf khac nhau frong cay co quan ho nuf fruoc nuf sau voI nhau ma co cung
fon. Iom fhu haI can Iuu y rang, chnh v cay bIou dIon cuc lun go hum, non
frong chuong frnh, nou mof Ionh goI ham chI xuaf hIon mof Ian nhung IaI nam
frong vong Iap, fh nuf bIou dIon ham so xuut hen nheu lun frong cay, moI
Ian fuong ung mof Ian goI ham. Tuong fu, nou Ionh goI ham nam frong phan ro
nhanh cua mof dIou kIon ma dIou kIon nay khong xay ra fh nuf bIou dIon ham so
khong xuut hen frong cay.

Co cau ngan xop o hnh 6.1 cho fhay nhu cau vo vung nho cua do quy. Nou mof
ham goI do quy chnh no vaI Ian fh ban sao cua cac bIon khaI bao frong ham
duoc fao ra cho moI Ian goI do quy. Trong cach hIon fhuc fhong fhuong cua do
quy, chung duoc gIu frong ngan xop. Chu y rang tong dung luong vung nho
can cho ngan xop nay t le vo cheu cuo cua cay do quy chu khong phu thuoc
vuo tong so nut frong cay. Iou nay co nghIa rang, fong dung Iuong vung nho
can fhIof do hIon fhuc mof ham do quy phu fhuoc vao do sau cua do quy, khong
phu fhuoc vao so Ian ma ham duoc goI.

HaI hnh anh fron cho chung fa fhay moI IIon quan maf fhIof gIua mof bIou
dIon cay va ngan xop:

Trong qua trnb Juyct qua bat ky mot cay nao, cac nut Juoc tbcm oao bay /ay
Ji Jung tbco kicu cua ngan xcp. Trai /ai, cbo truoc mot ngan xcp, co tbc oc mot
cay Jc mo ta qua trnb tbay Joi cua ngan xcp.

Chung fa hay fm hIou mof vaI v du don gIan vo do quy. Sau do chung fa so
xom xof do quy fhuong duoc hIon fhuc frong may fnh nhu fho nao.

6.1.3. Gu thuu: Mot d{nh nghIu de quy
Trong foan hoc. gIaI fhua cua mof so nguyon fhuong duoc djnh nghIa boI cong
fhuc:
n! = n x |n-1) x ... x 1.
Hoac djnh nghIa sau:


CIa su chung fa can fnh 4!. Thoo djnh nghIa chung fa co:


1 nou n=0
n x |n-1)! nou n>0.
n! =
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 94
4! = 4 x 3!
= 4 x |3 x 2!)
= 4 x |3 x |2 x 1!))
= 4 x |3 x |2 x |1 x 0!)))
= 4 x |3 x |2 x |1 x 1)))
= 4 x |3 x |2 x 1))
= 4 x |3 x 2)
= 4 x 6
= 24

VIoc fnh foan fron mInh hoa ban chaf cua cach ma do quy fhuc hIon. o co
duoc cau fra IoI cho mof baI foan Ion, phuong phap chung Ia gIam baI foan Ion
fhanh mof hoac nhIou baI foan con co ban chaf fuong fu ma kch fhuoc nho hon.
Sau do cung chInh phuong phup chung nuy IaI duoc su dung cho nhung baI
foan con, cu nhu fho do quy so fIop fuc cho don khI kch fhuoc cua baI foan con da
gIam don mof kch fhuoc nho nhaf nao do cua mof vaI fruong hop co ban, ma IoI
gIaI cua chung co fho co duoc mof cach fruc fIop khong can don do quy nua. NoI
cach khac:

MoI qua frnh do quy gom co haI phan:

Mof vaI fruong hop co ban nho nhaf co fho duoc gIaI quyof ma khong can do
quy.
Mof phuong phap chung co fho gIam mof fruong hop fhanh mof hoac nhIou
fruong hop nho hon, va nho do vIoc gIam nho van do co fho fIon frIon cho
don kof qua cuoI cung Ia cac fruong hop co ban.

C++, cung nhu cac ngon ngu may fnh hIon daI khac, cho phop do quy do dang.
VIoc fnh gIaI fhua frong C++ fro fhanh mof ham sau day.


int factorial(int n)
/*
pre: n Ia mof so khong am.
post: fra vo frj cua n gIaI fhua.
*/
{
if (n == 0)
return 1;
else
return n * factorial(n - 1);
}

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 95
Nhu chung fa fhay, djnh nghIa do quy va IoI gIaI do quy cua mof baI foan dou
co fho raf ngan gon va dop do. Tuy nhIon vIoc fnh foan chI fIof co fho doI hoI
phaI gIu IaI raf nhIou phop fnh fung phan fruoc khI co duoc kof qua day du.

May fnh co fho do dang nho cac fnh foan fung phan bang mof ngan xop. Con
nguoI fh kho Iam duoc nhu vay, con nguoI kho co fho nho mof day daI cac kof
qua fnh foan fung phan do roI sau do quay IaI hoan faf chung. o do, khI su
dung do quy, cach chung fa suy nghI co khac voI cac cach Iap frnh khac. Chung
fa phaI xom xof van do bang mof cach nhn fong fho va danh nhung vIoc fnh
foan chI fIof IaI cho may fnh.

Chung fa phaI dac fa frong gIaI fhuaf cua chung fa mof cach chnh xac cac
buoc fong quaf cua vIoc gIam mof baI foan Ion fhanh nhIou fruong hop nho hon;
chung fa phaI xac djnh dIou kIon dung |cac fruong hop nho nhaf) va cach gIaI cua
chung. NgoaI fru mof so f v du nho va don gIan, chung fa khong non co gang
hIou gIaI fhuaf do quy bang cach bIon doI fu baI foan ban dau cho don fan buoc
kof fhuc, hoac Ian fhoo vof cua cac cong vIoc ma may fnh so Iam. Iam nhu fho,
chung fa so nhanh chong Ian Ion boI cac cong vIoc bj fr hoan IaI va chung fa so
bj maf phuong huong.

6.1.4. Chu de tr{: Bu toun Thup Hu No
6.1.4.1. Bu toun
Vao fho ky fhu 19 o chau Au xuaf hIon mof fro choI duoc goI Ia Thap Ha NoI.
NguoI fa ko rang fro choI nay bIou dIon mof nhIom vu o mof ngoI don cua An o
gIao. Vao caI ngay ma fho gIoI moI duoc fao non, cac vj IInh muc duoc gIao cho 3
caI fhap bang kIm cuong, faI fhap fhu nhaf co do 64 caI dIa bang vang. Cac IInh
muc nay phaI dI chuyon cac dIa fu fhap fhu nhaf sang fhap fhu ba sao cho moI
Ian chI dI chuyon 1 dIa va khong co dIa Ion nam fron dIa nho. NguoI fa bao rang
khI cong vIoc hoan faf fh don ngay fan fho.


HInh 6.3- aI foan fhap Ha noI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 96
NhIom vu cua chung fa Ia vIof mof chuong frnh In ra cac buoc dI chuyon cac
dIa gIup cho cac nha IInh muc, chung fa goI dong Ionh sau

move(64, 1, 3, 2)

co nghIa Ia: chuyon 64 dIa fu fhap fhu nhaf sang fhap fhu ba, su dung fhap fhu
haI Iam noI do fam.
6.1.4.2. Lo gu
Y fuong do don voI IoI gIaI o day Ia, su fap frung chu y cua chung fa khong
phaI Ia vao buoc dau fIon dI chuyon caI dIa fron cung, ma Ia vao buoc kho nhaf: dI
chuyon caI dIa duoI cung. Ia Ion nhaf duoI cung nay so phaI co vj fr o duoI cung
faI fhap fhu ba fhoo you cau baI foan. Khong co cach nao khac do cham duoc don
dIa cuoI cung fruoc khI 63 dIa nam fron da duoc chuyon dI. ong fhoI 63 dIa nay
phaI duoc daf faI fhap fhu haI do fhap fhu ba frong.

Chung fa da co duoc mof buoc nho do fIon don IoI gIaI, day Ia mof buoc raf nho v
chung fa con phaI fm cach dI chuyon 63 dIa. Tuy nhIon day IaI Ia mof buoc raf
quan frong, v vIoc dI chuyon 63 dIa da co cung ban chaf voI baI foan ban dau, v
khong co Iy do g ngan can vIoc chung fa dI chuyon 63 dIa nay fhoo cung mof
cach fuong fu.

move(63,1,2,3);// Chuyon 63 dIa fu fhap 1 sang fhap 2 |fhap 3 dung Iam noI do fam).
cout << "Chuyen dIu thu 64 tu thup 1 sung thup 3." << endl;
move(63,2,3,1);// Chuyon 63 dIa fu fhap 2 sang fhap 3 |fhap 1 dung Iam noI do fam).

Cach suy nghI nhu fron chnh Ia y fuong cua do quy. Chung fa da mo fa cac
buoc chu chof duoc fhuc hIon nhu fho nao, va cac cong vIoc con IaI cua baI foan
cung so duoc fhuc hIon mof cach fuong fu. ay cung Ia y fuong cua vIoc chIa do
frj: do gIaI quyof mof baI foan, chung fa chIa cong vIoc ra fhanh nhIou phan nho
hon, moI phan IaI duoc chIa nho hon nua, cho don khI vIoc gIaI chung fro non do
dang hon baI foan ban dau raf nhIou.
6.1.4.3. Tnh che
o vIof duoc gIaI fhuaf, chung fa can bIof faI moI buoc, fhap nao duoc dung do
chua fam cac dIa. Chung fa co dac fa sau day cho ham:

void move(int count, int start, int finish, int temp);
pre: Co f nhaf Ia count dIa faI fhap start. Ia fron cung cua fhap temp va fhap finish Io n
hon baf ky dIa nao frong count dIa fron cung faI fhap start.
post: count dIa fron cung faI fhap start da duoc chuyon sang fhap finish; fhap temp duoc
dung Iam noI do fam so fro IaI frang fhaI ban dau.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 97
CIa su rang baI foan cua chung fa so dung sau mof so buoc huu han |mac dau
do co fho Ia ngay fan fho!), va nhu vay phaI co cach nao do do vIoc do quy dung
IaI. Mof dIou kIon dung hIon nhIon Ia khI khong con dIa can dI chuyon nua.
Chung fa co fho vIof chuong frnh sau:

const int disks = 64; // Can sua hang so nay fhaf nho do chay fhu chuong frnh.

void move(int count, int start, int finish, int temp);
/*
pre: Khong co.
post: Chuong frnh mo phong baI foan Thap Ha NoI kof fhuc.
*/
main()
{
move(disks, 1, 3, 2);
}
Ham do quy nhu sau:

void move(int count, int start, int finish, int temp)
{
if (count > 0) {
move(count - 1, start, temp, finish);
cout << "Move disk " << count << " from " << start
<< " to " << finish << "." << endl;
move(count - 1, temp, finish, start);
}
}

6.1.4.4. Theo vet cuu chuong trInh
Cong cu huu ch cua chung fa frong vIoc fm hIou mof ham do quy Ia hnh anh
fho hIon cac buoc fhuc hIon cua no fron mof v du fhaf nho. Cac Ian goI ham
frong hnh 6.4 Ia cho fruong hop so dIa bang 2. MoI khoI frong so do bIou dIon
nhung g dIon ra frong mof Ian goI ham. Ian goI ngoaI cung move(2,1,3,2) |do
chuong frnh chnh goI) co ba dong Ionh sau:

move(1,1,2,3);// Chuyon 1 dIa fu fhap 1 sang fhap 2 |fhap 3 dung Iam noI do fam).
cout << " Chuyen dIu thu 2 tu thup 1 sung thup 3." << endl;
move(1,2,3,1);// Chuyon 1 dIa fu fhap 2 sang fhap 3 |fhap 1 dung Iam noI do fam).

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 98

ong Ionh fhu nhaf va dong Ionh fhu ba goI do quy. ong Ionh move(1,1,2,3)
baf dau goI ham move fhuc hIon fro IaI dong Ionh dau fIon, nhung voI cac fhong
so moI. ong Ionh nay so fhuc hIon dung ba Ionh sau:

move(0,1,3,2);// Chuyon 0 dIa |goI do quy Ian nua, bIou dIon boI khoI nho bon
/ / frong).
couf << "Chuyen dIu 1 tu thup 1 sung thup 2" << ondI;

move(0,3,2,1);// Chuyon 0 dIa |goI do quy Ian nua, bIou dIon boI khoI nho bon
/ / frong).

Sau khI khoI bIou dIon Ian goI do quy nay kof fhuc, dong Ionh hIon fhj
"Chuyen dIu thu 2 tu thup 1 sung thup 3" fhuc hIon. Sau do Ia khoI bIou dIon
Ian goI do quy move(1,2,3,1).

Chung fa fhay rang haI Ian goI do quy bon frong khoI move(1,1,2,3) co so
dIa Ia 0 non khong phaI fhuc hIon dIou g, hnh bIou dIon Ia mof khoI rong. CIua
haI Ian nay Ia hIou fhj "Chuyen dIu 1 tu thup 1 sung thup 2." Tuong fu cho
cac dong Ionh bon frong move(1,2,3,1), chung fa hIou duoc cach ma do quy
hIon fhuc.

Hnh 6.4- Theo vet cua chng trnh Thap Ha Noi vi so a la 2.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 99
Chung fa so xom xof fhom mof cong cu khac co fnh hIon fhj cao hon frong
vIoc bIou dIon su do quy bang cach Ian fhoo vof cua chuong frnh vua roI.
6.1.4.5. Phun tIch
Hnh 6.5 Ia cay do quy cho baI foan Thap Ha NoI voI 3 dIa.
Iuu y rang chuong frnh cua chung fa cho baI foan Thap Ha NoI khong chI
sInh ra mof IoI gIaI day du cho baI foan ma con sInh ra mof IoI gIaI fof nhaf co
fho co, va day cung Ia IoI gIaI duy nhaf duoc fm fhay fru khI chung fa chap nhan
IoI gIaI voI mof day daI Io fho cac buoc du fhua va baf IoI nhu sau:

Chuyon dIa 1 fu fhap 1 sang fhap 2.
Chuyon dIa 1 fu fhap 2 sang fhap 3.
Chuyon dIa 1 fu fhap 3 sang fhap 1. . . .

o chung mInh fnh duy nhaf cua mof IoI gIaI khong fho gIan Iuoc hon duoc
nua, chung fa chu y rang, faI moI buoc, nhIom vu can Iam duoc fong kof IaI Ia can
dI chuyon mof so dIa nhaf djnh nao do fu mof fhap nay sang mof fhap khac.
Khong co cach nao khac ngoaI cach Ia fruoc hof phu d chuyen toun bo so dIu
ben tren, fru dIa cuoI cung nam duoI, sau do co fho fhuc hIon mof so buoc du
fhua nao do, fIop fhoo Ia d chuyen chInh dIu cuo cung, roI IaI co fho fhuc
hIon mof so buoc du fhua nao do, do cuoI cung Ia d chuyen toun bo so dIu cu
ve lu tren dIu duo cung nuy. Nhu vay, nou IoaI dI faf ca cac vIoc Iam du fhua
fh nhung vIoc con IaI chnh Ia cof IoI cua gIaI fhuaf do quy cua chung fa.

TIop fhoo, chung fa so fnh xom do quy duoc goI IIon fIop bao nhIou Ian fruoc
khI co su quay vo. Ian dau do quy co count=64, moI Ian do quy count duoc gIa m
dI 1. Vay nou chung fa goI do quy voI count = 0, Ian do quy nay khong fhuc
hIon g, chung fa co fong do sau cua do quy Ia 64. Iou nay co nghIa rang, nou
chung fa vo cay do quy cho chuong frnh, fh cay so co 64 muc khong ko muc cua

HInh 6.5- Cay do quy cho fruong hop 3 dIa
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 100
cac muc Ia. NgoaI fru cac nuf Ia, cac nuf khac dou goI do quy haI Ian frong moI
nuf, nhu vay fong so nuf faI moI muc chnh xac bang haI Ian fong so nuf o muc
cao hon.

Tu cach suy nghI fron vo cay do quy |ngay ca khI cay qua Ion khong fho vo
duoc), chung fa co fho do dang fnh ra so Ian dI chuyon can Iam |moI Ian dI
chuyon mof dIa) do dI chuyon hof 64 dIa fhoo you cau baI foan. MoI nuf frong cay
so In mof IoI huong dan fuong ung mof Ian chuyon mof dIa, fru cac nuf Ia. Tong
so nuf goc va nuf frung gIan Ia:

1 +2 +4 +... +2
63
= 2
0
+2
1
+2
2
+... +2
63
= 2
64
-1.

non so Ian dI chuyon dIa can fhuc hIon faf ca Ia 2
64
1. Chung fa co fho uoc
chung con so nay Ion nhu fho nao bang cach so sanh voI

10
3
= 1000 1024 = 2
10
,

fa co fong so Ian dI chuyon dIa bang 2
64
=2
4
x 2
60
2
4
x 10
18
=1.6 x10
19


MoI nam co khoang 3.2 x 10
7
gIay. CIa su moI Ian dI chuyon mof dIa duoc fhuc
hIon maf 1 gIay, fh foan bo cong vIoc cua cac IInh muc so phaI fhuc hIon maf 5
x 10
11
nam. Cac nha fhIon van hoc uoc doan fuoI fho cua vu fru so nho hon 20 fI
nam, nhu vay, fhoo fruyon fhuyof cua baI foa n nay fh fho gIoI con koo daI hon ca
vIoc fnh foan do don 25 Ian!

Khong co mof may fnh nao co fho chay duoc chuong frnh Thap Ha NoI, do
khong du fhoI gIan, nhung ro rang khong phaI Ia do van do khong gIan. Khong
gIan o day chI doI hoI 64 Ian goI do quy.
6.2. Cuc nguyen tuc cuu de quy
6.2.1. Thet ke gu thuut de quy
o quy Ia mof cong cu cho phop nguoI Iap frnh fap frung vao buoc chnh you
cua gIaI fhuaf ma khong phaI Io Iang faI fhoI dIom khoI dau vo cach kof noI buoc
chnh you nay voI cac buoc khac. KhI can gIaI quyof mof van do, buoc fIop can
dau fIon non Iam fhuong Ia xom xof mof vaI v du don gIan, va chI sau khI da
hIou duoc chung mof cach ky Iuong, chung fa moI fhu co gang xay dung mof
phuong phap fong quaf hon. Mof vaI dIom quan frong frong vIoc fhIof ko mof gIaI
fhuaf do quy duoc IIof ko sau day:

TIm buoc chInh yeu. Hay baf dau bang cau hoI Bai toan nay co tbc Juoc cbia
nbo nbu tbc nao: hoac Buoc cbinb ycu trong giai Joan giua sc Juoc tbuc bicn
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 101
nbu tbc nao:. Non dam bao rang cau fra IoI cua ban don gIan nhung co fnh fong
quaf. Khong non dI fu dIom khoI dau hay dIom kof fhuc cua baI foan Ion, hoac sa
vao qua nhIou fruong hop dac bIof |do chung chI phu hop voI cac baI foan nho).
KhI da co duoc mof buoc nho va don gIan do huong foI IoI gIaI, hay fu hoI rang
nhung khuc mac con IaI cua baI foan co fho duoc gIaI quyof bang cach fuong fu
hay khong, do sua IaI phuong phap cua ban cho fong quaf hon, nou can fhIof.
NgoaI fru nhung djnh nghIa foan hoc fho hIon su do quy qua ro rang, mof dIou
fhu vj ma chung fa so Ian Iuof gap frong nhung chuong sau Ia, khI nhung baI foan
can duoc gIaI quyof fron nhung cau fruc du IIou ma djnh nghIa mang fnh chaf do
quy nhu danh sach, chuoI ky fu bIou dIou bIou fhuc so hoc, cay, hay do fhj, fh
gIaI phap huong foI mof gIaI fhuaf do quy Ia raf do nhn fhay.

TIm deu ken dung. Iou kIon dung chI ra rang baI foan hoac mof phan nao
do cua baI foan da duoc gIaI quyof. Iou kIon dung fhuong Ia fruong hop nho, dac
bIof, co fho duoc gIaI quyof mof cach do dang khong can do quy.

Phuc thuo gu thuut. Kof hop dIou kIon dung voI buoc chnh you cua baI foan,
su dung Ionh I do chon Iua gIua chung. on day fh chung fa co fho vIof ham do
quy, frong do mo fa cach ma buoc chnh you duoc fIon hanh cho don khI gap duoc
dIou kIon dung. MoI Ian goI do quy hoac Ia phaI gIaI quyof mof phan cua baI foan
khI gap mof frong cac dIou kIon dung, hoac Ia phaI gIam kch fhuoc baI foan
huong dan don dIou kIon dung.

Kem tru su ket thuc. Ko fIop, va cung Ia dIou foI quan frong, Ia phaI chac chan
vIoc goI do quy so khong bj Iap vo fan. af dau fu mof fruong hop chung, qua mof
so buoc huu han, chung fa can kIom fra IIou dIou kIon dung co kha nang xay ra do
qua frnh do quy kof fhuc hay khong. Trong baf ky mof gIaI fhuaf nao, khI mof
Ian goI ham khong phaI Iam g, no fhuong quay vo mof cach om fham. oI voI
gIaI fhuaf do quy, dIou nay raf fhuong xay ra, do vIoc goI ham ma khong phaI Iam
g fhuong Ia mof dIou kIon dung. o do, can Iuu y rang vIoc goI ham ma khong
Iam g fhuong khong phaI Ia mof IoI frong fruong hop cua ham do quy.

Kem tru lu mo truong hop duc bet
CuoI cung chung fa cung can bao dam rang gIaI fhuaf cua chung fa Iuon dap ung
moI fruong hop dac bIof.

Ve cuy de quy. Cong cu chnh do phan fch cac gIaI fhuaf do quy Ia cay do quy.
Nhu chung fa da fhay frong baI foan Thap Ha NoI, chIou cao cua cay do quy IIon
quan maf fhIof don fong dung Iuong bo nho ma chuong frnh can don, va kch
fhuoc fong cong cua cay phan anh so Ian fhuc hIon buoc chnh you va cung Ia
fong fhoI gIan chay chuong frnh. Thong fhuong chung fa non vo cay do quy cho
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 102
mof hoac haI fruong hop don gIan cua baI foan cua chung fa v no so chI dan cho
chung fa nhIou dIou.
6.2.2. Cuch thuc hen cuu de quy
Cau hoI vo cach hIon fhuc cua mof chuong frnh do quy frong may fnh can
duoc fach roI khoI cau hoI vo su dung do quy do fhIof ko gIaI fhuaf.

Trong gIaI doan fhIof ko, chung fa non su dung moI phuong phap gIaI quyof van
do ma chung fo ra fhch hop voI baI foan, do quy Ia mof frong cac cong cu hIou
qua va IInh hoaf nay.

Trong gIaI doan hIon fhuc, chung fa can fm xom phuong phap nao frong so cac
phuong phap so Ia fof nhaf so voI fung fnh huong.

Co f nhaf haI cach do hIon fhuc do quy frong ho fhong may fnh. Quan dIom
chnh cua chung fa khI xom xof haI cach hIon fhuc khac nhau duoI day Ia, cho du
co su han cho vo khong gIan va fhoI gIan, chung cung non duoc fach rIong ra khoI
qua frnh fhIof ko gIaI fhuaf. Cac IoaI fhIof bj fnh foan khac nhau frong fuong
IaI co fho dan don nhung kha nang va nhung han cho khac nhau. Chung fa so fm
hIou haI cach hIon fhuc da xu Iy va don xu Iy cua do quy duoI day.
6.2.2.1. Hen thuc du xu ly: su dong tho
Co Io rang cach suy nghI fu nhIon vo qua frnh hIon fhuc cua do quy Ia cac
ham khong chIom nhung phan rIong frong cung mof may fnh, ma chung so duoc
fhuc hIon fron nhung may khac nhau. ang cach nay, khI mof ham can goI mof
ham khac, no khoI dong chIoc may fuong ung, va khI may nay kof fhuc cong vIoc,
no so fra vo chIoc may ban dau kof qua fnh duoc do chIoc may ban dau co fho
fIop fuc cong vIoc. Nou mof ham goI do quy chnh no haI Ian, don gIan no chI can
khoI dong haI chIoc may khac do fhuc hIon cung nhung dong Ionh y nhu nhung
dong Ionh ma no dang fhuc hIon. KhI haI may nay hoan faf cong vIoc chung fra
kof qua vo cho may goI chung. Nou chung can goI do quy, dI nhIon chung cung
khoI dong nhung chIoc may khac nua.

Thong fhuong bo xu Iy frung uong Ia fhanh phan daf nhaf frong ho fhong may
fnh, non baf ky mof y nghI nao vo mof ho fhong co nhIou hon mof bo xu Iy cung
can phaI xom xof don su Iang ph. Nhung raf co fho frong fuong IaI chung fa so
fhay nhung ho fhong may fnh Ion chua hang fram, nou khong Ia hang ngan, cac
bo vI xu Iy fuong fu frong cac fhanh phan cua no. KhI do fh vIoc fhuc hIon do
quy bang nhIou bo xu Iy song song so fro non bnh fhuong.

VoI da xu Iy, nhung nguoI Iap frnh so khong con xom xof cac gIaI fhuaf chI
nhu mof chuoI fuyon fnh cac hanh dong, fhay vao do, can phaI nhan ra mof so
phan cua gIaI fhuaf co fho fhuc hIon song song. Cach xu Iy nay con duoc goI Ia xu
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 103
Iy dong fhoI |concurrcnt). VIoc nghIon cuu vo xu Iy dong fhoI va cac phuong phap
kof noI gIua chung hIon faI Ia mof do faI nghIon cuu frong khoa hoc may fnh,
mof dIou chac chan Ia no so caI fIon cach ma cac gIaI fhuaf so duoc mo fa va hIon
fhuc frong nhIou nam foI.
6.2.2.2. Hen thuc don xu ly: vun de vung nho
o xom xof Iam cach nao ma do quy co fho duoc fhuc hIon frong mof ho fhong
chI co mof bo xu Iy, chung fa nho IaI co cau ngan xop cua cac Ian goI ham da duoc
gIoI fhIou o dau chuong nay. Mof ham khI duoc goI can phaI co mot vung nho
reng do chua cac bIon cuc bo va cac fham frj cua no, ko ca cac frj frong cac
fhanh ghI va dja chI quay vo khI no chuan bj goI mof ham khac. Sau khI ham kof
fhuc, no so khong con can don baf cu fhu g frong vung nho danh rIong cho no
nua. Thuc su lu khong co su khuc nhuu guu vec go mot hum de quy vu
vec go mot hum khong de quy. KhI mof ham chua kof fhuc, vung nho cua no
Ia baf kha xam pham. Mof Ian goI ham do quy cung Ia mof Ian goI ham rIong
bIof. Chung fa can chu y rang haI Ian goI do quy Ia hoan foan khac nhau, do
chung tu khong tron lun vung nho cuu chung kh chung chuu ket thuc.
oI voI nhung ham do quy, nhung fhong fIn Iuu fru danh cho Ian goI ngoaI can
duoc gIu cho don khI no kof fhuc, nhu vay mof Ian goI bon frong phaI su dung
mof vung khac Iam vung nho cua rIong no.

oI voI mof ham khong do quy, vung nho co fho Ia mof vung co djnh va duoc
danh cho Iau daI, do chung fa bIof rang mof Ian goI ham so duoc fra vo fruoc khI
ham co fho IaI duoc goI Ian nua, va sau khI Ian goI fruoc duoc fra vo, cac fhong
fIn frong vung nho cua no khong con can fhIof nua. Vung nho Iau daI duoc danh
san cho cac ham khong do quy co fho gay Iang ph raf Ion, do nhung khI ham
khong duoc you cau fhuc hIon, vung nho do khong fho duoc su dung vao muc dch
khac. o cung Ia cach quan Iy vung nho danh cho cac ham cua cac phIon ban cu
cua cac ngon ngu nhu FORTRAN va COBOL, va chnh dIou nay cung Ia Iy do ma cac
ngon ngu nay khong cho phop do quy.
6.2.2.3. Nhu cuu ve tho gun vu khong gun cuu mot quu trInh de quy
Chung fa hay xom IaI cay bIou dIon cac Ian goI ham: frong qua frnh duyof
cay, cac nuf duoc fhom vao hay Iay dI dung fhoo kIou cua ngan xop. Qua frnh
nay duoc mInh hoa frong hnh 6.1.
Tu hnh nay, chung fa co fho kof Iuan ngay rang fong dung Iuong vung nho
can do hIon fhuc do quy fI Io fhuan voI chIou cao cua cay do quy. Nhung nguoI Iap
frnh khong fm hIou ky vo do quy fhInh fhoang van nham Ian rang khong gIan
can phaI co IIon quan don fong so nuf frong cay. ThoI gIan chay chuong frnh IIon
quan don so Ian goI ham, do Ia fong so nuf frong cay; nhung dung Iuong vung nho
faI mof fhoI dIom chI Ia fong cac vung nho danh cho cac nuf nam fron duong dI
fu nuf fuong ung voI ham dang fhuc fhI nguoc vo goc cua cay. Khong gIan can
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 104
fhIof duoc phan anh boI chIou cao cua cay. Mof cay do quy co nhIou nuf nhung
khong cao fho hIon mof qua frnh do quy ma no fhuc hIon duoc raf nhIou cong
vIoc fron mof vung nho khong Ion.

6.2.3. Oe quy duo
Chung fa hay xof don fruong hop hanh dong cuoI cung frong mof ham Ia vIoc
goI do quy chnh no. Hay xom xof ngan xop danh cho qua frnh do quy, nhu chung
fa fhay, cac fhong fIn can do khoI phuc IaI frang fhaI cho Ian do quy ngoaI so
duoc Iuu IaI ngay fruoc khI Ian do quy frong duoc goI. Tuy nhIon khI Ian do quy
frong fhuc hIon xong fh Ian do quy ngoaI cung khong con vIoc g phaI Iam nua,
do vIoc goI do quy Ia hanh dong cuoI cung cua ham non day cung Ia Iuc ma ham
do quy ngoaI kof fhuc. Va nhu vay vIoc Iuu IaI nhung fhong fIn dung do khoI phuc
frang fhaI cu cua Ian do quy ngoaI fro non hoan foan vo ch. MoI vIoc can Iam o
day chI Ia gan cac frj can fhIof cho cac bIon va quay ngay fro vo dau ham, cac
bIon duoc gan frj y nhu Ia chnh ham do quy bon frong nhan duoc qua danh sach
fhong so vay. Chung fa fong kof nguyon fac nay nhu sau:

Ncu Jong /cnb se c chay cuoi cung trong mot bam /a goi Jc quy cbinb
no, tb oicc goi Jc quy nay co tbc Juoc /oai bo bang cacb gan /ai cac tbong so goi
tbco cac gia trj nbu /a Jc quy oan Juoc goi, oa sau Jo /ap /ai toan bo bam.


HInh 6.6 o quy duoI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 105
Qua frnh fhay doI nay duoc mInh hoa frong hnh 6.6. Hnh 6.6a fho hIon
vung nho duoc su dung boI chuong frnh goI M va mof so ban sao cua ham do quy
P, moI ham mof vung nho rIong. Cac muI fon xuong fho hIon su goI ham. MoI su
goI fu P don chnh no cung Ia hanh dong cuoI frong ham, vIoc duy fr vung nho
cho ham frong khI cho doI su fra vo fu ham duoc goI Ia khong can fhIof. Cach
bIon doI nhu fron so gIam kch fhuoc vung nho dang ko |hnh 6.6b). CuoI cung,
hnh 6.6c bIou dIon cac Ian goI ham P nhu mof dang Iap IaI frong cung mof muc
cua so do.

Truong hop dac bIof chung fa vua nou fron Ia vo cung quan frong v no cung
fhuong xuyon xay ra. Chung fa goI do Ia fruong hop do quy duoI |tai/ rccursion).
Chung fa non can fhan rang frong do quy duoI, vIoc goI do quy Ia hunh dong
cuo trong hum, chu khong phaI Ia dong lenh cuo duoc vet trong hum.
Trong chuong frnh co khI chung fa fhay do quy duoI xuaf hIon frong Ionh
switch hoac Ionh if frong ham ma sau do con co fho co nhIou dong Ionh khac
nua.

oI voI phan Ion cac frnh bIon djch, chI co mof su khac nhau nho gIua fhoI
gIan chay frong haI fruong hop: fruong hop do quy duoI va fruong hop no da duoc
fhay fho bang vong Ionh Iap. Tuy nhIon, nou khong gIan duoc xom Ia quan frong,
fh vIoc IoaI do quy duoI Ia raf can fhIof. o quy duoI fhuong duoc fhay boI vong
Iap while hoac do while.

Trong gIaI fhuaf chIa do frj cua baI foan Thap Ha NoI, Ian goI do quy fron
khong phaI Ia do quy duoI, Ian goI sau do moI Ia do quy duoI. Ham sau day da
duoc IoaI do quy duoI:

void move(int count, int start, int finish, int temp)
/* move: phIon ban Iap.
pre: count Ia so dIa can dI chuyon.
post: count dIa da duoc chuyon fu start sang finish dung temp Iam noI chua fam.
*/
{
int swap;
while (count > 0) { // Thay Ionh if frong do quy bang vong Iap.
move(count - 1, start, temp, finish);// Ian goI do quy dau khong phaI
// do quy duoI.
cout << "Move disk " << count << " from " << start
<< " to " << finish << "." << endl;
count--; // Thay doI cac fhong so cho fuong duong voI vIoc goI do quy duoI.
swap = start;
start = temp;
temp = swap;
}
}

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 106
Thaf ra chung fa co fho nghI ngay don phuong an nay khI moI baf dau gIaI baI
foan. Nhung chung fa da xom xof no fu mof cach nhn khac, bay gIo chung fa so
Iy gIaI IaI cac dong Ionh fron mof cach fu nhIon hon. Chung fa so fhay rang haI
fhap start va temp khong co g khac nhau, do chung cung duoc su dung do Iam
noI chua fam frong khI chung fa chuyon dan cac dIa vo fhap finish.
o chuyon mof so dIa fu start vo finish, chung fa chuyon faf ca dIa frong so
do, fru caI cuoI cung, sang fhap con IaI Ia temp. Sau do chuyon dIa cuoI sang
finish.

TIop fuc Iap IaI vIoc vua roI, chung fa IaI can chuyon faf ca cac dIa fu temp,
fru caI cuoI cung, sang fhap con IaI Ia start, do co fho chuyon dIa cuoI cung sang
finish. Ian fhuc hIon fhu haI nay su dung IaI cac dong Ionh frong chuong frnh
bang cach hoan doI start voI temp. Cu nhu fho, sau moI Ian hoan doI start voI
temp, cong vIoc duoc Iap IaI y nhu nhau, kof qua cua moI Ian Iap Ia chung fa co
duoc fhom mof dIa moI fron finish.
6.2.4. Phun tIch mot so truong hop nen vu khong nen dung de quy
6.2.4.1. Gu thuu
Chung fa hay xom xof haI ham fnh gIaI fhua sau day. ay Ia ham do quy:

int factorial(int n)
/* factorial: phIon ban do quy.
pre: n Ia mof so khong am.
post: fra vo frj cua n gIaI fhua.
*/
{
if (n == 0) return 1;
else return n * factorial(n - 1);
}

Va day Ia ham khong do quy:
int factorial(int n)
/* factorial: phIon ban khong do quy.
pre: n Ia mof so khong am.
post: fra vo frj cua n gIaI fhua.
*/
{
int count, product = 1;
for (count = 1; count <= n; count++)
product *= count;
return product;
}

Chuong frnh nao fron day su dung f vung nho hon7 VoI caI nhn dau fIon,
duong nhu chuong frnh do quy chIom f vung nho hon, do no khong co bIon cuc
bo, con chuong frnh khong do quy co don haI bIon cuc bo. Tuy nhIon, chuong
frnh do quy can mof ngan xop do chua n con so
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 107
n, n-1, n-2, ..., 2, 1

Ia nhung fhong so do goI do quy |hnh 6.7), va fhoo cach do quy cua mnh, no
cung phaI nhan cac so IaI voI nhau fhoo mof fhu fu khong khac g so voI chuong
frnh khong do quy. TIon frnh fhuc hIon cua chuong frnh do quy cho n = 5 nhu
sau:





Nhu vay chuong frnh do quy chIom nhIou vung nho hon chuong frnh khong do
quy, dong fhoI no cung chIom nhIou fhoI gIan hon do chung vua phaI caf va Iay
cac frj fu ngan xop vua phaI fhuc hIon vIoc fnh foan.
6.2.4.2. Cuc so Fibonacci
Mof v du con Iang ph hon chuong frnh fnh gIaI fhua Ia vIoc fnh cac so
Fibonacci. Cac so nay duoc djnh nghIa nhu sau:

F
0
= 0, F
1
= 1, F
n
= F
n-1
+ F
n-2
nou n 2.

Chuong frnh do quy fnh cac so Fibonacci raf gIong voI djnh nghIa:

int fibonacci(int n)
/* fibonacci: phIon ban do quy.
pre: n Ia mof so khong am.
post: fra vo so Fibonacci fhu n.
*/
{
if (n <= 0) return 0;
else if (n == 1) return 1;
else return fibonacci(n - 1) + fibonacci(n - 2);
}


HInh 6.?
Cay do quy fnh gIaI fhua
factorial(5) =5*factorial(4)
=5*(4*factorial(3))
=5*(4*(3*factorial(2)))
=5*(4*(3*(2*factorial(1))))
=5*(4*(3*(2*(1*factorial(0)))))
=5*(4*(3*(2*(1*1))))
=5*(4*(3*(2*1)))
=5*(4*(3*2))
=5*(4*6)
=5*24
=120
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 108
Thuc fo, chuong frnh nay frong raf dop maf, do no co dang chIa do frj: kof
qua co duoc bang cach fnh foan haI fruong hop nho hon. Tuy nhIon, chung fa so
fhay rang day hoan foan khong phaI Ia fruong hop chIa do frj, ma Ia chIa Iam
cho phuc fap fhom.


o xom xof gIaI fhuaf nay, chung fa fhu fnh I
7
, mInh hoa frong hnh 6.8.
Truoc hof ham can fnh I
6
va I
5
. o co I
6
, phaI co I
5
va I
4
, va cu nhu fho fIop
fuc. Nhung sau khI I
5
duoc fnh do co duoc I
6
, fh I
5
so khong duoc gIu IaI. Nhu
vay do fnh I
7
sau do, I
5
IaI phaI duoc fnh IaI. Cay do quy da cho chung fa fhay
raf ro rang chuong frnh do quy phaI Iap dI Iap IaI nhIou phop fnh mof cach
khong can fhIof.Tong fhoI gIan do ham do quy fnh duoc I
n
Ia mof ham mu cua n.

Cung gIong nhu vIoc fnh gIaI fhua, chung fa co fho co duoc mof chuong frnh
don gIan bang cach gIu IaI ba bIon, do Ia frj cua so Fibonacci moI nhaf va haI so
Fibonacci ko fruoc:

int fibonacci(int n)
/* fibonacci: phIon ban khong do quy.
pre: n Ia mof so khong am.
post: fra vo so Fibonacci fhu n.
*/
{

HInh 6.8- Cay do quy fnh I
7
.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 109
int current; // so Fibonacci hIon faI F
i

int last_value; // F
i-1

int last_but_one; // F
i-2
if (n <= 0) return 0;
else if (n == 1) return 1;
else {
last_but_one = 0;
last_value = 1;
for (int i = 2; i <= n; i++) {
current = last_but_one + last_value;
last_but_one = last_value;
last_value = current;
}
return current;
}
}
Chuong frnh khong do quy nay co fhoI gIan chay fI Io voI n.
6.2.4.3. So sunh guu de quy vu khong de quy
au Ia dIou khac nhau co ban gIua chuong frnh vua roI voI chuong frnh do
quy7 o fra IoI cau hoI nay, chung fa hay xom xof IaI cay do quy. VIoc phan fch
cay do quy so dom IaI nhIou fhong fIn huu ch gIup chung fa bIof duoc khI nao fh
non su dung do quy va khI nao fh khong.

Nou mof ham goI do quy chnh no chI co mof Ian fh cay do quy so co dang raf
don gIan: do Ia mof chuoI cac mac xch, co nghIa Ia, moI nuf chI co duy nhaf mof
con. Nuf con nay fuong ung voI mof Ian goI do quy. oI voI ham gIaI fhua, do chI
don gIan Ia mof danh sach cac you cau vIoc fnh foan cac so gIaI fhua fu |n-1)! cho
don 1!. ang cach doc cay do quy fu duoI Ion fron fhay v fu fron xuong duoI,
chung fa co ngay chuong frnh khong do quy fu mof chuong frnh do quy. KhI mof
cay suy gIam fhanh mof danh sach, vIoc chuyon fu chuong frnh do quy fhanh
chuong frnh khong do quy fhuong do dang, va kof qua co duoc fhuong fIof kIom
ca khong gIan Ian fhoI gIan.

Iuu y rang mof ham goI do quy chnh ban fhan no co fho co nhIou dang khac
nhau. ong goI do quy hoac Ia chI xuaf hIon mof Ian frong mof vong Iap nhung
fhuc su IaI duoc goI nhIou Ian, hoac Ia xuaf hIon haI Ian frong Ionh ro nhanh if,
else nhung fhuc su chI duoc fhuc hIon co mof Ian.

Cay do quy fnh cac so Fibonacci khong phaI Ia mof chuoI cac mac xch. No
chua mof so raf Ion cac nuf bIou dIon nhung cong vIoc duoc Iap IaI. KhI chuong
frnh do quy chay, no fao mof ngan xop do su dung frong khI duyof qua cay. Tuy
nhIon, cac kof qua Iuu vao ngan xop khI Iay ra chI duoc su dung co mof Ian va so
bj maf dI ma khong fho su dung IaI |v dInh ngan xop sau khI duoc fruy xuaf can
duoc IoaI bo moI co fho fruy xuaf fIop nhung phan fu khac frong ngan xop), va
nhu vay mof cong vIoc nao do co fho phaI duoc fhuc hIon nhIou Ian.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 110
Trong nhung fruong hop nhu vay, fof hon hof Ia fhay ngan xop bang mof cau
fruc du IIou khac, mof cau fruc du IIou ma cho phop fruy nhap vao nhIou vj fr
khac nhau fhay v chI o dInh nhu ngan xop. Trong v du don gIan vo cac so
Fibonacci, chung fa chI can fhom haI bIon fam do chua haI frj can cho vIoc fnh
so moI.

CuoI cung, khac voI vIoc mof chuong frnh do quy fu fao cho mnh mof ngan
xop rIong, bang cach fao mof ngan xop fuong mInh, chung fa Iuon co fho chuyon
moI chuong frnh do quy fhanh chuong frnh khong do quy. Chuong frnh khong
do quy fhuong phuc fap va kho hIou hon. Nou mof chuong frnh do quy co fho
chay duoc voI mof khong gIan va fhoI gIan cho phop, fh chung fa khong non khu
do quy fru fruong hop ngon ngu Iap frnh ma chung fa su dung khong co kha
nang do quy.
6.2.4.4. So sunh guu Fibonacci vu Thup Hu No: kIch thuoc cuu lo gu
Ham do quy fnh cac so Fibonacci va ham do quy gIaI baI foan Thap Ha NoI
dou co dang chIa do frj raf gIong nhau. MoI ham dou goI do quy chnh no haI Ian
cho cac fruong hop nho hon. Tuy nhIon, v sao chuong frnh Thap Ha NoI IaI vo
cung hIou qua frong khI chuong frnh fnh cac so Fibonacci IaI hoan foan nguoc
IaI7 Cau fra IoI IIon quan don kch fhuoc cua IoI gIaI. o fnh mof so Fibonacci,
ro rang kof qua ma chung fa can chI co moI mof so, va chung fa mong muon vIoc
fnh foan so hoan faf qua mof so f cac buoc, nhu Ia cac dong Ionh frong chuong
frnh khong do quy. Trong khI do, chuong frnh do quy Fibonacci IaI fhuc hIon
qua nhIou buoc. Trong chuong frnh Thap Ha NoI, nguoc IaI, kch fhuoc cua IoI
gIaI Ia so cac IoI chI dan can In ra cho cac IInh muc va Ia mof ham mu cua fong so
dIa.
6.2.5. Cuc nhun xet
o dI don kof Iuan vo gIaI phap Iua chon cho mof chuong frnh do quy hay
khong do quy, dIom baf dau fof nhaf cung Ia xom xof cay do quy. Nou cay do quy
co dang don gIan, chuong frnh khong do quy so fof hon. Nou cay chua nhIou cong
vIoc duoc Iap IaI ma cac cau fruc du IIou khac fhch hop hon Ia ngan xop, fh do
quy cung khong con can fhIof nua. Nou cay do quy fhuc su ram rap, ma frong do
so cong vIoc Iap IaI khong dang ko, fh chuong frnh do quy Ia gIaI phap fof nhaf.

Ngan xop duoc su dung khI do quy |do chuong frnh do quy fu fao Iay) duoc
xom nhu mof danh sach chua cac cong vIoc can fr hoan cua chuong frnh. Nou
danh sach nay co fho duoc fao fruoc, fh chung fa non vIof chuong frnh khong do
quy, nguoc IaI, chung fa so vIof chuong frnh do quy. o quy nhu mof cach fIop
can fu fron xuong khI can gIaI quyof van do, no chIa baI foan fhanh nhung baI
foan nho hon, hoac chon ra buoc chu you va fr hoan cac buoc con IaI. Chuong
frnh khong do quy gan voI cach fIop can fu duoI Ion, no baf dau fu nhung caI da
bIof va fung buoc xay dung non IoI gIaI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 111
Mof chuong frnh do quy Iuon co fho duoc fhay fho boI mof chuong frnh
khong do quy co su dung ngan xop. Iou nguoc IaI cung Iuon dung: mof chuong
frnh khong do quy co su dung ngan xop co fho duoc fhay boI chuong frnh do quy
khong co ngan xop. o do, khong nhung nguoI Iap frnh fhuong phaI fu hoI co
non khu do quy hay khong, ma doI khI chnh ho IaI can daf cau hoI nguoc IaI, co
non chuyon fhanh do quy mof chuong frnh khong do quy co su dung ngan xop
hay khong. Iou fhu haI nay co fho dan don mof chuong frnh gan voI ban chaf
fu nhIon cua baI foan hon va do do do hIou hon. o cung Ia mof cach do caI fIon
cach fIop can baI foan cung nhu cac kof qua daf duoc.

Co mof so IoI khuyon frong vIoc su dung do quy, do Ia chung fa khong non
dung do quy khI cau fra IoI cho baf ky cau hoI nao duoI day dou Ia khong:
an fhan gIaI fhuaf hoac cau fruc du IIou co fnh chaf do quy mof cach fu
nhIon7
IoI gIaI do quy ngan gon va do hIou hon7
IoI gIaI do quy doI hoI mof khong gIan va fhoI gIan chap nhan duoc7

Cuc buoc go y trong vec khu de quy duo

1. Su dung mof bIon do fhay fho cho vIoc goI do quy fro IaI.
2. Su dung mof vong Iap voI dIou kIon kof fhuc gIong nhu dIou kIon dung cua
do quy.
3. af faf ca cac Ionh von can fhuc hIon frong Ian goI do quy duoI vao frong
vong Iap.
4. Thay Ionh goI do quy bang mof phop gan.
5. ung cac Ionh gan do gan cac frj nhu Ia cac fhong so ma ham do quy Io ra
nhan duoc.
6. Tra vo frj cho bIon da djnh nghIa o buoc 1.

Cuc buoc go y trong vec khu de quy mot cuch tong quut

Chung fa co fho fao mof ngan xop do chua cac ban ghI. Ionh goI do quy va Ionh
fra vo fu ham do quy co fho duoc fhay fho nhu sau. MoI Ionh goI do quy co fho
duoc fhay boI:
1. ua vao ngan xop mof ban ghI chua cac bIon cuc bo, cac fhong so va vj fr
dong Ionh ngay sau Ionh goI do quy.
2. Can moI fhong so vo cac frj moI fhch hop.
3. Tro vo fhuc hIon dong Ionh dau fIon frong gIaI fhuaf do quy.
4. MoI Ionh fra vo cua ham do quy duoc fhay boI:
5. Iay fu ngan xop do khoI phuc moI bIon cuc bo va fhong so.
6. af dau fhuc hIon dong Ionh faI vj fr ma fruoc do da duoc caf frong ngan
xop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 112
6.3. Phuong phup quuy lu (backtracking)
Nhu mof ung dung kha phuc fap vo do quy, chung fa hay xom xof mof cau do
raf pho bIon vo vIoc Iam cach nao do daf fam con hau fron mof ban co co fam
hang va fam cof sao cho chung khong fho nhn fhay nhau. Thoo Iuaf cua ban co
fh mof con hau co fho nhn fhay nhung con co khac nam fron hang, hoac cof,
hoac haI duong choo co chua no.

Iam cach nao do gIaI cau do nay, dIou na y con kha mo ho. Ngay ca nha foan
hoc noI fIong Causs C. I. van chua fm ra duoc mof IoI gIaI day du khI ong xom
xof cau do nay vao nam 1850. Iou fhuong xay ra doI voI cac cau do duong nhu
Ia khong co mof cach nao co fho dua ra cac IoI gIaI co duoc su phan fch day du,
ma chI co nhung IoI gIaI duoc phaf hIon mof cach fnh co do su may man cua mof
so Ian ap dung phuong phap fhu saI, hoac sau khI da fhuc hIon mof so Iuong
khong Io cac phop fnh. Hnh 6.9 cho chung fa haI phuong an fhoa you cau cau do
va cung cho chung fa fIn rang cau do co IoI gIaI.

Trong phan nay, chung fa so phaf frIon haI chuong frnh do gIaI baI foan fam
con hau, dong fhoI chung fa cung so fhay duoc rang, vIoc Iua chon cac cau fruc du
IIou co fho anh huong Ion mof chuong frnh do quy nhu fho nao.

6.3.1. Lo gu cho bu toun tum con huu
af ky aI khI fhu fm IoI gIaI cho baI foan fam con hau fhuong ngay Iap fuc bj
cuon huf vao vIoc fm cach daf nhung con hau Ion ban co, co fho Ia ngau nhIon, co
fho fhoo mof fraf fu Iuan Iy nao do, nhung du cach nao dI nua fh dIou chac chan
xay ra Ia con hau duoc daf sau so khong bao gIo duoc nhn fhay cac con hau da
duoc daf fruoc do. ang cach nay, nou may man, mof nguoI co fho daf duoc ca


HInh 6.9- HaI cau hnh fhoa dIou kIon cua baI foan fam con hau.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 113
fam con hau fhoa you cau baI foan, va do Ia mof IoI gIaI. Nou khong may, mof
hoac nhIou con hau so phaI duoc Iay dI do daf IaI vao nhung cho khac va vIoc fm
IoI gIaI IaI duoc fIop fuc.

Chung fa so vIof mof ham do quy solve_from do gIaI baI foan nay. Cong vIoc
can Iam faI mof fhoI dIom |mof frang fhaI nao do cua ban co ma so hau chua du)
Ia:
af fhom mof con hau vao mof vj fr hop Io.
CoI do quy do xu Iy fuong fu voI so hau can xu Iy fIop da gIam 1.

Iop Queens duoI day so co mof so phuong fhuc can fhIof ma chung fa so ban
don chI fIof sau. O day chung chI can bIof rang doI fuong configuration cua no
so chua mof frang fhaI cua ban co. KhI no Iam fhong so cho Ian do quy bon frong,
no da co duoc fhom mof con hau hop Io. Trong Ian goI solve_from dau fIon fu
chuong frnh chnh, so hau can gIaI quyof Ia 8 va ban co chua co hau nao.

solve_from(Queens configuration)
{
1. if configuration Queens da co fam con hau
1. print configuration
2. else
1. for moI o cua ban co ma chua bj nhn fhay boI con hau nao {
1. af mof con hau Ion o p cua configuration;
2. solve_from(configuration);
3. Iay con hau ra khoI o p cua configuration;
}
}

Ro rang Ia sau moI buoc do quy, kch fhuoc baI foan gIam dan. Chung fa co
dIom dung cua do quy Ia khI ca 8 con hau dou da fm duoc vj fr fhch hop |Ionh
ro nhanh if), hoac khI khong con fm duoc vj fr nao hop Io cho con hau can daf
fIop nua |fruong hop vong Iap for da quof hof cac vj fr hop Io con IaI).

VIoc daf mof con hau o mof o p chI Ia mof buoc fhu nghIom, chung fa van con
chua fhay doI vj fr cua no frong khI ma chung fa con co fho fIop fuc daf nhung
con hau khac cho don khI daf duoc ca 8 con. Va cung gIong nhu khI nguoI fa Iam
bang fay, khI khong con vj fr nao co fho daf fIop hau, ham solve_from cung
phaI Iay dI nhung con hau da daf |dong Ionh 2.1.3) do fIop fuc fhu voI nhung vj
fr hop Io khac |vong Iap for so Ian Iuof chuyon sang cac vj fr nay). Ro rang Ia
nou khong fho fIop fuc daf fhom mof con hau nao do nua fh vIoc quay IuI Ia do
fhay doI Ian fhu nghIom vua roI sang mof phuong an khac do fIop fuc fm IoI gIaI.
Tuy nhIon, gIaI fhuaf quay IuI cua chung fa con co mof dac dIom nua Ia khI da daf
duoc IoI gIaI cho ca 8 con hau, fh chuong frnh cung van quay IuI, va vIoc quay IuI
nay Ia do fm fhom nhIou IoI gIaI khac. Tom IaI, khI mof Ian goI do quy bon frong
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 114
kof fhuc, chuong frnh cua chung fa so Iuon IuI mof buoc do khao saf fIop cac kha
nang khac con IaI, va gIaI fhuaf so cho dap an Ia faf ca cac IoI gIaI cua baI foan.

6.3.2. VI du vo bon con Huu
Chung fa so xof xom gIaI fhuaf fron duoc fhuc hIon nhu fho nao cho mof
fruong hop don gIan, do Ia baI foan daf bon con hau Ion ban co 4x4, hnh 6.10.

Chung fa can phaI daf moI con hau Ion mof hang cua ban co. Chung fa Iuon
baf dau fhu fu o cuc fraI con hop Io cua hang. O ha ng fron cung chung fa chon o o
goc fraI |hnh 6.10a). Cac dau hoI danh dau nhung Iua chon hop Io khac ma chung
fa chua fhu don. Truoc khI fhu cac o nay, chung fa chuyon sang hang fhu haI. HaI
o dau fIon da bj nhn fhay boI con hau o hang 1, chung fa danh dau bang dau
choo. O fhu 3 va fhu 4 con fu do, chung fa fIop fuc fhu voI o fhu 3 va dang dau
hoI cho o fhu 4. TIop fhoo chung fa chuyon xuong hang fhu 3, nhung ca bon o o
hang nay dou da bj nhn fhay boI mof frong haI con hau o haI hang fron. Xom
nhu chung fa da gap dIom chof.

KhI gap mof dIom chof, chung fa can phaI quay nguoc IaI va bo dI su Iua chon
moI nhaf do fhu mof kha nang khac. Truong hop nay fho hIon frong hnh 6.10b),
con hau o hang fhu nhaf khong doI nhung con hau o hang fhu haI da duoc fhu voI
vj fr con IaI Ia o fhu 4 |o fhu 3 vua fhu fhaf baI duoc danh dau choo). Sau do
chung fa fhay o hang fhu ba chI co o fhu 2 Ia fu do, nhung khI fIop fuc sang hang
fhu 4 fh cung khong con o nao fu do. Iuc nay chung fa IaI gap mof dIom chof
moI, chung fa IaI can phaI quay nguoc IaI.

TaI dIom nay, quay nguoc Ion hang fron, chung fa fhay hang fhu ba khong
con kha nang Iua chon nao, nguoc Ion hang fhu haI cung vay. o do chung fa
phaI quay nguoc Ion don hang fhu nhaf, o fhu moI frong hang nay Ia o fhu 2
|hnh 6.10c). KhI dI xuong, chung fa fhay hang fhu haI chI co mof kha nang Iua
chon, do Ia o fhu 4. Xuong hang fhu ba chI co o fhu 1 Ia fu do. CuoI cung, o hang
fhu fu co mof o fu do Ia o 3. Tuy nhIo n day chI Ia mof fruong hop fhoa you cau

HInh 6.10 IoI gIaI cho baI foan bon con hau
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 115
baI foan, ma chua phaI Ia mof IoI gIaI fron von cho baI foan daf bon con hau Ion
ban co 4x4.

Nou muon fm moI IoI gIaI, chung fa co fho fIop fuc bang cach fuong fu: quay
nguoc IaI Ian Iua chon moI nhaf do fhu voI kha nang fIop fhoo. Trong hnh 6.10c
khong con Iua chon nao khac o hang fhu fu, hang fhu ba va hang fhu haI. o do
chung fa nguoc Ion don hang fhu nhaf, fhu o fhu 3. Iua chon nay dan don mof IoI
gIaI duy nhaf o hnh 6.10d.

CuoI cung, khI fhu voI o 4 o hang fhu nhaf, chung fa cung khong fhu fhom
mof kof qua nao. Thuc ra, cau hnh voI con hau o o 3 va con hau o o 4 cua hang
fhu nhaf chnh Ia haI hnh anh nguoc cua o 2 va o 1 fuong ung. Nou chung fa dI
fu fraI sang phaI fron hnh 6.10c, chung fa co duoc cau hnh o hnh 6.10d.

6.3.3. Phuong phup quuy lu (Backtracking)
Phuong phap fron duoc goI Ia gIaI fhuaf quay IuI. Trong do, vIoc fm mof IoI
gIaI day du duoc fhuc hIon bang cach xay dung cac IoI gIaI rIong phan sao cho
chung Iuon fhoa nhung dIou kIon cua baI foan. CIaI fhuaf duoc ap dung do koo daI
mof IoI gIaI rIong phan cho fhanh mof IoI gIaI fron von. Tuy nhIon, faI mof buoc
nao do, nou co su vI pham dIou kIon cua baI foan, gIaI fhuaf so quay nguoc fro IaI,
bo dI su Iua chon moI nhaf do fhu voI mof kha nang cho phop khac.

CIaI fhuaf quay IuI fo ra hIou qua frong nhung fruong hop ma ban dau fuong
nhu co raf nhIou kha nang Iua chon, nhung sau do chI mof so f kha nang Ia con
sof IaI sau fIon frnh kIom fra xa hon. Trong cac baI foan xop fhoI khoa bIou,
chang han frong vIoc fo chuc cac vong dau fho fhao, su Iua chon fhoI gIan cho
mof so fran dau ban dau fhuong Ia raf do, nhung cang vo sau, cac rang buoc so
Iam gIam dang ko cac kha nang co fho.

Phan fIop fhoo day chung fa so fm hIou cach hIon fhuc cu fho cho baI foan
con hau cung nhu mof so chuong frnh IIon quan don cac fro choI, do fhay duoc y
fuong do quy va gIaI fhuaf quay IuI Ia cof IoI cua nhung baI foan o dang nay.

6.3.4. Phuc thuo chung cho chuong trInh dut cuc con huu len bun co
6.3.4.1. Chuong trInh chInh
Mac du chung fa con phaI xac djnh raf nhIou chI fIof vo cau fruc du IIou do
chua cac vj fr cua cac con hau fron ban co, nhung o day chung fa van co fho vIof
fruoc chuong frnh chnh do goI ham do quy ma chung fa da phac fhao.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 116
au fIon cac fhong fIn vo chuong frnh so duoc In ra. o vIoc kIom fra chuong
frnh voI nhung baI foan nho hon Ia co ch, chang han voI baI foan chI co bon con
hau, chung fa so cho phop nguoI su dung nhap vao so con hau fhoo y muon. ay
cung Ia kch fhuoc cua ban co |board-size). Hang so max_board so duoc khaI
bao frong fIIo queens.h.

int main()
/*
pre: NguoI su dung can cho bIof kch fhuoc cua ban co.
post: MoI IoI gIaI cho baI foan cac con hau duoc In ra.
uses: Iop Queens va ham do quy solve_from.
*/
{
int board_size;
print_information();
cout << "What is the size of the board? " << flush;
cin >> board_size;
if (board_size < 0 || board_size > max_board)
cout << "The number must be between 0 and " << max_board << endl;


else {
Queens configuration(board_size); // an co chua co hau nao.
solve_from(configuration);
}
}
6.3.4.2. Lop Queens
jnh nghIa bIon Queens configuration(board_size) dung mof
constructor co fhong so cua Iop Queens do fao mof ban co co kch fhuoc fhoo su
Iua chon cua nguoI su dung va khoI fao mof doI fuong Queens rong co fon Ia
configuration. oI fuong Queens rong nay duoc goI cho ham do quy cua chung
fa, frong do cac con hau so duoc daf Ian Iuof Ion ban co.

Phac fhao frong phan 6.3.1 cho fhay Iop Queens can cac phuong fhuc nhu In
mof frang fhaI, fhom mof con hau vao mof o fron ban co, Iay con hau nay dI,
kIom fra xom mof o nao do co fu do hay khong. NgoaI ra, do hIon fhuc ham
solve_from, Iop Queens cung can chua du IIou Ia board_size do chua kch
fhuoc ban co cung nhu fhuoc fnh count do dom so con hau da duoc daf Ion ban
co.

Sau khI baf dau xay dung mof cau hnh, chung fa so fm o ko fIop bang cach
nao7 Ngay khI mof con hau vua duoc daf frong mof hang nao do, khong aI IaI dI
maf fh gIo vao vIoc fm mof vj fr khac cho con hau moI cung fron cung hang do,
do no chac chan so bj nhn fhay boI con hau vua daf xong. Khong fho co nhIou
hon mof con hau frong cung mof hang. Muc dch cua chung fa Ia daf cho duoc so
con hau duoc you cau Ion ban co |board_size), va o day cung chI co board_size
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 117
hang. o do moI hang phaI co chnh xac chI mof con hau. ay Ia nguyon fac fo
chIm cau |pigconbo/c princip/c): nou chung fa co n chu chIm va n caI fo va khong
cho phop nhIou hon mof con frong mof fo fh chung fa chI co fho daf moI con vao
mof fo va phaI dung hof cac fo. Chung fa co fho fIon hanh bang cach daf cac con
hau vao ban co, moI Ian cho mof hang, baf dau fu hang so 0, nhu vay count
khong chI Ia do dom so hau da duoc daf ma con Ia chI so cua hang so duoc daf
hau ko fIop.

Cac dac fa cho cac phuong fhuc cua Iop Queens nhu sau:

bool unguarded(int col) const;
post: fra vo true nou o fhuoc hang count (hang dang duoc xu Iy ko fIop) va cof col khong bj
nhn fhay boI mof con hau nao khac; nguoc IaI fra vo false.

void insert(int col);
pre: O faI hang count va cof col khong bj nhn fhay boI baf ky con hau nao.
post: Mof con hau vua duoc daf vao o faI hang count va cof col, count fang fhom 1.

void remove(int col);
pre: O faI hang count-1 va cof col dang co mof con hau.
post: Con hau fron duoc Iay dI, count gIam dI 1.

bool is_solved() const;
post: fra vo true nou so hau da daf vao ban co bang voI kch fhuoc ban co board_size; nguoc
IaI, fra vo false.
6.3.4.3. Hum de quy solve_from
VoI cac dac fa fron ham solve_from da phac fhao frong phan fruoc da duoc
cu fho hoa nhu sau. Tham so configuration duoc goI fham chIou do bon frong ham co fhay
doI no.

void solve_from(Queens &configuration)
/*
pre: an co da chua duoc count hau hop Io faI hang 0 don hang count -1.
post: n con hau da duoc daf hop Io Ion ban co.
uses: Iop Queens va cac ham solve_from, recursively.
*/


{
if (configuration.is_solved()) configuration.print();
else
for (int col = 0; col < configuration.board_size; col++)
if (configuration.unguarded(col)) {
configuration.insert(col);
solve_from(configuration);// CoI do quy fIop do fhom cac con hau con IaI.
configuration.remove(col);
}
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 118
6.3.5. Tnh che: Cuu truc du leu duu ten vu cuc phuong thuc
Mof cach hIon nhIon do hIon fhuc cau hnh Queens Ia Iuu ban co nhu mof
mang haI chIou, moI phan fu bIou dIon vIoc co hay khong mof con hau. Vay mang
haI chIou Ia Iua chon dau fIon cua chung fa cho cau fruc du IIou. Tap fIn
queens.h chua djnh nghIa sau:


const int max_board = 30;

class Queens {
public:
Queens(int size);
bool is_solved() const;
void print() const;
bool unguarded(int col) const;
void insert(int col);
void remove(int col);
int board_size; // Kch fhuoc cua ban co bang so hau can daf.
private:
int count;//Chua so hau da daf duoc va cung Ia chI so cua hang so duoc daf fIop hau.
bool queen_square[max_board][max_board];
};

VoI cau fruc du IIou nay, phuong fhuc fhom mof con hau do dang nhu sau:

void Queens::insert(int col)
/*
pre: O faI hang count va cof col khong bj nhn fhay boI baf ky con hau nao.
post: Mof con hau vua duoc daf vao o faI hang count va cof col, count fang fhom 1.
*/
{
queen_square[count++][col] = true;
}

Cac phuong fhuc is_solved, remove, print cung raf do va chung fa xom
nhu baI fap.

o khoI fao cau hnh Queens, chung fa can constructor co fhong so do daf
kch fhuoc cho ban co:

Queens::Queens(int size)
/*
post: an co duoc khoI fao chua co hau nao.
*/
{
board_size = size;
count = 0;
for (int row = 0; row < board_size; row++)
for (int col = 0; col < board_size; col++)
queen_square[row][col] = false;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 119
Thuoc fnh count khoI gan Ia 0 v chua co con hau nao duoc daf Ion ban co.
Constructor nay duoc fhuc hIon khI chung fa vua khaI bao mof doI fuong Queens
frong chuong frnh chnh.

CuoI cung, chung fa can vIof phuong fhuc kIom fra mof o faI mof cof nao do
fron hang dau fIon chua co hau |xof fu fron xuong) co bj nhn fhay boI cac con
hau da co fron ban co hay khong. Chung fa can xof cof hIon faI va haI duong choo
dI qua o nay. VIoc xof cof fhaf do dang, con vIoc xof duong choo can mof so fnh
foan vo chI so. Chung fa hay xom hnh 6.11 cho fruong hop ban co 4x4.

Chung fa co fho goI fon cho bon huong cua haI duong choo nhu sau: duong
choo fraI-duoI |/oucr-/cjt) huong xuong duoI vo bon fraI, duong choo phaI-duoI
|/oucr-rigbt), duong choo fraI-fron |uppcr-/cjt), va duong choo phaI fron |uppcr-
rigbt).

Truoc fIon, chung fa hay xom xof duong choo fraI-fron o hnh 6.11c. Nou
chung fa baf dau fu o [row][col], cac o fhuoc duong choo fraI-fron co foa do
[row-i][col-i] voI i Ia so nguyon duong. uong choo fraI-fron nay phaI kof
fhuc khI gap canh fron cua ban co (row-i==0) hoac canh fraI cua ban co (col-
i==0). Chung fa co fho dung vong Iap fang i fu 1 cho don khI row-i<0 hoac
col-i<0.

Chung fa co fho Iam fuong fu cho ba duong choo con IaI. Tuy nhIon, khI kIom
fra mof o co bj nhn fhay boI cac con hau hay khong fh chung fa khong can kIom
fra haI duong choo duoI cua o nay v fhoo gIaI fhuaf cac hang duoI van chua co
hau.
bool Queens::unguarded(int col) const
/*
post: fra vo true nou o fhuoc hang count (hang dang duoc xu Iy ko fIop) va cof col khong bj
nhn fhay boI mof con hau nao khac; nguoc IaI fra vo false.
*/


{
int i;
bool ok = true; // so duoc gan IaI false nou chung fa fm fhay hau fron cung cof hoac
duong choo.
for (i = 0; ok && i < count; i++)
ok = !queen_square[i][col]; // kIom fra phan fron cua cof.
for (i = 1; ok && count - i >= 0 && col - i >= 0; i++)
ok = !queen_square[count - i][col - i]; // kIom fra phan fron bon fraI cua
duong choo.
for (i = 1; ok && count - i >= 0 && col + i < board_size; i++)
ok = !queen_square[count - i][col + i]; // kIom fra phan fron bon phaI cua
duong choo.
return ok;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 120
6.3.6. Xem xet lu vu tnh che
Chuong frnh ma chung fa vua hoan faf dap ung hoan foan cho baI foan fam
con hau. Kof qua chay chuong frnh cho chung fa 92 IoI gIaI khac nhau. Tuy
nhIon, voI ban co co kch fhuoc Ion hon, fhoI gIan can do chay chuong frnh raf
Ion. ang sau day cho chung fa mof vaI v du:

Kch fhuoc 8 9 10 11 12 13
So IoI gIaI 92 352 724 2680 14200 73712
ThoI gIan |scconJ) 0.05 0.21 1.17 6.62 39.11 243.05
ThoI gIan cho mof IoI gIaI
|ms.)
0.54 0.6 1.62 2.47 2.75 3.30

Nhu chung fa fhay, so Iuong IoI gIaI fang raf nhanh fhoo kch fhuoc cua ban
co, va fhoI gIan fang con nhanh hon raf nhIou, do fhoI gIan cho mof IoI gIaI cung
fang fhoo kch fhuoc ban co. Nou muon gIaI cho cac ban co kch fhuoc Ion, chung
fa can fm mof chuong frnh hIou qua hon.

Chung fa hay fm xom v sao chuong frnh cua chung fa chay qua Iau nhu vay.
Vec go de quy vu quuy lu ro rung lu chem nheu tho gun, nhung tho
gun nuy lu phun unh dung phuong phup co bun mu chung tu dung de
gu bu toun. o chnh Ia ban chaf cua gIaI fhuaf va no duoc Iy gIaI boI mof so
Iuong Ion IoI gIaI. Mof so vong Iap frong phuong fhuc unguarded cung doI hoI
mof Iuong fhoI gIan dang ko. Chung fa hay fhu xof xom co fho bo bof mof vaI
vong Iap duoc chang. Co cach nao do xof mof o co bj nhn fhay boI cac con hau
hay khong ma khong phaI xof hof cac o fron cung cof va haI duong choo bac
ngang7

Co mof cach do fhuc hIon dIou nay, do Ia cach fhay doI du IIou ma chung fa Iuu
gIu frong mang. Thay v Iuu fhong fIn cac o nao da co cac con hau, chung fa co
fho dung mang do nam gIu faf ca cuc o du b{ cuc con huu nhIn thuy. Tu do,
chung fa so do dang hon frong vIoc kIom fra xom mof o co bj cac con hau nhn
fhay hay khong. Mof su fhay doI nho co fho gIup ch cho vIoc quay IuI, boI v mof
o co fho co nhIou hon mof con hau nhn fhay. VoI moI o, chung fa co fho Iuu mot
so de dem so con huu nhIn thuy no . KhI mof con hau duoc fhom vao, chung
fa fang bIon dom nay fhom 1 cho faf ca cac o cung hang, cung cof va fron haI
duong choo cua no. Nguoc IaI, khI Iay dI mof con hau, cac bIon dom fuong ung nay
cung can gIam bof 1.

VIoc Iap frnh fhoo phuong an nay duoc danh IaI nhu baI fap. Chung fa nhan
xof fhom rang, fuy phuong an moI nay co chay nhanh hon chuong frnh dau fIon
nhung van con mof so vong Iap do cap nhaf IaI cac bIon dom vua nou. Suy nghI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 121
fhom mof chuf nua, chung fa so fhay rang chung fa co fho IoaI bo hoan foan cac
vong Iap nay.

Y fuong chnh o day Ia vIoc nhan ra rang moI hang, moI cof, moI duong choo
fron ban co dou chI co fho chua nhIou nha f Ia mof con hau. |Nguyon fac fo chIm
cau cho fhay rang, frong mof IoI gIaI, moI hang va moI cof dou co con hau, nhung
khong phaI moI duong choo dou co con hau, do so duong choo nhIou hon so hang
va so cof.)

Tu do, chung fa co fho nam gIu cuc o chuu b{ cuc con huu nhIn thuy bang
cach su dung 3 mang co cac phan fu kIou bool: col_free, upward_free, va
downward_free, frong do cac duong choo fu duoI Ion va fraI sang phaI duoc goI
Ia upuarJ, cac duong choo fu fron xuong va fraI sang phaI duoc goI Ia JounuarJ
|hnh 6.11d va o). o chung fa daf cac con hau Ion ban co moI Ian faI mof hang,
baf dau fu hang 0, chung fa khong can mof mang do bIof duoc hang nao con
frong.

CuoI cung, do In mof cau hnh, chung fa can bet so thu tu cuu cot co chuu
con huu trong mo hung, chung fa so dung mof mang cac so nguyon, moI phan
fu danh cho mof hang va chua so cua cof chua con hau frong hang do.

Cho don bay gIo, chung fa da co fho gIaI quyof fron von baI foan ma khong
can don mang haI chIou bIou dIon ban co nhu phuong an dau fIon nua, va chung
fa cung da co fho IoaI moI vong Iap fru cac vong Iap khoI fao cac frj ban dau cho
cac mang. Nho vay, fhoI gIan can fhIof do chay chuong frnh moI nay phan anh
mof cach chaf cho so buoc can khao saf frong phuong phap quay IuI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 122

Chung fa so danh so cho cac o frong mof duong choo nhu fho nao7 ChI so cua
duong choo upuarJ daI nhaf frong mang haI chIou nhu sau:

[board_size-1][0],[board_size-2][1], ...,[0][board_size-1]

ac fnh chung cua cac chI so nay Ia fong cua hang va cof Iuon Ia
|board_size1). Iou nay goI y rang, nhu hnh 6.11o, baf ky mof duong choo
upuarJ nao cung co fong cua hang va cof cua moI o dou Ia mof hangso. Tong nay
baf dau fu 0 cho duong choo upuarJ co chIou daI Ia 1 faI goc fraI fron cung cua
mang, cho don(2xboard_size2) cho duong choo upuarJ co chIou daI Ia 1 faI
goc phaI duoI cung cua mang. o do chung fa co fho danh so cho cac duong choo
upuarJ fu 0 don (2xboard_size2), va nhu vay, o o hang i va cof j so fhuoc
duong choo upuarJ co so fhu fu Ia i+j.



HInh 6.11 Cac chI so cua cac o frong ban co
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 123
ang cach fuong fu, nhu hnh 6.11d, cac duong choo JounuarJ co hIou gIua
hang va cof Ia mof hang so, fu (board_size+1) en (board_size1). Cac
duong choo JounuarJ so duoc danh so fu 0 don (2xboard_size1), mof o faI
hang i va cof j fhuoc duong choo JounuarJ co so fhu fu (ij+board_size1).

Sau khI da co cac chon Iua fron chung fa co djnh nghIa moI cho Iop Queens
nhu sau:

class Queens {
public:
Queens(int size);
bool is_solved() const;
void print() const;
bool unguarded(int col) const;
void insert(int col);
void remove(int col);
int board_size;
private:
int count;
bool col_free[max_board];
bool upward_free[2 * max_board - 1];
bool downward_free[2 * max_board - 1];
int queen_in_row[max_board]; // so fhu fu cua cof chua hau frong moI hang.
};

Chung fa so hoan faf chuong frnh qua vIoc hIon fhuc cac phuong fhuc cho Iop
moI. au fIon Ia constructor khoI gan faf ca cac frj can fhIof cho cac mang.

Queens::Queens(int size)
/*
post: The Queens object is set up as an empty
configuration on a chessboard with size squares in each row and column.
*/
{
board_size = size;
count = 0;
for (int i = 0; i < board_size; i++) col_free[i] = true;
for (int j = 0; j < (2*board_size -1); j++) upward_free[j] = true;
for (int k = 0; k < (2*board_size -1); k++) downward_free[k] = true;
}

Phuong fhuc insert chI can cap nhaf cof va haI duong choo dI ngang qua o
faI [count][col] Ia da bj nhn fhay boI con hau moI fhom vao, cac frj nay cung
co fho Ia false san fruoc do do chung da bj cac con hau fruoc do nhn fhay.

void Queens::insert(int col)
/*
Pre: The square in the first unoccupied row (row count) and column col
is not guarded by any queen.
Post: A queen has been inserted into the square at row count and column
col; count has been incremented by 1.
*/
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 124
{
queen_in_row[count] = col;
col_free[col] = false;
upward_free[count + col] = false;
downward_free[count - col + board_size - 1] = false;
count++;
}

CuoI cung phuong fhuc unguarded chI can kIom fra cof va haI duong choo dI
ngang qua o faI [count][col] co bj cac con hau nhn fhay hay chua.

bool Queens::unguarded(int col) const
/*
Post: Returns true or false according as the square in the first
unoccupied row (row count) and column col is not guarded by any queen.
*/
{
return col_free[col]
&& upward_free[count + col]
&& downward_free[count - col + board_size - 1];
}

Chung fa fhay rang phuong fhuc fron don gIan hon frong phuong an dau fIon cu a
no raf nhIou. Cac phuong fhuc con IaI Is_soIvod, romovo, va prInf xom nhu baI
fap. ang sau day cho cac con so nhan duoc fu chuong frnh cuoI cung nay.

Kch fhuoc 8 9 10 11 12 13
So IoI gIaI 92 352 724 2680 14200 73712
ThoI gIan |soconds) 0.01 0.05 0.22 1.06 5.94 34.44
ThoI gIan cho mof IoI gIaI
|ms.)
0.11 0.14 0.30 0.39 0.42 0.47

VoI fruong hop fam con hau, chuong frnh moI chay nhanh gap 5 Ian chuong
frnh cu. KhI kch fhuoc ban co fang Ion fI Io nay con cao hon nua, nhu fruong
hop 13 con hau, chuong frnh moI chay nhanh gap 7 Ian chuong frnh cu.

6.3.7. Phun tIch ve phuong phup quuy lu
Chung fa so fong kof phan nay qua vIoc phong doan fong so cac cong vIoc ma
chuong frnh cua chung fa phaI Iam.
6.3.7.1. TInh heu quu cuu phuong phup quuy lu
Chung fa baf dau bang vIoc fnh xom vIoc quay IuI da nho duoc bao nhIou cong
vIoc so voI faf ca cac cong vIoc co fho co. Xof fruong hop ban co 8x8, nou chung fa
fIop can baI foan mof cach don gIan ba ng cach vIof mof chuong frnh fm faf ca
cac phuong an do xop sao cho du fam con hau Ion ban co roI sau do moI IoaI cac
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 125
fruong hop khong hop Io, voI moI cau hnh Ia mof su Iua chon 8 vj fr frong 64 vj
fr, chung fa co so cau hnh can khao saf Ion don:

64
8 = 4,426,165,368.

Nou chung fa nhn fhay duoc rang moI hang chI co fho co mof con hau fh so
cau hnh can fhu gIam ngay xuong:

8
8
= 16,777,216.

Con so nay van con raf Ion. Chung fa fIop fuc cho rang moI cof chI co fho co
mof con hau, so Iua chon cac cof con fu do fron moI hang so Ia 8, 7, ..., 1. Tong so
Iua chon fron 8 hang hoan foan co fho duoc xu Iy boI may fnh:

8! = 40,320.

va so fruong hop ma chuong frnh cua chung fa phaI xom xof con nho hon, do
nhung o o hang dang xof ma fhuoc cung duong choo voI cac con hau o nhung
hang fron fh da bj bo qua ngay Iap fuc.

Cach hoaf dong cua qua frnh quay IuI cho fhay fnh hIou qua cua no nhu sau:
cac vj fr da duoc cho rang khong chap nhan duoc so ngan can su khao saf fIop
cac duong dI vo ch sau do.

Mof cach khac do bIou dIon hanh vI cua vIoc quay IuI Ia vIoc xom xof cay do
quy cua ham do quy soIvo_from, hnh 6.12 fho hIon mof phan cua cay nay. HaI IoI
gIaI co frong hnh fuong ung voI haI IoI gIaI frong hnh 6.9. MoI nuf frong cay co
fho co foI da Ia fam nuf con fuong ung fam Ian goI do quy ham solve_from voI

HInh 6.12 Mof phan cua cay do quy cho baI foan fam con hau
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 126
fam frj hop Io cua new_col. Tuy nhIon, ngay ca faI cac muc gan voI nuf goc,
phan Ion cac nhanh nay dou duoc xac djnh som Ia khong fhoa, va hIon nhIon
rang cu moI nuf cha khong fhoa dIou kIon cua baI foan fh frong cay cung khong
xuaf hIon fIop cac nuf con cua no. Phuong phap quay IuI Ia mof cong cu vo cung
hIou qua do fhu gIam mof cay do quy vo mof kch fhuoc co fho xu Iy duoc.
6.3.7.2. Cuc cun duo
VoI baI foan n con hau, fong so cong vIoc can duoc fhuc hIoc boI phuong phap
quay IuI fang raf nhanh fhoo n. Chung fa fhu hnh dung foc do fang fruong nay
nhanh don co nao. KhI daf mof con hau vao mof hang fron ban co, no so IoaI fru
nhIou nhaf Ia ba vj fr o hang duoI |mof vj fr cung cof va haI vj fr choo). oI voI
hang fhu nhaf, vIoc quay IuI so khao saf faf ca n vj fr. O hang fhu haI, co f nhaf
n-3 vj fr can khao saf; hang fhu ba Ia n-6, va cu fho. V vay, do daf cac con hau
Ion n/4 hang dau fIon, vIoc quay IuI can khao saf f nhaf so vj fr:

n|n-3)|n-6)...|n-3n/4)

Tch nay > |n/4)
n/4
do co faf ca n/4 fhua so va fhua so cuoI cung Ia n/4, cac fhua so
khac dou Ion hon n/4. o hnh dung con so nay fang nhanh fhoo n nhu fho nao,
chung fa nho IaI rang baI foan fhap Ha NoI can co 2
n
buoc cho n dIa, ma |n/4)
n/4

con fang nhanh hon 2
n
nhIou khI n fang. o fhay duoc dIou nay, chung fa co:

Iog ||n/4)
n/4
) Iog |n/4)
=
Iog |2
n
) 4 Iog |2)

TI Io nay fang khong gIoI han khI n fang. Chung fa noI 2
n
fang fhoo ham mu, con
|n/4)
n/4
con fang nhanh hon raf nhIou. Vay voI n Ion, chuong frnh ap dung
phuong phap quay IuI cho baI foan fhap Ha NoI fron cung so chay raf cham.
6.3.7.3. So lo gu
Chung fa van chua chung mInh rang vIoc In moI IoI gIaI cho baI foan n con
hau voI n Ion Ia khong fho fhuc hIon duoc bang may fnh, ma chI moI chI ra rang
phuong phap quay IuI Ia khong fho Iam duoc. Co fho con mof so gIaI fhuaf fhong
mInh hon nao do co fho In cac IoI gIaI mof cach nhanh chong hon gIaI fhuaf quay
IuI. Tuy nhIon, dIou chung fa quan fam o day khong phaI Ia kha nang cua may
fnh ma Ia so IoI gIaI fhuc su cua baI foan n con hau. Iou da co fho chung mInh
duoc Ia so IoI gIaI cua baI foan nay khong fho duoc gIoI han boI baf ky mof da
fhuc bac n nao. Tham ch so IoI gIaI nay duong nhu con khong fho bj gIoI han boI
mof bIou fhuc ham mu k
n
, voI k Ia mof hang so, nhung vIoc chung mInh dIou nay
van con Ia mof baI foan chua co IoI gIaI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 127
6.4. Cuc chuong trInh co cuu truc cuy: du doun truoc trong cuc
tro cho
Trong cac fro choI fr fuo, con nguoI co fho du doan fruoc mof so buoc. Trong
phan nay chung fa phaf frIon mof gIaI fhuaf cho may fnh do fham gIa cac fro
choI co khao saf fruoc mof so buoc dI. Chung fa so frnh bay gIaI fhuaf qua hnh
anh cua mof cay va su dung do quy do Iap frnh cho cau fruc nay.

6.4.1. Cuc cuy tro cho
Chung fa co fho vo ra cac buoc dI chuyon co fho co qua hnh anh cua mof cay
fro choI, frong do goc cay Ia frang fhaI ban dau, cac canh xuaf phaf fu goc Ia cac
buoc dI hop Io cua nguoI choI fhu nhaf. O muc ko fIop, cac canh IaI bIou dIon cac
buoc dI hop Io cua nguoI choI fhu haI fuong ung voI moI cach dI cua nguoI fhu
nhaf, va cu nhu fho. Nou cho rang muc cua goc Ia 0 fh cac canh xuaf phaf fu cac
nuf co muc chan bIou dIon buoc dI cua nguoI fhu nhaf, cac canh xuaf phaf fu cac
nuf co muc Io bIou dIon buoc dI cua nguoI fhu haI.
Hnh 6.13 Ia cay fro choI day du cua fro choI So fam. Trong fro choI nay,
nguoI choI fhu nhaf so Iua chon mof frong cac so 1, 2, hoac 3. MoI buoc sau do,
moI nguoI choI so duoc quyon chon mof frong ba so 1, 2, hoac 3, nhung khong
duoc frung voI so ma nguoI kIa vua chon xong. Cac canh frong cay mang con so
do nguoI choI chon. Tong cac so duoc chon so duoc cong fch Iuy dan. Nou don Iuof
mnh, nguoI choI chon duoc con so Iam cho fong nay dung bang fam fh so Ia
nguoI fhang cuoc; nou fong vuof qua fam fh nguoI con IaI so fhang. Tro choI nay

HInh 6.13 Cay cho fro choI so fam
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 128
khong co kha nang hoa. Trong so do, I co nghIa Ia nguoI fhu nhaf fhang cuoc, va
S Ia nguoI fhu haI fhang cuoc.

Ngay mof fro choI fam fhuong nhu fro choI So fam fron day cung da sInh ra
mof cay co kch fhuoc khong nho. Cac fro choI fhuc su hap dan fua nhu co vua
con co cay fro choI Ion hon raf nhIou, va chung fa cung khong hy vong g vao vIoc
co fho khao saf hof cac canh cua no. Nhu vay, mof chuong frnh chay frong mof
fhoI gIan cho phop chI co fho khao saf mof vaI muc duoI mof nuf hIon faI cua cay.
Con nguoI khI choI nhung fro choI nay cung khong fho nhn fhay duoc moI kha
nang phaf frIon cay cho don khI fro choI kof fhuc, nhung ho co fho co mof so Iua
chon fhong mInh, boI v, fhoo kInh nghIom, fhong fhuong mof nguoI co fho nhan
bIof ngay mof vaI fnh huong nay Ia fof hon so voI cac fnh huong khac, mac du
ho cung khong bao dam duoc Ia so fhang.

oI voI moI fro choI hap dan ma chung fa muon choI bang may fnh, chung fa
can mof ham goI Ia ham Iuong gIa do kIom fra mof fnh huong hIon faI vo muc do
fhuan IoI cua no.

6.4.2. Phuong phup Mnmux
Hnh 6.14 Ia mof cay con bIou dIon mof phan cua mof cay fro choI voI muc
dch mInh hoa cho baf ky fro choI nao. Coc cay con nay bIou dIon vj fr hIon faI
ma chung fa dang muon nhn fruoc cac buoc dI. Chung fa chI can ham Iuong gIa
faI cac nuf Ia cua cay con nay |do Ia nhung vj fr ma chung fa so khong nhn foI
fruoc xa hon nua), va fu cac fhong fIn nay, chung fa phaI chon ra mof cach dI cho
vj fr hIon faI. Cac nuf Ia frong cay duoc vo bang hnh vuong do phan bIof voI cac
nuf khac. Hnh 6.14 chua cac frj cho cac nuf Ia.


Hnh 6.14 Cay tro chi vi cac tr c gan cac nut la
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 129
uoc dI ma chung fa chon so Ia mof frong cac canh xuaf phaf fu goc cay.
Chung fa dung ham Iuong gIa fhoo cach nhn cua nguoI choI so fhuc hIon buoc dI
nay. CIa su goI do Ia nguoI fhu nhaf, nguoI nay so chon con so Ion nhaf co fho.
TaI buoc ko, nguoI choI fhu haI IaI chon con so nho nhaf co fho, va cu fho fIop
fuc. o ham Iuong gIa duoc fnh fhoo cac fIou ch danh cho nguoI fhu nhaf, non
gIa frj nho nhaf cua no fuong ung fnh huong xau nhaf cua nguoI fhu nhaf. CIa
frj nay Iuon duoc nguoI fhu haI chon v fhoo khuynh huong fnh huong xau nhaf
doI voI nguoI fhu nhaf chnh Ia fnh huong fof nhaf cua nguoI fhu haI.ang cach
dI nguoc fu cac nuf Ia Ion, chung fa co fho gan cac frj cho moI nuf frong cay.
Chung fa hay fhuc hIon vIoc nay cho mof phan cua cay frong hnh 6.14, baf dau
fu canh bon fraI nhaf cua cay. Nuf dau fIon chua co nhan Ia nuf fron nam ngay
fron nuf hnh vuong mang so 10. o khong co su Iua chon nao khac fu nuf nay
non no cung co so 10. Nuf cha cua no co haI nuf con mang so 5 va 10. Nuf cha
nay fhuoc muc fhu ba frong cay non bIou dIon buoc dI cua nguoI fhu nhaf, do Ia
nguoI uu fIon chon so Ion. Vay nguoI nay da chon 10 non nuf cha nay cung so
mang frj 10.
Chung fa fIop fuc chuyon Ion muc fron. O day nuf cha co ba nuf con, con fhu
nhaf fu fraI sang Ia 10, con fhu haI Ia 7, con fhu ba Ia so Ion duoc chon ra fu 3 va
8 non Ia 8. ay Ia muc choI cua nguo I fhu haI, do do frj nho nhaf frong ba frj
fron duoc chon, do Ia 7. Cu nhu fho, nou fIop fuc chung fa so co duoc cay o hnh
6.15. Trj cua vj fr hIon faI nay Ia 7, va nguoI choI hIon faI, Ia nguoI choI fhu
nhaf fhoo hnh vo, so chon canh bon fraI nhaf cua vj fr hIon faI nay.

Trong vIoc danh gIa cay fro choI nay, chung fa da Iuan phIon chon so nho
nhaf |minima) va so Ion nhaf |maxima). o do qua frnh nay con goI Ia phuong
phap minimax.

HInh 6.15 Iuong gIa fhoo phuong phap MInImax cho cay fro choI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 130
6.4.3. Phut tren gu thuut
Chung fa so xom xof bang cach nao ma phuong phap minimax co fho duoc
Iong frong mof gIaI fhuaf hnh fhuc do du doan fruoc frong cac chuong frnh fro
choI. Chung fa so vIof mof gIaI fhuaf fong quaf do co fho su dung frong baf ky
mof fro choI nao co haI nguoI choI.

Chuong frnh so can fruy xuaf don fhong fIn vo mof fro choI cu fho nao do ma
chung fa muon choI. Chung fa gIa su rang fhong fIn nay duoc fap hop frong hIon
fhuc cua haI Iop goI Ia Move va Board. Mof doI fuong cua Iop Move bIou dIon mot
buoc d cuu tro cho, va mof doI fuong cua Iop Board bIou dIon mot tInh
huong cuu tro cho. Sau nay chung fa so hIon fhuc cac phIon ban cua haI Iop
fron day cho fro choI Tic-Tac-Toc.

oI voI Iop Move, chung fa chI can phuong fhuc constructor. mof constructor do
fao doI fuong Move fhoo y cua nguoI choI, va mof constructor khac do fao mof doI
fuong Move rong. Chung fa cung gIa su rang cac doI fuong cua Iop Move va Iop
Board dou co fho duoc goI bang fham frj cho ham cung nhu co fho duoc su dung
phop gan mof cach an foan, do do chung fa can vIof day du foan fu gan djnh
nghIa IaI |oocr/oaJcJ assignmcnt opcrator) va copy constructor cho ca haI Iop.

oI voI Iop Board, cac phuong fhuc can co Ia: khoI fao doI fuong, kIom fra fro
choI da kof fhuc hay chua, fIon hanh mof buoc dI nhan duoc qua fham frj, danh
gIa mof fnh huong, va cung cap mof danh sach cac nuoc dI hop Io hIon faI.

Phuong fhuc legal_moves, fra vo cac nuoc dI hop Io hIon faI, so can mof
danh sach cac fhong so do fnh foan cac kof qua. Chung fa can mof su Iua chon
gIua cac hIon fhuc cua cau fruc du IIou IIsf do chua cac cach dI nay. Trong vIoc
nhn foI fruoc, fhu fu gIua cac cach dI ma chung fa so khao saf Ia khong quan
frong, do do chung co fho duoc Iuu frong baf ky dang nao cua IIsf. o don gIan
cho vIoc Iap frnh, chung fa so su dung ngan xop. Phan fu cua ngan xop so Ia cac
doI fuong Move. Chung fa can djnh nghIa:

typedef Move Stack_entry;

Chung fa can fhom haI phuong fhuc do ho fro frong vIoc Iua chon nuoc dI fof
nhaf frong so cac nuoc dI hop Io. Phuong fhuc dau fIon, goI Ia better, su dung
haI fhong so Ia haI so nguyon va fra vo mof kof qua khac 0 nou nguoI choI chon
nuoc dI fhoo fhong so fhu nhaf, hoac bang 0 nou nguoI choI chon nuoc dI fhoo
fhong so fhu haI. Phuong fhuc fhu haI, goI Ia worst_case, fra vo mof hang so
duoc xac djnh fruoc co frj fhap hon faf ca cac frj ma ham Iuong gIa fnh duoc
frong qua frnh nhn fruoc.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 131
Chung fa co djnh nghIa cua Iop Board nhu sau:
class Board {
public:
Board();//constructor khoI fao frang fhaI ban dau fhch hop doI voI moI fro choI.
int done() const; // kIom fra xom fro choI da kof fhuc hay chua.
void play(Move try_it);
int evaluate() const;
int legal_moves(Stack &moves) const;
int worst_case() const;
int better(int value, int old_value) const; // chon nuoc dI fof nhaf.
void print() const;
void instructions() const;
/* Cac phuong fhuc, ham va du IIou bo sung fuy fung fro choI cu fho */
};
oI fuong Board can Iuu mof fnh huong cua fro choI va nguoI ma sap fhuc
hIon buoc dI.

Truoc khI vIof ham nhn fruoc do danh gIa cay fro choI, chung fa can chon ra
so buoc ma gIaI fhuaf nhn fruoc so phaI khao saf. oI voI mof fro choI fuong doI
phuc fap, chung fa can djnh ra do sau |depth) so duoc nhn fruoc, cac muc bon
duoI nua so khong duoc xof don. Mof dIou kIon dung khac cua vIoc nhn fruoc
chnh Ia khI fro choI kof fhuc, do Ia Iuc ma phuong fhuc done cua Board fra vo
true. NhIom vu chnh cua vIoc nhn fruoc frong cay co fho duoc mo fa boI gIaI
fhuaf do quy sau day:
6.4.4. Tnh che
Chuong frnh cu fho cua gIaI fhuaf fron nhu sau:
int look_ahead(const Board &game, int depth, Move &recommended)
/*
pre: doI fuong Board bIou dIon mof fnh huong hop Io cua fro choI.
post: cac nuoc dI cua fro choI duoc nhn fruoc voI do sau Ia depth, nuoc dI fof nhaf duoc chI ra
frong fham bIon recommended.
uses: cac Iop Stack, Board, va Move, cung voI ham look_ahead mof cach do quy.
*/
Algorithm look_ahead |fhong so Ia mof doI fuong Board);
1. if do quy dung |do sau depth == 0 hoac game.done())
1. return frj Iuong gIa cua fnh huong
2. else
1. for moI nuoc dI Move hop Io
1. fao mof doI fuong Board moI bang cach fhuc hIon nuoc dI Move.
2. goI do quy look_ahead fuong ung voI su Iua chon fof nhaf cua
nguoI choI ko fIop;
2. Chon cach dI fof nhaf cho nguoI choI frong so cac cach dI fm duoc
frong vong Iap fron;
3. return doI fuong Move fuong ung va frj;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 132
{
if (game.done() || depth == 0)
return game.evaluate();
else {
Stack moves;
game.legal_moves(moves);
int value, best_value = game.worst_case();

while (!moves.empty()) {
Move try_it, reply;
moves.top(try_it);
Board new_game = game;
new_game.play(try_it);
value = look_ahead(new_game, depth - 1, reply);
if (game.better(value, best_value)) { // nuoc dI fhu try_it vua roI hIon
Ia fof nhaf.
best_value = value;
recommended = try_it;
}
moves.pop();
}
return best_value;
}
}

Tham bIon recommended so nhan vo mof nuoc dI duoc fIon cu |fru khI do quy
roI vao dIom dung, do Ia khI fro choI kof fhuc hoac do sau cua vIoc nhn fruoc
depth bang 0). o chung fa khong muon doI fuong game bj fhay doI frong ham, dong fhoI do
franh vIoc chop IaI maf fhoI gIan, no duoc goI cho ham bang fham chIou hang. Chung fa cung Iuu
y rang vIoc khaI bao fham chIou hang nay chI hop Io khI doI fuong game frong ham chI fhuc hIon
cac phuong fhuc da duoc khaI bao const frong djnh nghIa cua Iop Board.
6.4.5. Tc-Tuc-Toe
Nhu fron da noI, ham do quy look_ahead cung haI Iop Board va Move fron
day fuy raf don gIan, nhung no IaI Ia cof IoI frong cac chuong frnh bIou dIon fro
choI co haI doI fhu. Chung fa so frIon khaI phac fhao nay frong fro choI tic-tac-toc
raf quon fhuoc. o Iam duoc dIou nay, ca haI Iop so chua fhom mof f du IIou khac
so voI hIon fhuc hnh fhuc ban dau.

VIoc vIof chuong frnh chnh hoan faf cung ham look_ahead cho fro choI tic-
tac-toc duoc danh IaI nhu baI fap. Chuong frnh co fho chua fhom nhIou chuc
nang nhu cho phop nguoI choI voI may, dua ra cac phan fch day du cho moI fnh
huong, cung cap chuc nang cho haI nguoI choI voI nhau, danh gIa cac buoc dI cua
haI doI fhu,...

Chung fa bIou dIon IuoI fro choI tic-tac-toc bang mof mang 3x3 cac so nguyon,
o co frj 0 Ia o frong, frj 1 va 2 bIou dIon nuoc dI cua nguoI fhu nhaf va fhu haI
fuong ung.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 133
Trong doI fuong Move, chung fa chua foa do cac o fron IuoI. Mof nuoc dI hop Io
chua foa do co cac frj fu 0 don 2. Chung fa khong can don fnh dong kn cua doI
fuong Move v no chI nhu mof vaf chua do chua cac gIa frj.

// Iop move cho fro choI tic-tac-toe
class Move {
public:
Move();
Move(int r, int c);
int row;
int col;
};

Move::Move()
/*
post: doI fuong Move duoc khoI fao boI frj mac djnh khong hop Io.
*/
{
row = 3;
col = 3;
}

Move::Move(int r, int c)
/*
post: doI fuong Move duoc khoI fao boI foa do cho fruoc.
*/
{
row = r;
col = c;
}

Iop Board can mof constructor do khoI fao fro choI, phuong fhuc print va
instruction |In cac fhong fIn cho nguoI choI), phuong fhuc done, play va
legal_moves |hIon fhuc cac quy fac choI), va cac phuong fhuc evaluate,
better, va worst_case |phan doan dIom cho cac nuoc dI khac nhau). Chung fa
con co fho bo sung ham phu fro the_winner cho bIof rang fro choI da co nguoI
fhang chua va nguoI fhang Ia aI.

Iop Board can chua fhong fIn vo frang fhaI hIon faI cua fro choI frong mang
3x3 va fong so buoc dI da fhuc hIon. Chung fa co Iop Board nhu sau:


class Board {
public:
Board();
bool done() const;
void print() const;
void instructions() const;
bool better(int value, int old_value) const;
void play(Move try_it);
int worst_case() const;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 134
int evaluate() const;
int legal_moves(Stack &moves) const;
private:
int squares[3][3];
int moves_done;
int the_winner() const;
};

Constructor don gIan chI Iam mof vIoc Ia khoI fao faf ca cac o cua mang Ia 0
do chI rang ca haI nguoI choI dou chua dI nuoc nao.

Board::Board()
/*
post: doI fuong Board duoc khoI fao rong fuong ung frang fhaI ban dau cua fro choI.
*/
{
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
squares[i][j] = 0;
moves_done = 0;
}

Chung fa danh cac phuong fhuc In cac fhong fIn cho nguoI choI nhu Ia baI fap.
Thay vao do, chung fa fap frung vao cac phuong fhuc IIon quan don cac quy fac
cua fro choI. o fhuc hIon mof nuoc dI, chung fa chI can gan IaI frj cho mof o va
fang bIon dom moves_done Ion 1. ua vao bIon dom nay chung fa con bIof duoc
don Iuof nguoI nao dI.

void Board::play(Move try_it)
/*
post: nuoc dI try_it duoc fhuc hIon
*/
{
squares[try_it.row][try_it.col] = moves_done % 2 + 1;
moves_done++;
}

Ham phu fro the_winner fra vo mof so khac khong nou da co nguoI fhang.

int Board::the_winner() const
/*
post: fra vo 0 nou chua aI fhang; 1 nou nguoI fhu nhaf fhang; 2 nou nguoI fhu haI fhang.
*/
{
int i;
for (i = 0; i < 3; i++)
if (squares[i][0] && squares[i][0] == squares[i][1]
&& squares[i][0] == squares[i][2])
return squares[i][0];

for (i = 0; i < 3; i++)
if (squares[0][i] && squares[0][i] == squares[1][i]
&& squares[0][i] == squares[2][i])
return squares[0][i];
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 135


if (squares[0][0] && squares[0][0] == squares[1][1]
&& squares[0][0] == squares[2][2])
return squares[0][0];

if (squares[0][2] && squares[0][2] == squares[1][1]
&& squares[2][0] == squares[0][2])
return squares[0][2];
return 0;
}

Tro chi ket thuc sau 9 nc i hoac khi co ngi thang. (Chng trnh cua chung ta khong
phat hien sm kha nang hoa trc khi ket thuc 9 nc i).

bool Board::done() const
/*
post: fra vo true nou fro choI da phan fhang baI hoac ca 9 o fron ban co da duoc danh dau,
nguoc IaI fra vo false.
*/
{
return moves_done == 9 || the_winner() > 0;
}

Trong fro choI don gIan nay, nuoc dI hop Io Ia nhung o mang frj 0.

int Board::legal_moves(Stack &moves) const
/*
post: Thong so moves chua cac nuoc dI hop Io.
*/
{
int count = 0;
while (!moves.empty()) moves.pop();
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (squares[i][j] == 0) {
Move can_play(i,j);
moves.push(can_play);
count++;
}
return count;
}

Chung fa chuyon sang cac phuong fhuc co fho cho nhung su danh gIa vo mof
fnh huong cua fro choI hoac cua mof nuoc dI co fho xay ra. Chung fa so baf dau
danh gIa mof fnh huong cua fro choI Ia 0 frong fruong hop chua co nguoI nao
fhang. Nou mof frong haI nguoI fhang, chung fa so danh gIa fnh huong dua vao
quy fac: cang fhang nhanh fh cang hay. Iou nay cung dong nghIa voI vIoc cang
fhua nhanh fh cang do. Nou moves_done Ia so nuoc dI ca haI nguoI choI da fhuc
hIon fh |10-moves_done) cang Ion khI so nuoc da dI cang nho, fuong ung su
danh gIa cao khI nguoI fhu nhaf som fhang. Nguoc IaI, nou nguoI fhu haI fhang
fh chung fa dung frj |moves_done-10), so nuoc dI cang nho fh frj nay Ia mof
so cang am, fuong ung vIoc fhua nhanh chong cua nguoI fhu nhaf Ia raf do.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 136
I nhIon rang, cach danh gIa nay chI duoc ap Ion dIom cuoI cua vIoc nhn
fruoc |o do sau mong muon hoac khI fro choI da phan fhang baI). Trong phan Ion
cac fnh huong, nou chung fa nhn fruoc cang xa fh ban chaf chua fInh cua cach
danh gIa so do gay hau qua xau hon.

int Board::evaluate() const
/*
post: fra vo 0 khI chua co nguoI fhang cuoc; hoac 1 so duong fu 1 don 9 frong fruong hop nguoI
fhu nhaf fhang, nguoc IaI Ia mof so am fu 1 don 9 frong fruong hop nguoI fhu haI
fhang.
*/
{
int winner = the_winner();
if (winner == 1) return 10 - moves_done;
else if (winner == 2) return moves_done - 10;
else return 0;
}

Phuong fhuc worst_case co fho chI don gIan fra vo mof frong haI frj 10 hoac
-10, do evaluate Iuon fra mof frj nam gIua -9 va 9. Tu do, phuong fhuc so sanh
better chI can so sanh mof cap so nguyon co frj nam gIua -10 va 10. Cac phuong
fhuc nay xom nhu baI fap.

CIo fh chung fa da phac fhao xong phan Ion chuong frnh fro choI tic-tac-toc.
Mof chuong frnh Iay do sau cho vIoc nhn fruoc Ia 9 so choI fof do chung fa Iuon
co fho nhn fruoc don mof fnh huong ma su danh gIa vo no Ia chnh xac. Mof
chuong frnh nhn fruoc voI mof do sau khong Ion co fho mac phaI saI Iam, do no
co fho kof fhuc vIoc nhn fruoc boI fap cac fnh huong co frj danh gIa bang 0 mof
cach nham Ian.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 137
Chng 7 TM KKM

Chuong nay gIoI fhIou baI foan fm kIom mof phan fu frong mof danh sach.
Phan frnh bay fap frung chu you vao haI gIaI fhuaf: fm kIom fuan fu va fm
kIom nhj phan.
7.1. Go theu
7.1.1. Khou
Trong baI foan fm kIom, dua vao mof phan fhong fIn duoc goI Ia khoa |key),
chung fa phaI fm mof mau fIn |record) chua cac fhong fIn khac IIon quan voI
khoa nay. Co fho co nhIou mau fIn hoac khong co mau fIn nao chua khoa can fm.


HInh ?.1. Mau fIn va khoa.
7.1.2. Phun tIch
Tm kIom fhong fhuong Ia fac vu fon nhIou fhoI gIan frong mof chuong frnh.
V fho vIoc fo chuc cau fruc du IIou va gIaI fhuaf cho vIoc fm kIom co fho co
nhung anh huong Ion don hIou suaf hoaf dong cua chuong frnh. O day, fhong so
do chu you Ia so Ian so sanh khoa can fm voI cac mau fIn khac.
7.1.3. TIm kem no vu tIm kem ngou
aI foan fm kIom bao gom haI nhom: fm kIom noI va fm kIom ngoaI. Nou
Iuong du IIou Ion phaI Iuu fron fhIof bj Iuu fru ngoaI nhu dIa hay bang fu fh baI
foan duoc goI Ia fm kIom ngoaI. Nguoc IaI nou foan bo du IIou duoc Iuu fru fron
bo nho chnh fh duoc goI Ia fm kIom noI. O day fa quan fam chu you don fm
kIom noI.

CIaI fhuaf fm kIom fron cac cau fruc IIon kof hoan foan phu fhuoc vao cach fo
chuc dac frung cua chung. anh sach IIon kof don Ia cau fruc IIon kof don gIan
nhaf, vIoc fm kIom chI co fho duyof fuan fu qua fung phan fu ma fhoI. oI voI
cac cau fruc IIon kof khac, chung fa so co djp fm hIou cac chIon Iuoc fm kIom
khac nhau khI gap fung cau fruc cu fho, chang han nhu cay nhj phan fm kIom,
cay B-tree, hang uu fIon,. Co mof cau fruc du IIou kha dac bIof doI voI vIoc fm
kIom, do Ia bang bam. Y fuong co ban va dac bIof nhaf cua bang bam Iam cho no
Fmgndkg dgdag mfgldmgladg dflgflgkfldgkal;dkgakgladfkgldfg dlgkdflgkdlfgkdl fg


Agkdlgkdflhkggjklghjklhkjl gfhlkglkfh gfhltkhlkkglhkgl g;jlgh;jlgh;kl;l;;l;hylk;ghlkdhgfhgfhfghfghfghfghgh


Fghgfjghkhjkljljg gfhfgjgjghjghjhj gfjdgjgjgjgfjfgjgfjjlkdvl;kbflbn,f;hlfkh;gfhfh


Fhkfglfkklkhgf;hfhlf;hlgfhflhf dfgdgl;dflh;flh;lgf fhkfhlkglhkgkhlgfh f;ghlf;hlgfhh


Dfhlfkhlklfkshkshklsdfklgdkslg dfhlkfhlkkgfhkflkhlfkhkhksdfkhldkhldfkhl dgkeurtoejgmrgmlergmlemgle


Hsflhkldfhkldfhkldf dfglkdlgkdlfgkldfkgldfklgkdlgk
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 138
khac voI cac cau fruc du IIou khac o cho, frong bang bam khong co khaI nIom
duyof qua cac phan fu fruoc khI don duoc phan fu mong muon. Chung fa cung so
duoc hoc vo bang bam frong chuong 12.

Chuong nay chI frnh bay nhung y fuong co ban va don gIan nhaf cua vIoc fm
kIom. Trong do, gIa su rang khI can fruy xuaf mof phan fu baf ky nao do chung
fa co fho nhay ngay don vj fr cua no frong danh sach voI fhoI gIan Ia hang so.
Iou nay chI co fho daf duoc khI cuc phun tu duoc luu trong dunh such le n
tuc. Va nhu vay, frong chuong nay cac gIaI fhuaf fm kIom ro rang chI phu fhuoc
vao so Ian so sanh khoa, chu khong phu fhuoc vao fhoI gIan dI chuyon qua cac
phan fu.

Cach hIon fhuc cua cac phuong fhuc bo sung cung nhu cac gIaI fhuaf fm kIom
duoI day hoan foan su dung cac phuong fhuc co san cua Iop List frong chuong 4.
Chung fa non co mof so nhan xof nhu sau. Thu nhaf, cach su dung cac phuong
fhuc co san cua Iop List khong ngan cam chung fa vIoc su dung hIon fhuc danh
sach IIon kof fhay v danh sach IIon fuc. oI voI danh sach IIon kof can phaI chI
ph frong khI fruy xuaf phan fu faI vj fr position nao do |dIou nay van con
dIom khac nhau gIua haI phuong an cua danh sach IIon kof co hoac khong co Iuu
IaI fhuoc fnh current_position). oI voI danh sach IIon fuc, co fho fruc fIop
fruy xuaf mof phan fu fhong qua mof so nguyon chI vj fr cua no, fhay v goI
phuong fhuc co san retrieve.
7.1.4. Lop Record vu lop Key
Chung fa co mof so quy uoc nhu sau. Cac phan fu frong danh sach dang duoc
fm kIom fhoa cac fIou chuan foI fhIou sau:
MoI mau fIn co mof khoa dI kom.
Cac khoa co fho duoc so sanh voI nhau bang cac foan fu so sanh.
Mof mau fIn co fho duoc chuyon doI fu dong fhanh mof khoa. o do co fho
so sanh cac mau fIn voI nhau hoac so sanh mau fIn voI khoa fhong qua vIoc
vIoc chuyon doI mau fIn vo khoa IIon quan don no.

Chung fa so caI daf cac chuong frnh fm kIom Iam vIoc voI cac doI fuong
fhuoc Iop Record fhoa cac dIou kIon fron. NgoaI ra con co mof Iop Key |co fho
frung voI Record) va mof fac vu do chuyon doI mof Record fhanh mof Key. Tac
vu do co fho duoc caI daf fhoo mof frong haI cach sau:
Mof phuong fhuc cua Iop Record co khaI bao Ia operator Key() const;
Mof constructor cua Iop Key co khaI bao Ia Key(const Record&);

Nou Record va Key Ia gIong nhau fh khong can fac vu nay.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 139
Tron Iop Key chung fa can phaI djnh nghIa cac phop so sanh ==, !=, <, >,
<=, >= moI cap doI fuong fhuoc Iop Key. o moI Record dou co fho duoc chuyon
doI fhanh Key nho frnh bIon djch bang mof frong cac fac vu fron, cac fac vu so
sanh Key dou co fho duoc su dung do so sanh haI Record hay so sanh mof
Record voI mof Key.

// KhaI bao cho Iop Key
class Key{
public:
// Cac constructor va cac phuong fhuc.
private:
// Cac fhuoc fnh cua Key.
};

// KhaI bao cac fac vu so sanh cho khoa.
bool operator ==(const Key &x, const Key &y);
bool operator > (const Key &x, const Key &y);
bool operator < (const Key &x, const Key &y);
bool operator >=(const Key &x, const Key &y);
bool operator <=(const Key &x, const Key &y);
bool operator !=(const Key &x, const Key &y);

// KhaI bao cho Iop Record
class Record{
public:
operator Key(); // Chuyon doI fu Record sang Key.
// Cac constructor va cac phuong fhuc cua Record.
private:
// Cac fhuoc fnh cua Record
};

7.1.5. Thong so
Cac ham fm kIom so nhan haI fham frj. Tham frj fhu nhaf Ia danh sach can
fm, fham frj fhu haI Ia phan fu can fm. Thong so fhu haI duoc goI Ia dch cua
phop fm kIom. Trj fra vo cua ham co kIou Ia ErrorCode cho bIof vIoc fm kIom
co fhanh cong hay khong. Nou fm fhay fh fham bIon position chua vj fr fm
fhay phan fu IIon quan don khoa can fm frong danh sach.
7.2. TIm kem tuun tu
7.2.1. Gu thuut vu hum
Phuong phap don gIan nhaf do fm kIom Ia xuaf phaf fu mof dau cua danh
sach va fm doc fhoo danh sach cho don khI gap duoc phan fu can fm hay don
khI hof danh sach. ay Ia gIaI fhuaf duoc su dung frong ham sau.



Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 140

ErrorCode sequential_search(const List<Record> &the_list,
const Key &target, int &position)
/*
post: Nou co phan fu frong danh sach co khoa frung voI target, ham fra vo success va
fham bIon position chua vj fr cua phan fu duoc fm fhay frongf danh sach. Nguoc IaI
ham fra vo not_present va position khong co nghIa.
*/
{
int s = the_list.size();
for (position = 0; position < s; position++) {
Record data;
the_list.retrieve(position, data);
if (data == target) return success;
}
return not_present;
}

Vong Iap for frong ham nay duyof danh sach cho don khI gap phan fu can
fm hoac don khI hof danh sach. Nou gap phan fu can fm fh gIaI fhuaf kof fhuc
ngay Iap fuc va position chua vj fr phan fu fm duoc, nguoc IaI nou khong fm
fhay fh ham fra vo not_present va position chu vj fr khong hop Io.
7.2.2. Phun tIch
Sau day chung fa so danh gIa khoI Iuong cong vIoc ma gIaI fhuaf fm kIom
fuan fu fhuc hIon do Iam co so so sanh voI cac phuong phap khac sau nay.

CIa su gIaI fhuaf fm kIom fuan fu duoc fhuc fhI fron mof danh sach daI. Cac
Ionh ngoaI vong for duoc fhuc hIon mof Ian, do do khong anh huong nhIou don
fhoI gIan chay gIaI fhuaf. Trong moI Ian Iap, mof khoa cua mof mau fIn duoc so
sanh voI khoa dch. NgoaI ra con co mof so fac vu khac cung duoc fhuc hIon mof
Ian cho moI Ian Iap.

Nhu vay cac fac vu ma fa can quan fam co IIon ho fruc fIop voI so Ian so sanh
khoa. Nhung cach Iap frnh khac nhau cua cung mof gIaI fhuaf co fho cho ra cac
so Iuong cong vIoc khac nhau nhung dou cho cung mof so Ian so sanh. KhI chIou
daI cua danh sach fhay doI fh so Iuong cong vIoc cung fhay doI fhoo mof cach
fuong ung.

O day chung fa so fm hIou su phu fhuoc cua so Ian so sanh khoa vao do daI
cua danh sach. ay Ia fhong fIn huu ch nhaf frong vIoc fm hIou gIaI fhuaf fm
kIom nay, no khong phu fhuoc vao cach fhuc Iap frnh cu fho cung nhu IoaI may
fnh cu fho dang duoc su dung. VIoc phan fch cac gIaI fhuaf fm kIom duoc dua
fron gIa fhIof can ban Ia: khoI Iuong cong vIoc ma mof gIaI fhuaf fm kIom fhuc
hIon |hay fhoI gIan chay cua gIaI fhuaf) duoc phan anh boI fong so Ian so sanh
khoa ma gIaI fhuaf fhuc hIon.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 141
Chung fa hay fm so Ian so sanh khoa ma gIaI fhuaf fm kIom fuan fu can khI
no chay fron mof danh sach gom n phan fu. o gIaI fhuaf fm kIom fuan fu Ian
Iuof so sanh khoa dch voI fung khoa cua cac phan fu frong danh sach non fong
so Ian so sanh phu fhuoc vao vj fr cua dch frong danh sach. Nou dch Ia phan fu
dau fIon cua danh sach fh chI can mof Ian so sanh. Nou dch Ia phan fu cuoI
cung cua danh sach fh can n Ian so sanh. Nou phop fm kIom khong fhanh cong
|khong co phan fu dch frong danh sach) fh so Ian so sanh cung Ia n. Nhu vay,
frong fruong hop fof nhaf, gIaI fhuaf fm kIom fuan fu chI can mof Ian so sanh,
con frong fruong hop xau nhaf fh no can n Ian so sanh.

Trong phan Ion cac fruong hop, chung fa khong bIof chnh xac dac dIom cua
cac danh sach can fm kIom, do do chung fa fhuong khong ap dung duoc cac kof
qua vo fhoI gIan chay fof nhaf va xau nhaf fron kIa. Trong cac fruong hop
nay, chung fa fhuong su dung tho gun chuy trung bInh. O day trung bInh co
nghIa Ia chung fa xof moI kha nang mof Ian va Iay kof qua frung bnh cua chung.
Tuc Ia chung fa gIa su cac fruong hop can fm xay ra voI xac suaf nhu nhau. Iuu
y rang frong fhuc fo khong phaI Iuc nao gIa fhIof nay cung phu hop.

Chung fa co so Ian so sanh frung bnh cua gIaI fhuaf fm kIom fuan fu |fruong
hop fhanh cong) nhu sau.
( ) 1
2
1 ... 3 2 1
+ =
+ + + +
n
n
n

7.3. TIm kem nh{ phun

CIaI fhuaf fm kIom fuan fu co fho duoc caI daf do dang va kha hIou qua voI
nhung danh sach ngan nhung voI nhung danh sach daI fh gIaI fhuaf chay raf
cham. VoI cac danh sach daI, co nhIou phuong phap huu hIou hon do gIaI quyof
baI foan fm kIom, nhung voI dIou kIon Ia cac khoa cua danh sach da duoc sap
xop san.

Mof frong nhung phuong phap fof nhaf do fm kIom fron mot dunh such mu
cuc khou du duoc sup xep lu tIm kem nh{ phun. Trong phuong phap nay,
chung fa so sanh khoa dch voI khoa cua phan fu o gIua cua danh sach. Tuy fhuoc
vao khoa dch nam fruoc hay sau khoa o gIua ma chung fa fIop fuc qua frnh fm
kIom frong nua dau hay nua sau cua danh sach. VoI cach nay, faI moI buoc chung
fa gIam kch fhuoc cua danh sach can fm dI mof nua. Mof danh sach chua
khoang mof frIou phan fu so duoc xu Iy frong khoang haI muoI Ian so sanh.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 142
7.3.1. Ounh such co thu tu
Sau day chung fa djnh nghIa mof kIou du IIou fruu fuong cho mof danh sach co
fhu fu.

nh ngha: anh sach co fhu fu |ordered list) Ia danh sach frong do moI phan fu
co chua mof khoa sao cho cac khoa nay da duoc sap fhu fu. Tuc Ia nou
phan fu i dung fruoc phan fu j frong danh sach fh khoa cua i nho hon
hay bang khoa cua j.

o fm kIom nhj phan, danh sach can phaI co fhu fu. Chung fa caI daf danh
sach co fhu fu Ia mof Iop duoc fhua ko fu Iop List da co va vIof IaI cac phuong
fhuc insert va replace.

class Ordered_list:public List<Record>{
public:
Ordered_list();
ErrorCode insert(const Record &data);
ErrorCode replace(int position, const Record &data);
};

Phuong fhuc insert fron chon mof phan fu vao dung vj fr cua no frong danh
sach dua vao fhu fu cua cac khoa. Nou danh sach chua nhIou khoa frung voI khoa
cua phan fu dang fhom vao fh khoa moI so Ia phan fu dau fIon frong so cac phan
fu co khoa frung nhau.

ErrorCode Ordered_list::insert(const Record &data)
/*
post: Nou danh sach chua day, phan fu moI data duoc chon vao vj fr ngay sau phan fu Ion
nhaf frong so cac phan fu nho hon no, phuong fhuc fra vo success, nguoc IaI phuong fhuc
fra vo overflow.
*/
{
int s = size();
int position;
for (position = 0; position < s; position++) { // Tm vj fr fhch hop.
Record list_data;
retrieve(position, list_data);
if (data >= list_data) break;
}
return insert(position, data); // CoI phuong fhuc da co cua Iop List.
}

Phuong fhuc replace cung can kIom fra fnh hop Io cua phan fu duoc fhay
fho sao cho danh sach van dam bao fhu fu.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 143
7.3.2. Xuy dung gu thuut
o dam bao rang gIaI fhuaf duoc xay dung so cho ra kof qua dung dan, chung
fa can mo fa ro rang vo y nghIa cua cac bIon su dung frong chuong frnh va cac
dIou kIon can phaI fhoa fruoc va sau moI vong Iap, dong fhoI vong Iap cung phaI
duoc dam bao rang so dung dung.

CIaI fhuaf fm kIom nhj phan so su dung haI chI so, top va bottom, do gIoI
han phan danh sach ma chung fa dang fIon hanh fm kIom. TaI moI buoc, gIaI
fhuaf gIam kch fhuoc cua phan nay dI khoang mof nua. o fIon fhoo doI fIon
frnh cua gIaI fhuaf, chung fa can xac nhan mof dIou rang, fruoc moI Ian Iap co
mof dIou kIon Iuon dung: khoa dch, nou co frong danh sach, phaI Iuon nam frong
khoang fu boffom don fop, co ko ca haI vj fr nay. Iou kIon nay Iuc dau duoc bao
dam bang cach daf bottom bang 0 va top Ia the_list.size()1.

Truoc fIon , gIaI fhuaf fm vj fr phan fu o gIua bottom va top fhoo cong fhuc

(bottom + top)
mid =
2
Ko do gIaI fhuaf so sanh khoa dch voI khoa cua phan fu faI vj fr mid va fhay
doI top hoac bottom dua fhoo kof qua cua phop so sanh nay.

Chung fa Iuu y rang gIaI fhuaf non kof fhuc khI top bottom; fuc Ia khI
phan danh sach can fm con khong qua mof phan fu |gIa su rang gIaI fhuaf da
khong cham duf som hon fruoc do frong fruong hop khoa dch da duoc fm fhay).

CuoI cung, do chac chan rang gIaI fhuaf dung, so phan fu can fm cua danh
sach (top bottom + 1) phaI gIam sau moI Ian Iap cua gIaI fhuaf.

7.3.3. Phen bun thu nhut
Cach caI daf don gIan nhaf cua gIaI fhuaf Ia cu fIop fuc chIa doI danh sach,
baf ko khoa dch co duoc fm fhay hay chua, cho foI khI danh sach con IaI co
chIou daI Ia 1.
Ham sau day duoc vIof do quI.

Error_code recursive_binary_1(const Ordered_list &the_list, const Key
&target, int bottom, int top, int &position)
/*
pre: Cac chI so bottom va top chI ra day cac phan fu frong danh sach phuc vu cho vIoc fm
kIom target.
post: Nou phan fu co khoa frung voI target duoc fm fhay fh fra vo success, position chI
vj fr fm fhay. Nguoc IaI phuong fhuc fra vo not_present, position khong co nghIa.
uses: recursive_binary_1 va cac phuong fhuc cua Iop List va Record.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 144
*/
{
Record data;
if (bottom < top) { // List co nhIou hon 1 phan fu.
int mid = (bottom + top) / 2;
the_list.retrieve(mid, data);
if (data < target) // Can IoaI bo mof nua so phan fu bon phaI.
return recursive_binary_1(the_list, target, mid + 1, top, position);
else // Can IoaI bo mof nua so phan fu bon fraI.
return recursive_binary_1(the_list, target, bottom, mid, position);
}
else if (top < bottom)
return not_present; // List rong.
else { // List co chnh xac 1 phan fu.
position = bottom;
the_list.retrieve(bottom, data);
if (data == target) return success;
else return not_present;
}
}

Su phan chIa cua danh sach frong qua frnh fm kIom co fho duoc mInh hoa
nhu sau:

Iuu y rang frong so do nay phan dau fIon chI chua cac phan fu nho hon khoa
dch con phan cuoI co fho chua cac phan fu Ion hon hoac bang khoa dch. ang
cach nay, khI phan gIua cua danh sach chI con mof phan fu ma IaI Ia phan fu
chua khoa dch fh phan fu nay Iuon Ia phan fu dau fIon nou co nhIou phan fu co
khoa frung voI no frong danh sach.

Nou danh sach Ia rong fh ham fron fhaf baI, nguoc IaI no fnh gIa frj cua
md. V mid duoc fnh Ia frung bnh cua top va bottom non no nam gIua top va
bottom, va do do no Ia chI so hop Io cua mof phan fu cua danh sach.

Iou fhuc chIa nguyon Iuon Iam fron xuong, non chung fa co

bottom mid < top

Sau khI qua frnh do quI kof fhuc, gIaI fhuaf phaI kIom fra xom khoa dch da
duoc fm fhay hay chua v qua frnh do quI khong fhuc hIon phop kIom fra nay.

o chuyon ham fron vo dang ham fm kIom chuan ma chung fa djnh ra o fron
chung fa djnh nghIa ham sau:
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 145

Error_code run_recursive_binary_1(const Ordered_list &the_list,
const Key &target, int &position)
{
return recursive_binary_1(the_list, target, 0, the_list.size() - 1,
position);
}

V phop do quI duoc su dung frong ham fron Ia do quI duoI |tail recursion) non
co fho chuyon fhanh vong Iap mof cach do dang. ong fhoI chung fa co fho Iam
cho cac fhong so cua ham fro non fhong nhaf voI cac ham fm kIom khac.

ErrorCode binary_search_1 (const Ordered_list &the_list,
const Key &target, int &position)
/*
post: Nou phan fu co khoa frung voI fargof duoc fm fhay fh fra vo success, position chI vj fr
fm fhay. Nguoc IaI phuong fhuc fra vo not_present, position khong co nghIa.
uses: Cac phuong fhuc cua Iop List va Record.
*/
{
Record data;
int bottom = 0, top = the_list.size() - 1;

while (bottom < top) {
int mid = (bottom + top) / 2;
the_list.retrieve(mid, data);
if (data < target)
bottom = mid + 1;
else
top = mid;
}
if (top < bottom) return not_present;
else {
position = bottom;
the_list.retrieve(bottom, data);
if (data == target) return success;
else return not_present;
}
}

7.3.4. Nhun bet som phun tu co chuu khou dIch
Tuy binary_search_1 Ia mof dang don gIan cua gIaI fhuaf fm kIom nhj
phan, nhung no fhuc hIon fhua mof so Ian so sanh v no khong nhan ra fruong
hop phan fu khoa duoc fm fhay som hon. V fho chung fa co fho caI fIon gIaI
fhuaf nhu sau.

Error_code recursive_binary_2(const Ordered_list &the_list, const Key
&target,int bottom, int top, int &position)
/*
pre: Cac chI so bottom va top chI ra day cac phan fu frong danh sach phuc vu cho vIoc fm
kIom target.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 146
post: Nou phan fu co khoa frung voI target duoc fm fhay fh fra vo success, position chI
vj fr fm fhay. Nguoc IaI phuong fhuc fra vo not_present, position khong co nghIa.
uses: recursive_binary_2 va cac phuong fhuc cua Iop List va Record.
*/
{
Record data;
if (bottom <= top) {
int mid = (bottom + top) / 2;
the_list.retrieve(mid, data);
if (data == target) {
position = mid;
return success;
}

else if (data < target)
return recursive_binary_2(the_list, target, mid + 1, top, position);
else
return recursive_binary_2(the_list, target, bottom, mid - 1,
position);
}
else return not_present;
}

Error_code run_recursive_binary_2(const Ordered_list &the_list,
const Key &target, int &position)
{
return recursive_binary_2(the_list, target, 0, the_list.size() - 1,
position);
}

Chung fa co fho chuyon ham nay fhanh dang khong do quI nhu sau.

Error_code binary_search_2(const Ordered_list &the_list,
const Key &target, int &position)
/*
post: Nou phan fu co khoa frung voI target duoc fm fhay fh fra vo success, position chI
vj fr fm fhay. Nguoc IaI phuong fhuc fra vo not_present, position khong co nghIa.
uses: Cac phuong fhuc cua Iop List va Record.
*/
{
Record data;
int bottom = 0, top = the_list.size() - 1;
while (bottom <= top) {
position = (bottom + top) / 2;
the_list.retrieve(position, data);
if (data == target) return success;
if (data < target) bottom = position + 1;
else top = position - 1;
}
return not_present;
}

Cac hoaf dong nay co fho duoc mInh hoa nhu sau:
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 147

So do nay Ia doI xung fhoo nghIa phan fhu nhaf chI chua cac phan fu nho hon
khoa, phan fhu ba chI chua cac phan fu Ion hon khoa. KhI do, nou nhu khoa xuaf
hIon o nhIou vj fr frong danh sach fh gIaI fhuaf co fho fra vo baf ky vj fr nao
frong so do. ay cung Ia nhuoc dIom cua cach caI fIon do nhan ra som phan fu
can fm nay, v frong mof so ung dung, vj fr fuong doI gIua phan fu duoc fm
fhay so voI cac phan fu co khoa frung voI no raf quan frong.
7.4. Cuy so sunh
Cay so sanh |comparison tree) cua mof gIaI fhuaf fm kIom, con goI Ia cay
quyof djnh |decision tree) hay cay fm kIom |search tree), Ia mof cay co duoc bang
cach Ian fhoo vof cac hanh vI cua gIaI fhuaf. MoI nuf cua cay bIou dIon mof phop
so sanh. Ton cua nuf Ia chI so cua phan fu co khoa dang duoc so sanh voI khoa
dch. Cac nhanh xuaf phaf fu moI nuf Ia cac kof qua co fho co cua phop so sanh
faI nuf do va duoc daf fon fuong ung. KhI gIaI fhuaf kof fhuc chung fa co mof nuf
Ia. Nou gIaI fhuaf fhaf baI fh nuf Ia nay duoc daf fon Ia I, nguoc IaI fon cua nuf
Ia chI so cua phan fu co khoa frung voI khoa dch.

Cay so sanh cho gIaI fhuaf fm kIom fuan fu raf don gIan:


HInh ?.2- Cay so sanh cho fm kIom fuan fu

So Ian so sanh ma mof gIaI fhuaf fm kIom fhuc hIon khI fIon hanh mof phop
fm kIom cu fho Ia so nuf frung gIan ma gIa I fhuaf dI qua ko fu goc |nuf fron cung
cua cay) do dI don nuf Ia can fhIof.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 7 Tm kiem
Giao trnh Cau truc d lieu va Giai thuat 148
HInh dung cuu cuy so sunh cho tIm kem nh{ phun:

CIaI fhuaf fm kIom fuan fu can nhIou phop so sanh hon gIaI fhuaf fm kIom
nhj phan. Chung fa do dang nhan fhay dIou nay qua hnh dang cac cay so sanh
cua chung. CIaI fhuaf fm kIom fuan fu co cay so sanh hop va cao frong khI cay
so sanh cua gIaI fhuaf fm kIom nhj phan rong va fhap hon nhIou. Hnh dang cay
nay gIup fa hIou duoc faI sao so Ian so sanh frong phop fm kIom nhj phan Ia f
hon so voI fm kIom fuan fu.

HInh ?.3- Cay so sanh cho fm kIom nhj phan.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 149
Chng 8 SAP XKP

Chuong nay gIoI fhIou mof so phuong phap sap xop cho ca danh sach IIon fuc
va danh sach IIon kof.
8.1. Go theu
o fruy xuaf fhong fIn nhanh chong va chnh xac, nguoI fa fhuong sap xop
fhong fIn fhoo mof fraf fu hop Iy nao do. Co mof so cau fruc du IIou ma djnh
nghIa cua chung da bao ham fraf fu cua cac phan fu, khI do moI phan fu khI
fhom vao dou phaI dam bao fraf fu nay. Trong chuong nay chung fa so fm hIou
vIoc sap xop cac danh sach chua co fhu fu fro non co fhu fu.

V sap xop co vaI fro quan frong non co raf nhIou phuong phap duoc dua ra do
gIaI quyof baI foan nay. Cac phuong phap nay khac nhau o nhIou dIom, frong do
dIom quan frong nhaf Ia du IIou can sap xop nam foan bo frong bo nho chnh
|fuong ung cac gIaI fhuaf sap xop noI) hay co mof phan nam frong fhIof bj Iuu fru
ngoaI |fuong ung cac gIaI fhuaf sap xop ngoaI). Trong chuong nay chung fa chI
xom xof mof so gIaI fhuaf sap xop noI.

Chung fa so su dung cac Iop da co o chuong 4 va chuong 7. NgoaI ra, frong
fruong hop khI co nhIou phan fu khac nhau co cung khoa fh cac gIaI fhuaf sap
xop khac nhau so cho ra nhung fhu fu khac nhau gIua chung, va doI khI su khac
nhau nay cung co anh huong don cac ung dung.

Trong cac gIaI fhuaf fm kIom, khoI Iuong cong vIoc phaI fhuc hIon co IIon
quan chaf cho voI so Ian so sanh cac khoa. Trong cac gIaI fhuaf sap xop fh dIou
nay cung dung. NgoaI ra, cac gIaI fhuaf sap xop con phaI dI chuyon cac phan fu.
Cong vIoc nay cung chIom nhIou fhoI gIan, dac bIof khI cac phan fu co kch fhuoc
Ion duoc Iuu fru frong danh sach IIon fuc.

o co fho daf duoc hIou qua cao, cac gIaI fhuaf sap xop fhuong phaI fan dung
cac dac dIom rIong cua fung IoaI cau fruc du IIou. Chung fa so vIof cac gIaI fhuaf
sap xop duoI dang cac phuong fhuc cua Iop List.

template <class Record>
class Sortable_list:public List<Record> {
public: // KhaI bao cua cac phuong fhuc sap xop duoc fhom vao day
private: // Cac ham phu fro.
};

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 150
Chung fa co fho su dung baf ky dang hIon fhuc nao cua Iop List frong chuong
4. Cac phan fu du IIou frong Sortable_list co kIou Ia Record. Nhu da gIoI
fhIou frong chuong 7, Record co cac fnh chaf sau day:
MoI mau fIn co mof khoa dI kom.
Cac khoa co fho duoc so sanh voI nhau bang cac foan fu so sanh.
Mof mau fIn co fho duoc chuyon doI fu dong fhanh mof khoa. o do co fho
so sanh cac mau fIn voI nhau hoac so sanh mau fIn voI khoa fhong qua vIoc
chuyon doI mau fIn vo khoa IIon quan don no.
8.2. Sup xep keu chen (Insertion Sort)
Phuong phap sap xop chon vao dua fron y fuong chon phan fu vao danh sach
da co fhu fu.
8.2.1. Chen phun tu vuo dunh such du co thu tu
jnh nghIa danh sach co fhu fu da duoc frnh bay frong chuong 7.
VoI cac danh sach co fhu fu, mof so fac vu chI su dung khoa cua phan fu chu
khong su dung vj fr cua phan fu:
retrieve: fruy xuaf mof phan fu co khoa cho fruoc.
insert: chon mof phan fu co khoa cho fruoc sao cho danh sach van con
fhu fu, vj fr cua phan fu moI duoc xac djnh boI khoa cua no.

Phop fhom vao va phop fruy xuaf co fho khong cho kof qua duy nhaf frong
fruong hop co nhIou phan fu frung khoa. Phop fruy xuaf phan fu dua fron khoa
chnh Ia phop fm kIom da duoc frnh bay frong chuong 7.

o fhom phan fu moI vao danh sach IIon fuc da co fhu fu, cac phan fu so
dung sau no phaI duoc djch chuyon do fao cho frong. Chung fa can fhuc hIon phop



HInh 8.1 Chon phan fu vao danh sach da co fhu fu.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 151
fm kIom do fm vj fr chon vao. V danh sach da co fhu fu non fa co fho su dung
phop fm kIom nhj phan. Tuy nhIon, do fhoI gIan can cho vIoc dI chuyon cac phan
fu Ion hon nhIou so voI fhoI gIan fm kIo m, non vIoc fIof kIom fhoI gIan fm kIom
cung khong caI fhIon fhoI gIan chay foan bo gIaI fhuaf duoc bao nhIou. Nou vIoc
fm kIom fuan fu fu cuoI danh sach co fhu fu duoc fhuc hIon dong fhoI voI vIoc dI
chuyon phan fu, fh chI ph cho mof Ian chon mof phan fu moI Ia foI fhIou.

8.2.2. Sup xep keu chen cho dunh such len tuc
Tac vu fhom mof phan fu vao danh sach co fhu fu Ia co so cua phop sap xop
kIou chon. o sap xop mof danh sach chua co fhu fu, chung fa Ian Iuof Iay ra fung
phan fu cua no va dung fac vu fron do dua vao mof danh sach Iuc dau Ia rong.

Phuong phap nay duoc mInh hoa frong hnh 8.2. Hnh nay chI ra cac buoc can
fhIof do sap xop mof danh sach co 6 fu. Nhn hnh vo chung fa fhay, phan danh
sach da co fhu fu gom cac phan fu fu chI so sorted fro Ion fron, cac phan fu fu
chI so unsorted fro xuong duoI Ia chua co fhu fu. uoc dau fIon, fu hon duoc
xom Ia da co fhu fu do danh sach co mof phan fu duong nhIon Ia danh sach co
fhu fu. TaI moI buoc, phan fu dau fIon frong phan danh sach bon duoI duoc Iay ra
va chon vao vj fr fhch hop frong phan danh sach da co fhu fu bon fron. o co
cho chon phan fu nay, mof so phan fu khac frong phan danh sach da co fhu fu
duoc dI chuyon vo pha cuoI danh sach.

Trong phuong fhuc duoI day, first_unsorted Ia chI so phan fu dau fIon
frong phan danh sach chua co fhu fu, va current Ia bIon fam nam gIu phan fu
nay cho don khI fm duoc cho frong do chon vao.




HInh 8.2- V du vo sa p xop kIo u cho n cho danh sach IIon fuc.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 152


// anh cho danh sach IIon fuc frong chuong 4.

template <class Record>
void Sortable_list<Record>::insertion_sort()
/*
post: Cac phan fu frong danh sach da duoc sap xop fhoo fhu fu khong gIam.
uses: Cac phuong fhuc cua Iop Record.
*/
{
int first_unsorted;//ChI so phan fu dau fIon frong phan danh sach chua co fhu fu.
int position; // ChI so dung cho vIoc dI chuyon cac phan fu vo pha sau.
Record current;// Nam gIu phan fu dang duoc fm cho chon vao phan danh sach da co fhu
fu.
for (first_unsorted = 1; first_unsorted < count; first_unsorted++)
if (entry[first_unsorted] < entry[first_unsorted - 1]) {
position = first_unsorted;
current = entry[first_unsorted];
do { // I chuyon dan cac phan fu vo pha sau do fm cho frong fhch hop.
entry[position] = entry[position - 1];
position--;
} while (position > 0 && entry[position - 1] > current);
entry[position] = current;
}
}

HInh 8.3- uoc chnh cua gIaI fhuaf sap xop kIou chon.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 153
V danh sach co mof phan fu xom nhu da co fhu fu non vong Iap fron bIon
first_unsorted baf dau voI phan fu fhu haI. Nou phan fu nay da o dung vj fr
fh khong can phaI fIon hanh fhao fac nao. Nguoc IaI, phan fu duoc dua vao bIon
current, vong Iap do...while day cac phan fu IuI vo sau mof vj fr cho don khI
fm duoc vj fr dung cho current. Truong hop vj fr dung cua current Ia dau
day can duoc nhan bIof rIong boI dIou kIon fhoaf khoI vong Iap Ia position==0.

8.2.3. Sup xep keu chen cho dunh such len ket
VoI danh sach IIon kof, chung fa khong can dI chuyon cac phan fu, do do cung
khong can baf dau fm kIom fu phan fu cuoI cua phan danh sach da co fhu fu.
Hnh 8.4 mInh hoa gIaI fhuaf nay. Con fro last_sorted chI phan fu cuoI cung
cua phan danh sach da co fhu fu, last_sorted->next chI phan fu dau fIon cu a
phan danh sach chua co fhu fu. Ta dung bIon first_unsorted do chI vao phan
fu nay va bIon current do fm vj fr fhch hop cho vIoc chon phan fu
*first_unsorted vao. Nou vj fr dung cua *first_unsorted Ia dau danh sach
fh no duoc chon vao vj fr nay. Nguoc IaI, current duoc dI chuyon vo pha cuoI
danh sach cho don khI co |current->entry >= first_unsorted->entry) va
*first_unsorted duoc fhom vao ngay fruoc *current. o co fho fhuc hIon vIoc
fhom vao fruoc current, chung fa can mof con fro trailing Iuon dung fruoc
current mof vj fr.
HInh 8.4- Sap xop kIo u cho n cho danh sach IIo n kof.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 154
Nhu chung fa da bIof, phan fu cam canh |sentinel) Ia mof phan fu duoc fhom
vao mof dau cua danh sach do dam bao rang vong Iap Iuon kof fhuc ma khong
can phaI fhuc hIon bo sung mof phop kIom fra nao. V chung fa da co

last_sorted->next == first_unsorted,

non phan fu *first_unsorted dong Iuon vaI fro cua phan fu cam canh frong
khI current fIon dan vo pha cuoI phan danh sach da co fhu fu. Nho do, dIou
kIon dung cua vong Iap dI chuyon current Iuon duoc dam bao.

NgoaI ra, danh sach rong hay danh sach co mof phan fu Ia duong nhIon co fhu
fu, non fa co fho kIom fra fruoc do dang.

Mac du co cho hIon fhuc cua sap xop kIou chon cho danh sach IIon kof va cho
danh sach IIon fuc co nhIou dIom khac nhau nhung vo y fuong fh haI phIon ban
nay raf gIong nhau. Iom khac bIof Ion nhaf Ia frong danh sach IIon kof vIoc fm
kIom duoc fhuc hIon fu dau danh sach frong khI frong danh sach IIon fuc vIoc fm
kIom duoc fhuc hIon fhoo chIou nguoc IaI.

// anh cho danh sach IIon kof frong chuong 4.
template <class Record>
void Sortable_list<Record>::insertion_sort()
/*
post: Cac phan fu frong danh sach da duoc sap xop fhoo fhu fu khong gIam.
uses: Cac phuong fhuc cua Iop Record.
*/
{
Node <Record> *first_unsorted,
*last_sorted,
*current,
*trailing;
if (head != NULL) { // IoaI fruong hop danh sach rong va
last_sorted = head; // fruong hop danh sach chI co 1 phan fu.

while (last_sorted->next != NULL) {
first_unsorted = last_sorted->next;
if (first_unsorted->entry < head->entry) {
// *first_unsorted duoc chon vao dau danh sach.
last_sorted->next = first_unsorted->next;
first_unsorted->next = head;
head = first_unsorted;
}
else {
// Tm vj fr fhch hop.
trailing = head;
current = trailing->next;
while (first_unsorted->entry > current->entry) {
trailing = current;
current = trailing->next;
}
// *first_unsorted duoc chon vao gIua *trailing va *current.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 155
if (first_unsorted == current)
last_sorted = first_unsorted; // vj fr dang co da dung.
else {
last_sorted->next = first_unsorted->next;
first_unsorted->next = current;
trailing->next = first_unsorted;
}
}
}
}
}

ThoI gIan can fhIof do sap xop danh sach dung gIaI fhuaf sap xop kIou chon fI
Io voI bnh phuong so phan fu cua danh sach.
8.3. Sup xep keu chon (Selection Sort)
Sap xop kIou chon co mof nhuoc dIom Ion. Sau khI mof so phan fu da duoc sap
xop vao phan dau cua danh sach, vIoc sap xop mof phan fu pha sau doI khI doI
hoI phaI dI chuyon phan Ion cac phan fu da co fhu fu nay. MoI Ian dI chuyon, cac
phan fu chI duoc dI chuyon mof vj fr, do do nou mof phan fu can dI chuyon 20 vj
fr do don duoc vj fr dung cuoI cung cua no fh no can duoc dI chuyon 20 Ian. Nou
kch fhuoc cua moI phan fu Ia nho hoac chung fa su dung danh sach IIon kof fh
vIoc dI chuyon nay khong can nhIou fhoI gIan Iam. Nhung nou kch fhuoc moI
phan fu Ion va danh sach Ia IIon fuc fh fhoI gIan dI chuyon cac phan fu so raf
Ion. Nhu vay, nou nhu moI phan fu, khI can phaI dI chuyon, duoc dI chuyon ngay
don vj fr dung sau cung cua no fh gIaI fhuaf so chay hIou qua hon nhIou. Sau
day chung fa frnh bay mof gIaI fhuaf do daf duoc dIou do.

8.3.1. Gu thuut



HInh 8.5- V du sap xop kIo u cho n.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 156
Hnh 8.5 frnh bay mof v du sap xop 6 fu fhoo fhu fu cua bang chu caI. TaI
buoc dau fIon, chung fa fm phan fu so dung faI vj fr cuoI cung frong danh sach
co fhu fu va frao doI vj fr voI phan fu cuoI cung hIon faI. Trong cac buoc ko fIop,
chung fa fIop fuc Iap IaI cong vIoc fron voI phan con IaI cua danh sach khong ko
cac phan fu da duoc chon frong cac buoc fruoc. KhI phan danh sach chua duoc sap
xop chI con IaI mof phan fu fh gIaI fhuaf kof fhuc.

uoc fong quaf frong sap xop kIou chon duoc mInh hoa frong hnh 8.6. Cac
phan fu co khoa Ion da duoc sap fhoo fhu fu va daf o phan cuoI danh sach. Cac
phan fu co khoa nho hon chua duoc sap xop. Chung fa fm frong so nhung phan
fu chua duoc sap xop do Iay ra phan fu co khoa Ion nhaf va doI cho no vo cuoI cac
phan fu nay. ang cach nay, faI moI buoc, mof phan fu duoc dua vo dung vj fr
cuoI cung cua no.
8.3.2. Sup xep chon tren dunh such len tuc
Sap xop chon gIam foI da vIoc dI chuyon du IIou do moI buoc dou co f nhaf
mof phan fu duoc daf vao dung vj fr cuoI cung cua no. V vay sap xop kIou chon
fhch hop cho cac danh sach IIon fuc co cac phan fu co kch fhuoc Ion. Nou cac
phan fu co kch fhuoc nho hay danh sach co hIon fhuc Ia IIon kof fh sap xop kIou
chon fhuong nhanh hon sap xop kIou chon. o do chung fa chI xom xof sap xop
kIou chon cho danh sach IIon fuc. CIaI fhuaf sau day su dung ham phu fro
max_key cua Sortable_list do fm phan fu Ion nhaf.





HInh 8.6- Mo f buoc frong sap xo p kIo u chon.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 157
// anh cho danh sach IIon fuc frong chuong 4.

template <class Record>
void Sortable_list<Record>::selection_sort()
/*
post: Cac phan fu frong danh sach da duoc sap xop fhoo fhu fu khong gIam.
uses: max_key, swap.
*/
{
for (int position = count - 1; position > 0; position--) {
int max = max_key(0, position);
swap(max, position);
}
}

Iuu y rang khI n-1 phan fu da dung vao vj fr dung |n Ia so phan fu cua danh
sach) fh phan fu con IaI duong nhIon co vj fr dung. o do vong Iap kof fhuc faI
position==1.

template <class Record>
// anh cho danh sach IIon fuc frong chuong 4.

int Sortable_list<Record>::max_key(int low, int high)
/*
pre: low va high Ia haI vj fr hop Io frong danh sach va low <= high.
post: fra vo vj fr phan fu Ion nhaf nam frong khoang chI so fu low don high.
uses: Iop Record.
*/
{
int largest, current;
largest = low;
for (current = low + 1; current <= high; current++)
if (entry[largest] < entry[current])
largest = current;
return largest;
}

template <class Record>
void Sortable_list<Record>::swap(int low, int high)
/*
pre: low va high Ia haI vj fr hop Io frong danh sach Sortable_list.
post: Phan fu faI low hoan doI voI phan fu faI high.
uses: HIon fhuc danh sach IIon fuc frong chuong 4.
*/
{
Record temp;
temp = entry[low];
entry[low] = entry[high];
entry[high] = temp;
}

!u dIom chnh cua sap xop kIou chon IIon quan don vIoc dI chuyon du IIou.
Nou mof phan fu da o dung vj fr cua no fh so khong bj dI chuyon nua. KhI haI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 158
phan fu nao do duoc doI cho fh f nha f mof frong haI phan fu so duoc dua vao
dung vj fr cuoI cung cua phan fu frong danh sach.
8.4. Shell_sort
Nhu chung fa fhay, nguyon fac hoaf dong cua sap xop kIou chon va sap xop
kIou chon Ia nguoc nhau. Sap xop kIou chon fhuc hIon vIoc dI chuyon phan fu raf
hIou qua nhung IaI fhuc hIon nhIou phop so sanh fhua. Trong fruong hop fof nhaf
co fho xay ra, sap xop kIou chon fhuc hIon raf f cac phop so sanh nhung IaI fhuc
hIon raf nhIou phop dI chuyon du IIou fhua. Sau day chung fa xom xof mof
phuong phap frong do nhuoc dIom cua moI phuong phap fron so duoc franh cang
nhIou cang fof.

Iy do khIon gIaI fhuaf sap xop kIou chon chI dI chuyon cac phan fu moI Ian
duoc mof vj fr Ia v no chI so sanh cac phan fu gan nhau. Nou chung fa fhay doI
gIaI fhuaf nay sao cho no so sanh cac phan fu o xa nhau fruoc fh khI co su doI
cho, mof phan fu so dI chuyon xa hon. an dan, khoang cach nay duoc gIam dan
don 1 do dam bao rang foan bo danh sach duoc sap xop. ay cung Ia fu fuong cua
gIaI fhuaf ShoII sorf, duoc .I. ShoII do xuaf va hIon fhuc vao nam 1959. Phuong
phap nay doI khI con duoc goI Ia phuong phap sap xop gIam do fang
|diminishing-increment sort).

O day chung fa xom mof v du khI sap xop cac fon. Iuc dau fa sap xop cac fon
o cach nhau 5 vj fr, sau do gIam xuong 3 va cuoI cung con 1.

Mac du chung fa phaI duyof danh sach nhIou Ian, nhung frong nhung Ian
duyof fruoc cac phan fu da duoc dI chuyon don gan vj fr cuoI cung cua chung.
Nho vay nhung Ian duyof sau, cac phan fu nhanh chong duoc dI chuyon vo vj fr
dung sau cung cua chung.

Cac khoang cach 5, 3, 1 duoc chon ngau nhIon. Tuy nhIon, khong non chon cac
buoc dI chuyon ma chung IaI Ia boI so cua nhau. V khI do fh cac phan fu da duoc
so sanh voI nhau o buoc fruoc so duoc so sanh fro IaI o buoc sau, ma nhu vay vj
fr cua chung so khong duoc caI fhIon. a co mof so nghIon cuu vo Shell_sort,
nhung chua aI co fho chI ra cac khoang cach dI chuyon nao Ia fof nhaf. Tuy nhIon
cung co mof so goI y vo cach chon cac khoang cach dI chuyon. Nou cac khoang dI
chuyon duoc chon gan nhau fh so phaI duyof danh sach nhIou Ian hon nhung moI
Ian duyof IaI nhanh hon. Nguoc IaI, nou khoang cach dI chuyon gIam nhanh fh
co f Ian duyof hon va moI Ian duyof so fon nhIou fhoI gIan hon. Iou quan frong
nhaf Ia khoang dI chuyon cuoI cung phaI Ia 1.



Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 159

template <class Record>
void Sortable_list<Record>::shell_sort()
/*
post: Cac phan fu frong Sortable_list da duoc sap fhoo fhu fu khoa khong gIam.
uses: Ham sort_interval
*/
{
int increment = count; // Khoang cach gIua cac phan fu frong moI danh sach con.
int start;
do {
increment = increment / 3 + 1; // CIam khoang cach qua moI Ian Iap.
for (start = 0; start < increment; start++)
sort_interval(start, increment);// Ion fho cua gIaI fhuaf sap xop kIou chon.
} while (increment > 1);
}
Ham sort_interval Ia mof bIon fho cua gIaI fhuaf sap xop kIou chon, voI
fhong so Incromonf Ia khoang cach cua haI phan fu ko nhau frong danh sach can
duoc sap fhu fu. Tuy nhIon co mof dIou can Iuu y Ia vIoc sap xop frong fung danh
sach con khong nhaf fhIof phaI dung phuong phap chon vao.

HInh 8.? V du vo Shell_Sort.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 160
TaI buoc cuoI cung, khoang dI chuyon Ia 1 non Shell_sort vo ban chaf van Ia
sap xop kIou chon. V vay fnh dung dan cua Shell_sort cung fuong fu nhu sap
xop kIou chon. Vo maf hIou qua, chung fa hy vong rang cac buoc fIon xu Iy so
gIup cho qua frnh xu Iy nhanh hon.

VIoc phan fch Shell_sort Ia dac bIof kho. Cho don nay, nguoI fa chI moI co
fho uoc Iuong duoc so Ian so sanh va so phop gan can fhIof cho gIaI fhuaf frong
nhung fruong hop dac bIof.
8.5. Cuc phuong phup sup xep theo keu chu de tr{
8.5.1. Y tuong co bun
Tu nhung gIaI fhuaf da duoc frnh bay va fu kInh nghIom fhuc fo fa ruf ra kof
Iuan rang sap xop danh sach daI fh kho hon Ia sap xop danh sach ngan. Nou
chIou daI danh sach fang gap doI fh cong vIoc sap xop fhong fhuong fang hon
gap doI |voI sap xop kIou chon va sap xop kIou chon, khoI Iuong cong vIoc fang
Ion khoang bon Ian). o do, nou chung fa co fho chIa mof danh sach ra fhanh haI
phan co kch fhuoc xap xI nhau va fhuc hIon vIoc sap xop moI phan mof cach
rIong ro fh khoI Iuong cong vIoc can fhIof cho vIoc sap xop so gIam dI dang ko.
V du vIoc sap xop cac phIou frong fhu vIon so nhanh hon nou cac phIou duoc chIa
fhanh fung nhom co chung chu caI dau va fung nhom duoc fIon hanh sap xop
rIong ro.

O day chung fa van dung y fuong chIa mof baI foan fhanh nhIou baI foan
fuong fu nhu baI foan ban dau nhung nho hon va gIaI quyof cac baI foan nho nay.
Sau do chung fa fong hop IaI do co IoI gIaI cho foan bo baI foan ban dau. Phuong
phap nay duoc goI Ia chIa do frj | divide-and-conquer).

o sap xop cac danh sach con, chung fa IaI ap dung chIon Iuoc chIa do frj do
fIop fuc chIa nho fung danh sach con. Qua frnh nay dI nhIon khong bj Iap vo
fan. KhI fa co cac danh sach con voI kch fhuoc Ia 1 phan fu fh qua frnh dung.

Chung fa co fho fho hIon y fuong fron frong doan ma gIa sau day.

void Sortable_list::sort()
{
if (danh sach co nhIou hon 1 phan fu)
{
Phan hoach danh sach fhanh haI danh sach con lowlist, highlist;
lowlist.sort();
highlist.sort();
Kof noI haI danh sach con lowlist va highlist;
}
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 161
Van do con IaI can xom xof Ia cach phan hoach |partition) danh sach ban dau
va cach kof noI |combine) haI danh sach da co fhu fu cho fhanh mof danh sach co
fhu fu. Co haI phuong phap duoI day, moI phuong phap so Iam vIoc fof ung voI
mof so fruong hop rIong.

Merge_sort: fhoo phuong phap nay haI danh sach con chI can co kch fhuoc
gan bang nhau. Sau khI sap xop xong fh chung duoc fron IaI sao cho danh
sach cuoI cung co fhu fu.

Quick_sort: fhoo phuong phap nay, haI danh sach con duoc chIa sao cho buoc
kof noI IaI fro non don gIan. Phuong phap nay duoc C. A. R. Hoaro dua ra. o
phan hoach danh sach, chung fa so chon mof phan fu fu frong danh sach voI
hI vong rang co khoang mof nua so phan fu dung fruoc va khoang mof nua so
phan fu dung sau phan fu duoc chon frong danh sach co fhu fu sau cung. Phan
fu nay duoc goI Ia phan fu fru |pivot). Sau do chung fa chIa cac phan fu fhoo
quI fac: cac phan fu co khoa nho hon khoa cua phan fu fru duoc chIa vao danh
sach fhu nhaf, cac phan fu co khoa Ion hon khoa cua phan fu fru duoc chIa vao
danh sach fhu haI. KhI haI danh sach nay da duoc sap xop fh chung fa chI
can noI chung IaI voI nhau.
8.5.2. VI du
Truoc khI xom xof chI fIof cua cac gIaI fhuaf, chung fa so fhuc hIon vIoc sap
xop mof danh sach cu fho co 7 so nhu sau:
26 33 35 29 19 12 22

HInh 8.8- Cay do quy cho Merge_sort voI 7 so.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 162
8.5.2.1. VI du cho Merge_sort
uoc dau fIon Ia chIa danh sach fhanh haI phan. KhI so phan fu cua danh
sach Ia Io fh chung fa so quI uoc danh sach con bon fraI so daI hon danh sach
con bon phaI mof phan fu. Thoo quI uoc nay, chung fa co haI danh sach con

26 33 35 29 va 19 12 22

Ta xom xof danh sach con fhu nhaf fruo c. anh sach nay cung duoc chIa fhanh
haI phan
26 33 va 35 29

voI moI nua nay, chung fa IaI ap dung phuong phap fron do duoc cac danh sach
con co chIou daI Ia 1. Cac danh sach con chIou daI 1 phan fu nay khong can phaI
sap xop. CuoI cung chung fa can phaI fron cac danh sach con nay do duoc mof
danh sach co fhu fu. 26 va 33 fao fhanh danh sach 26 33; 35 va 29 duoc fron
fhanh 29 35. Ko fIop, haI danh sach nay nay duoc fron fhanh 26 29 33 35.

Tuong fu nhu vay, voI nua fhu haI cua danh sach ban dau fa duoc

12 19 22
CuoI cung, fron haI phan nay fa duoc

12 19 22 26 29 33 35
8.5.2.2. VI du cho Quick_sort
Chung fa su dung v du nay cho Quick_sort.
o su dung Quick_sort, fruoc fIon chung fa phaI xac djnh phan fu fru. Phan
fu nay co fho Ia phan fu baf ky nao cua danh sach, fuy nhIon, do cho fhong nhaf
chung fa so chon phan fu dau fIon. Trong cac ung dung fhuc fo fhuong nguoI fa co
nhung cach xac djnh phan fu fru khac fof hon.

Thoo v du nay, phan fu fru dau fIon Ia 26. o do haI danh sach con duoc fao
ra Ia:

19 12 22 va 33 35 29

HaI danh sach nay Ian Iuof chua cac so nho hon va Ion hon phan fu fru. O day
fhu fu cua cac phan fu frong haI danh sach con khong doI so voI danh sach ban
dau nhung day khong phaI Ia dIou baf buoc.

Chung fa fIop fuc sap xop cac chuoI con. VoI chuoI con fhu nhaf, chung fa chon
phan fu fru Ia 19, do do duoc haI danh sach con Ia 12 va 22. HaI danh sach nay
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 163
chI co mof phan fu non duong nhIon co fhu fu. CuoI cung, gom haI danh sach con
va phan fu fru IaI fa co danh sach da sap xop

12 19 22

Ap dung phuong phap fron cho phan fhu haI cua danh sach, fa duoc danh sach
cuoI cung Ia
29 33 35

Com haI danh sach con da sap xop nay va phan fu fru dau fIon fa duoc danh
sach co fhu fu sau cung:
12 19 22 26 29 33 35

Cac buoc cua gIaI fhuaf duoc mInh hoa boI hnh sau.



HInh 8.9- Cac buoc fhuc fhI cua Quick_sort
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 164

8.6. Merge_sort cho dunh such len ket

Sau day Ia cac ham do fhuc hIon cac phop sap xop noI fron. VoI Merge_sort,
chung fa vIof mof phIon ban cho danh sach IIon kof con voI Quick_sort fh
chung fa vIof mof phIon ban cho danh sach IIon fuc. SInh vIon co fho fu phan fch
xom IIou cach Iam nguoc IaI co kha fhI va co hIou qua hay khong |Merge_sort
cho danh sach IIon fuc va Quick_sort cho danh sach IIon kof).

Merge_sort con Ia mof phuong phap raf fof cho vIoc sap xop ngoaI, fuc Ia sap
xop cac du IIou nam fron bo nho ngoaI co foc do fruy xuaf kha cham va khong co
kha nang fruy xuaf ngau nhIon.

Sap xop danh sach IIon kof co nghIa Ia fhay doI cac moI IIon kof frong danh
sach va franh vIoc fao moI hay xoa dI cac phan fu. Cu fho hon, chuong frnh
Merge_sort so goI mof ham do quI do xu Iy fung fap con cac phan fu cua danh
sach IIon kof.

// anh cho danh sach IIon kof frong chuong 4.

template <class Record>
void Sortable_list<Record>::merge_sort()
/*
post: Cac phan fu frong danh sach da duoc sap fhoo fhu fu khong gIam.
uses: recursive_merge_sort.
*/
{
recursive_merge_sort(head);
}




HInh 8.10- Cay do quy cho Quick_sort voI 7 phan fu.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 165
Sau day Ia ham recursive_merge_sort duoc vIof duoI dang do quI.

template <class Record>
void Sortable_list<Record>::recursive_merge_sort(Node<Record> *&sub_list)
/*
post: Cac phan fu frong danh sach fham chIou boI sub_list da duoc sap fhoo fhu fu khong
gIam. Tham bIon con fro sub_list duoc cap nhaf chua dja chI phan fu dau fIon va cung
Ia phan fu nho nhaf frong danh sach.
uses: Cac ham divide_from, merge, va recursive_merge_sort.
*/
{
if (sub_list != NULL && sub_list->next != NULL) {
Node<Record> *second_half = divide_from(sub_list);
recursive_merge_sort(sub_list);
recursive_merge_sort(second_half);
sub_list = merge(sub_list, second_half);
}
}

Ham dau fIon ma ham recursive_merge_sort su dung Ia divide_from.
Ham nay nhan vao danh sach duoc fham chIou boI sub_list va fach no fhanh
haI nua bang cach fhay IIon kof o gIua danh sach bang N!II va fra vo con fro
don phan fu dau fIon cua phan con IaI cua danh sach ban dau. ang cach cho con
fro midpoint fIon mof buo c va con fro position fIon haI buoc frong moI Ian Iap,
khI position don cuoI danh sach fh midpoint dung ngay gIua danh sach.

// anh cho danh sach IIon kof frong chuong 4.

template <class Record>
Node<Record> *Sortable_list<Record>::divide_from(Node<Record> *sub_list)
/*
post: So phan fu frong danh sach fro boI sub_list gIam mof nua. ja chI phan fu dau frong
danh sach cac phan fu con IaI duoc fra vo. Nou danh sach ban dau co so phan fu Io fh
danh sach fhu nhaf nhIou hon danh sach fhu haI 1 phan fu.
*/
{
Node<Record> *position,
*midpoint,
*second_half;

if ((midpoint = sub_list) == NULL) return NULL; // anh sach ban dau rong.
position = midpoint->next;
while (position != NULL) { // Tm phan fu nam gIua danh sach.
position = position->next;
if (position != NULL) {
midpoint = midpoint->next;
position = position->next;
}
}
second_half = midpoint->next;
midpoint->next = NULL;
return second_half;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 166

Ham fhu haI

Node<Record> *merge(Node<Record> *first, Node<Record> *second)

fron haI danh sach co fhu fu khong gIam fro boI first va second fhanh mof
danh sach co fhu fu khong gIam va fra vo con fro don phan fu co khoa nho nhaf
|cung Ia phan fu dau fIon cua danh sach kof qua). Ham nay duyof dong fhoI haI
danh sach, so sanh mof cap khoa Iay fu haI phan fu, moI phan fu fhuoc mof frong
haI danh sach noI fron, va dua phan fu fhch hop |nho hon hoac bang) vao frong
danh sach kof qua. Truong hop dau va cuoI cua danh sach can phaI duoc xu Iy
rIong bIof. KhI mof frong haI danh sach hof fruoc, chung fa chI can noI phan con
IaI cua danh sach kIa vao cuoI danh sach kof qua. Can nhac IaI rang, doI voI danh
sach IIon kof, cach xu Iy cho phan fu dau fIon khong gIong voI cach xu Iy cho cac
phan fu fu vj fr fhu haI fro dI, do co anh huong don con fro dau danh sach. Cach
do dang nhaf Ia chung fa fao mof nuf fam fhoI goI Ia combined. Nuf nay duoc
daf o dau danh sach va khong chua du IIou fhuc. VoI cau fruc nay, cac phan fu co
fho duoc dua vao danh sach ma khong can phaI phan bIof dau Ia phan fu dau fIon
fhuc su. CuoI cung, gIa frj fra vo cua ham Ia con fro next cua nuf combined. Nuf
combined con duoc goI Ia nuf gIa v no khong chua du IIou fhaf su ma chI duoc
dung do don gIan hoa vIoc xu Iy cac con fro, no so khong con fon faI khI hof
pham vI cua phuong fhuc merge.





















HInh 8.11- Tron haI danh sach da co fhu fu.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 167
// anh cho danh sach IIon kof frong chuong 4.

template <class Record>
Node<Record> *Sortable_list<Record>::merge(Node<Record> *first,
Node<Record> *second)
/*
pre: first va second fro don haI danh sach co fhu fu.
post: Phuong fhuc fra vo con fro fro don danh sach cac phan fu da co fhu fu, do Ia cac phan
fu cua haI danh sach ban dau duoc fron IaI. HaI danh sach ban dau khong con phan fu.
uses: Cac phuong fhuc cua Iop Records.
*/
{
Node<Record> *last_sorted;
Node<Record> combined; // Phan fu gIa.
last_sorted = &combined; // anh sach kof qua nhan dan cac phan fu fu first va
// second, fhoo fhu fu fu phan fu nho don phan fu Ion.
while (first != NULL && second != NULL) {
if (first->entry <= second->entry) {
last_sorted->next = first;
last_sorted = first;
first = first->next;
}
else {
last_sorted->next = second;
last_sorted = second;
second = second->next;
}
}
// NoI phan con IaI cua danh sach chua hof.
if (first == NULL)
last_sorted->next = second;
else
last_sorted->next = first;
return combined.next;
}
8.7. Quick_sort cho dunh such len tuc
8.7.1. Cuc hum
CIaI fhuaf Quick_sort cho danh sach IIon fuc can don mof gIaI fhuaf phan
hoach danh sach fhong qua vIoc su dung phan fu fru. CIaI fhuaf nay doI cho cac
phan fu sao cho cac phan fu co khoa nho hon khoa phan fu fru so duoc dung
fruoc, ko don Ia cac phan fu co khoa frung voI khoa cua phan fu fru, va cuoI cung
Ia cac phan fu co khoa Ion hon khoa cua phan fu fru. Chung fa dung bIon
pivot_position do Iuu IaI vj fr cua phan fu fru frong danh sach da duoc phan
hoach.

o cac danh sach con, kof qua cua phop phan hoach, duoc Iuu frong cung mof
danh sach va fhoo dung vj fr fuong doI gIua chung, non vIoc gom chung IaI
fhanh mof danh sach Ia hoan foan khong can fhIof va chuong frnh khong can
phaI Iam fhom baf cu dIou g.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 168
o co fho goI do quI ham sap xop cho cac danh sach con, cac gIoI han fron va
duoI cua danh sach phaI Ia cac fham so cho ham sap xop. Tuy nhIon, do quI uoc
cua chung fa Ia cac phuong fhuc sap xop khong nhan fham so, chung fa so dung
mof phuong fhuc khong co fham so do goI ham sap xop do quI co fham so.

// anh cho danh sach IIon fuc frong chuong 4.
template <class Record>
void Sortable_list<Record>::quick_sort()
/*
post: Cac phan fu frong danh sach da duoc sap fhoo fhu fu khong gIam.
uses: recursive_quick_sort.
*/
{
recursive_quick_sort(0, count - 1);
}

Ham do quI fhuc hIon vIoc sap xop:
// anh cho danh sach IIon fuc frong chuong 4.
template <class Record>
void Sortable_list<Record>::recursive_quick_sort(int low, int high)
/*
pre: low va high Ia cac vj fr hop Io frong Sortable_list.
post: Cac phan fu frong danh sach fu chI so low don chI so high da duoc sap fhoo fhu fu khong
gIam.
uses: recursive_quick_sort, partition.
*/
{
int pivot_position;
if (low < high) { // anh sach co nhIou hon mof phan fu.
pivot_position = partition(low, high);
recursive_quick_sort(low, pivot_position - 1);
recursive_quick_sort(pivot_position + 1, high);
}
}
8.7.2. Phun houch dunh such
Co nhIou gIaI fhuaf do phan hoach danh sach. Phuong phap chung fa su dung
o day raf don gIan nhung hIou qua. No fhuc hIon so Ian so sanh khoa nho nhaf co
fho duoc.
8.7.2.1. Phut tren gu thuut
Cho gIa frj cua phan fu fru, chung fa phaI bo fr IaI cac phan fu va fnh chI so
pivot_position sao cho phan fu fru nam faI pivot_position, cac phan fu nho
hon nam pha bon fraI va ca c phan fu Ion hon nam pha bon phaI phan fu fru. o
co fho xu Iy fruong hop co nhIou hon mof phan fu co khoa dung bang khoa cua
phan fu fru, chung fa quI uoc rang cac phan fu bon fraI co khoa nho hon khoa cua
phan fu fru mof cach nghIom ngaf frong khI cac phan fu bon phaI co khoa Ion
hon hoac bang khoa cua phan fu fru nhu frong so do sau day.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 169

o co duoc cac phan fu nhu fho nay, chung fa phaI so sanh fung phan fu voI
phan fu fru bang cach su dung mof vong for voI bIon chI so Ia . NgoaI ra, chung
fa con su dung bIon last_small sao cho cac phan fu fu last_small fro vo fruoc
co khoa nho hon khoa cua phan fu fru. CIa su ban dau phan fu fru nam faI dau
danh sach. Tam fhoI chung fa so gIu nguyon vj fr cua no o do. KhI chuong frnh
dang o frong fhan vong Iap, danh sach va cac bIon co quan ho voI nhau nhu sau:
KhI chuong frnh kIom fra phan fu faI vj fr fh co haI fruong hop xay ra.
Nou phan fu do van Ion hon hay bang phan fu fru fh bIon so fIop fuc fang Ion
va danh sach van bao foan fnh chaf can fhIof. Nguoc IaI, chung fa so fang
last_small va hoan doI haI phan fu faI last_small |moI) va phan fu faI . KhI
do, fnh chaf cua danh sach van duoc duy fr. CuoI cung, khI da dI hof chIou daI
cua danh sach, chung fa chI can doI cho phan fu fru fu vj fr low sang vj fr
last_small Ia so co kof qua can fhIof.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 170
8.7.2.2. Chon phun tu tru
Phan fu fru khong nhaf fhIof phaI Ia phan fu dau fIon cua danh sach. Chung
fa co fho chon baf cu phan fu nao cua danh sach do Iam phan fu fru. Thuc fo fh
phan fu dau fIon fhuong khong phaI Ia phan fu fru fof. V nou danh sach da co
fhu fu fh khong co phan fu nao nho hon phan fu fru, do do mof frong haI danh
sach con so rong va frong fruong hop nay Quick_sort fro fhanh Slow_sort.
V vay, mof Iua chon fof hon cho phan fu fru Ia phan fu gan gIua cua danh sach
voI hI vong rang phan fu nay so chIa haI danh sach co kch fhuoc gan nhu nhau.
8.7.2.3. Vet chuong trInh
VoI nhung Iua chon nay, chung fa co duoc phuong fhuc sau.
template <class Record>
int Sortable_list<Record>::partition(int low, int high)
/*
pre: low va high Ia cac vj fr hop Io frong Sortable_list, low <= high.
post: Phan fu nam gIua haI chI so low va high duoc chon Iam pivot. Cac phan fu frong danh
sach fu chI so low don chI so high da duoc phan hoach nhu sau: cac phan fu nho hon
pivot dung fruoc pivot, cac phan fu con IaI dung sau pivot. Ham fra vo vj fr cua
pivot.
uses: cac phuong fhuc cua Iop Record va ham swap(int i, int j) hoan vj haI phan fu faI vj
fr I va j frong danh sach.
*/
{
Record pivot;
int i, last_small;
swap(low, (low + high) / 2);
pivot = entry[low];
last_small = low;
for (i = low + 1; i <= high; i++)
// au moI Ian Iap, chung fa co cac dIou kIon sau:
// If low < j <= last_small then entry[j].key < pivot.
// If last_small < j < i then entry[j].key >= pivot.
if (entry[i] < pivot) {
last_small = last_small + 1;
swap(last_small, i);
}
swap(low, last_small);// Tra pivot vo dung vj fr fhch hop
return last_small;
}
8.8. Heup vu Heup_sort
Quick_sort co mof nhuoc dIom Ia do phuc fap frong fruong hop xau nhaf raf
Ion. Thong fhuong fh Quick_sort chay raf nhanh nhung cung co nhung fruong
hop du IIou vao khIon cho Quick_sort chay raf cham. Trong phan nay chung fa
xom xof mof phuong phap sap xop khac khac phuc duoc nhuoc dIom nay. CIaI
fhuaf nay co fon Ia Heap_sort. Heap_sort can O(n log n) phop so sanh va dI
chuyon phan fu do sap xop mof danh sach IIon fuc co n phan fu, ngay ca frong
fruong hop xau nhaf. Nhu vay frong fruong hop xau nhaf, Heap_sort co gIoI han
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 171
vo fhoI gIan chay fof hon so voI Quick_sort. NgoaI ra no cung fof hon
Merge_sort fron danh sach IIon fuc vo maf su dung khong gIan.

CIaI fhuaf Heap_sort cung nhu mof so hIon fhuc cua hang uu fIon frong
chuong 11 dou dua fron cung mof khaI nIom heap nhu nhau. o Ia mof cau fruc
cay fuong fu nhu cau fruc cap bac frong mof fo chuc. Chung fa fhuong bIou dIon
cau fruc fo chuc cua mof cong fy nao do bang mof cau fruc cay. KhI gIam doc cong
fy nghI vIoc fh mof frong haI pho gIam doc |nguoI fof hon, fhoo mof so fIou ch
nao do) so duoc chon do fho cho va nhu vay fIop fuc frong mof vj fr khac. Qua
frnh nay duoc Iap IaI fu cho cao nhaf frong cau fruc cho don cho fhap nhaf.
Chung fa Iam quon voI djnh nghIa heap nhj phan duoI day.

8.8.1. O{nh nghIu heap nh{ phun
nh ngha: Mof heap nh{ phun Ia mof cau fruc cay nhj phan voI haI fnh chaf
sau:
1. Cay day du hoac gan nhu day du.
2. Khoa faI moI nuf dou nho hon houc bung khoa cua cac nuf frong haI cay con
cua no.

Mof cay nhj phan day du hoac gan nhu day du chIou cao h so co fu 2
h-1
don 2
h
-
1 nuf. o do chIou cao cua no so Ia O|IogN).
Mof dIou quan frong nhaf o day Ia do fnh chaf cay day du hoac gan nhu day du
non heap co fho duoc hIon fhuc bang mang IIon fuc cac phan fu ma khong can
dung don con fro. Nou phan fu dau fIon cua mang co chI so Ia 0 fh, mof phan fu
faI vj fr I so co con fraI faI 2I+1 va con phaI faI 2I+2, va cha cua no faI I-1/2 .









|a) |b)


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
13 21 16 24 31 19 68 65 26 32
|c)

HInh 8.12 |a) Cay nhj phan gan nhu day du bIou dIon mof heap.
13
21 16
24 31
65 26 32
19 68
13
21 16
20 31
65 26 32
19 68
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 172
|b) Khong fhoa dIou kIon cua heap faI nof duf roI.
|c) HIon fhuc heap o hnh a frong mof mang IIon fuc.
Iuu y rang co khI chung fa goI hoap duoc djnh nghIa nhu fron Ia mof min-
heap, do phan bIof voI fruong hop max-heap. Trong min-heap fh phan fu faI
goc Ia phan fu bo nhaf. Max-heap so sua dIou kIon fhu haI fhanh Khoa faI moI
nuf dou lon hon houc bung khoa cua cac nuf frong haI cay con cua no, do do
phan fu faI goc so Ia phan fu Ion nhaf.

Max-heap duoc su dung frong gIaI fhuaf Heap_sort.

KhI doc xong vo hang uu fIon, sInh vIon co fho fhay rang co fho su dung ngay
hang uu fIon |nou da co san) do phuc vu cho vIoc sap xop fhoo dung y fuong cua
Heap_sort. Tuy nhIon, nou chI voI muc dch hIon fhuc mof gIaI fhuaf sap fhu fu
fhaf hIou qua fron mof danh sach sach IIon fuc, fh gIaI fhuaf sap duoc frnh bay
duoI day don gIan va fIof kIom khong gIan hon raf nhIou, do no da co gang chI
sung dung chnh phan bo nho chua cac phan fu can sap xop, chu khong doI hoI
fhom vung nho nao dang ko.

Iuu y rang heap khong phaI Ia mof danh sach co fhu fu. Tuy phan fu dau fIon
Ia phan fu Ion nhaf cua danh sach nhung faI cac vj fr k > 1 khac fh khong co
mof fhu fu baf buoc gIua cac phan fu k va k+1. NgoaI ra, fu heap o day khong co
IIon ho g voI fu heap dung frong vIoc quan Iy bo nho dong.
8.8.2. Phut tren gu thuut Heap_sort
8.8.2.1. Phuong phup
CIaI fhuaf Heap_sort bao gom haI gIaI doan. au fIon, cac phan fu frong
danh sach duoc sap xop do fhoa you cau cua mof heap. Ko don chung fa Iap IaI
nhIou Ian vIoc Iay ra phan fu dau fIon cua heap va chon mof phan fu khac Ion
fhay fho no.

HInh 8.13- Max-hoap bIou dIon duoI dang cay va duoI dang danh sach IIon fuc.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 173
Trong gIaI doan fhu haI, chung fa nhan fhay rang goc cua cay |cung Ia phan fu
dau fIon cua danh sach hay Ia dInh cua heap) Ia phan fu co khoa Ion nhaf. Vj fr
dung cuoI cung cua phan fu nay Ia o cuoI danh sach. Nhu vay chung fa dI chuyon
phan fu nay vo cuoI danh sach, phan fu faI vj fr cuoI danh sach fh duoc chop
vao phan fu fam current do nhuong cho. Ko don chung fa gIam bIon
last_unsorted Ia ranh gIoI gIua phan danh sach chua duoc sap xop voI cac
phan fu da duoc dua vo vj fr dung |Qua frnh sap xop fIop fhoo so khong quan
fam don cac phan fu nam sau last_unsorted). Iuc nay, vj fr dau danh sach
chua sap xop duoc xom nhu frong, cac phan fu con IaI frong danh sach dou dang
fhoa dIou kIon cua heap. VIoc can Iam chnh Ia fm cho fhch hop do daf phan fu
dang chua fam frong current vao danh sach nay ma van duy fr fnh chaf cua
heap, fruoc khI chon ra phan fu Ion nhaf ko fIop. Ham phu fro insert_heap so
Iam dIou nay.

Nhu vay, fhoo gIaI fhuaf nay, Heap_sort can fruy xuaf ngau nhIon don cac
phan fu frong danh sach. Heap_sort chI fhch hop voI danh sach IIon fuc.
8.8.2.2. Chuong trInh chInh
Sau day Ia ham fhuc hIon gIaI fhuaf Heap_sort.

// anh cho danh sach IIon fuc frong chuong 4.

template <class Record>
void Sortable_list<Record>::heap_sort()
/*
post: Cac phan fu frong danh sach da duoc sap xop fhoo fhu fu khong gIam.
uses: build_heap va insert_heap.
*/
{
Record current;
int last_unsorted; // Cac phan fu nam sau last_unsorted da co fhu fu
build_heap(); // CIaI doan 1: fao heap fu danh sach cac phan fu.
for (last_unsorted = count - 1; last_unsorted > 0; last_unsorted--)
{
current = entry[last_unsorted];
entry[last_unsorted] = entry[0];// MoI Ian Iap chon duoc mof phan fu Ion nhaf.
insert_heap(current, 0, last_unsorted - 1); // KhoI phuc heap.
}
}
8.8.2.3. VI du

Truoc khI vIof cac ham do fao heap |build_heap) va dua phan fu vao heap
|insert_heap) chung fa xom xof mof so buoc dau fIon cua qua frnh sap xop
heap fron hnh.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 174


Trong buoc dau fIon, khoa Ion nhaf, y, duoc dI chuyon fu dau don cuoI danh
sach. Hnh vo dau fIon cho fhay kof qua cua vIoc dI chuyon, frong do y duoc fach
ra khoI cay va phan fu cuoI cung fruoc day, c, duoc dua vao phan fu fam curronf.
o fo chuc IaI cay, chung fa xom xof haI phan fu faI goc cua haI cay con. MoI
phan fu nay Ion hon faf ca cac phan fu khac frong cay con fuong ung. o do
chung fa chon phan fu Ion nhaf frong ba phan fu, haI phan fu goc cua haI cay con
va ban fhan c, Iam phan fu goc moI cua foan bo cay. Trong v du nay, chung fa so
dua phan fu r Ion goc va Iap IaI qua frnh cho haI cay con cua r. ToI day, chung fa
so dung f do fho cho cho r. TaI f, v f khong co nuf con cho non c so fho cho f va
qua frnh dung.

Chung fa fhay rang dIou kIon dung khI fm fhay cho frong fhch hop cho c
fhoa fnh chaf cua heap Ia: mof cho frong ma khong co nuf con, hoac mof cho
frong ma ca haI nuf con dou <= c.

TIop fhoo, chung fa IaI co fho fach phan fu Ion nhaf frong heap |phan fu dau
fIon) va Iap IaI foan bo qua frnh.

HInh 8.14 uoc fhu nhaf cua Heapsort.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 175

8.8.2.4. Hum nsert_heup
Tu nhung dIou frnh bay o fron fa co ham insert_heap nhu sau.

// anh cho danh sach IIon fuc frong chuong 4.

template <class Record>
void Sortable_list<Record>::insert_heap(const Record &current, int low, int
high)
/*
pre: Cac phan fu fu chI so low + 1 don high fhoa dIou kIon cua heap. low xom nhu vj fr
con frong |phan fu faI low so bj bo dI).
post: Phan fu frong current fhay fho cho phan fu faI low, va faf ca cac phan fu fu low don
high duoc faI sap xop do fhoa dIou kIon cua heap.
uses: Iop Record
*/
{
int large;
large = 2 * low + 1; // large Ia vj fr con fraI cua low.

while (large <= high) {
if (large < high && entry[large] < entry[large + 1])
large++;//large Ia vj fr cua con co khoa Ion nhaf frong 2 con cua phan fu faI low.


HInh 8. 15 Thoo vof cua Heap_sort
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 176
if (current >= entry[large])
break; // low chnh Ia vj fr co fho daf current vao..
else { // oI phan fu con Ion Iap cho frong.
entry[low] = entry[large];
low = large;
large = 2 * low + 1;
}
}
entry[low] = current;
}
8.8.2.5. Xuy dung heap bun duu

VIoc con IaI ma chung fa phaI Iam Ia xay dung heap ban dau fu danh sach co
fhu fu baf ky. Truoc fIon, fa Iuu y rang cay nhj phan co mof so nuf fu dong fhoa
dIou kIon cua heap do chung khong co nuf con. o chnh Ia cac nuf Ia frong cay.
o do chung fa khong can sap xop cac nuf Ia cua cay, fuc Ia nua sau cua danh
sach. Nou chung fa baf dau fu dIom gIua cua danh sach va duyof vo pha dau
danh sach fh co fho su dung ham insert_heap do dua Ian Iuof fung phan fu
vao frong heap, voI Iuu y su dung cac fhong so low va high fhch hop.

// anh cho danh sach IIon fuc frong chuong 4.

template <class Record>
void Sortable_list<Record>::build_heap()
/*
post: Cac phan fu frong danh sach duoc sap xop do fhoa dIou kIon cua heap.
uses: insert_heap.
*/
{
int low; // Cac phan fu fu low+1 don cuoI danh sach fhoa dIou kIon cua heap.
for (low = count / 2 - 1; low >= 0; low--) {
Record current = entry[low];
insert_heap(current, low, count - 1);
}
}
8.9. Rudx Sort
CuoI cung chung fa xom xof mof gIaI fhuaf sap fhu fu hoI dac bIof mof chuf, do
Ia gIaI fhuaf fhuong duoc dung cho cac phan fu co khoa Ia cac chuoI ky fu. CIaI
fhuaf radix_sort von duoc dua ra frong nhung ngay dau cua Ijch su may fnh do
su dung cho cac fho duc Io, nhung da duoc phaf frIon fhanh mof phuong phap sap
fhu fu raf hIou qua cho cac cau fruc du IIou co IIon kof . Y fuong duoc frnh bay
duoI day cung duoc xom nhu mof ung dung kha fhu vj cua hIon fhuc IIon kof cua
CTI hang doI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 177
8.9.1. Y tuong
Y fuong cua gIaI fhuaf Ia xof fung ky fu mof va chIa danh sach fhanh nhIou
danh sach con, so danh sach con phu fhuoc vao so ky fu khac nhau co frong khoa.
CIa su cac khoa Ia cac fu gom cac chu caI, fh chung fa chIa danh sach can sap
fhu fu ra 26 danh sach con faI moI buoc va phan phoI cac phan fu vao cac danh
sach con nay fuong ung voI mof frong cac ky fu co frong khoa.

o sap fhu fu cac fu, fruoc fIon nguoI fa fhuong chIa chung fhanh 26 danh
sach con fhoo ky fu dau fIon, sau do IaI chIa moI danh sach con fhanh 26 danh
sach con fhoo ky fu fhu haI, va cu fho fIop fuc. Nhu vay so danh sach con so fro
non qua Ion, chung fa kho nam gIu duoc. Y fuong duoI day nham franh so Iuong
danh sach con bung no qua Ion. Thay v Ian Iuof xof cac ky fu fu fraI qua phaI,
chung fa so xof fhoo fhu fu fu phaI qua fraI. Truoc fIon non chIa cac phan fu vao
cac danh sach con fhoo vj fr cua ky fu cuoI cua fu daI nhaf. Sau do cac danh sach
con nay IaI duoc noI IaI fhanh mof danh sach, fhu fu cac fu frong moI danh sach
con gIu nguyon, fhu fu noI cac danh sach con fuan fhoo fhu fu alphabet cua cac ky
fu faI vj fr vua xof. anh sach nay IaI duoc chIa fhoo vj fr ko fruoc vj fr vua
roI, roI IaI duoc noI IaI. Cu fho fIop fuc cho don khI danh sach duoc chIa fhoo vj
fr dau fIon cua cac chuoI ky fu va duoc noI IaI, chung fa so co mof danh sach cac
fu co fhu fu fhoo alphabet.

Qua frnh nay duoc mInh hoa qua vIoc sap fhu fu 9 fu co chIou daI foI da ba ky
fu frong hnh 8.16. Cof bon fraI cua hnh vo Ia fhu fu ban dau cua cac fu. Chung
duoc chIa fhanh 3 danh sach fuong ung voI 3 ky fu khac nhau o vj fr cuoI cung,
kof qua o cof fhu haI cua hnh vo, moI hnh khoI bIou dIon mof danh sach con.
Thu fu gIua cac fu frong mof danh sach con khong fhay doI so voI fhu fu gIua
chung frong danh sach Ion khI chua duoc chIa. TIop fhoo, cac danh sach con duoc
noI IaI va duoc chIa fhanh 2 danh sach con fuong ung 2 ky fu khac nhau o vj fr
ko cuoI |vj fr fhu haI cua fu) nhu cof fhu ba frong hnh. CuoI cung chung duoc noI
IaI va chIa fhanh 4 danh sach con fuong ung 4 ky fu khac nhau o vj fr dau cua
cac fu. KhI cac danh sach con duoc noI IaI fh chung fa co mof danh sach da co
fhu fu.

8.9.2. Hen thuc
Chung fa so hIon fhuc phuong phap nay frong C++ cho danh sach cac mau fIn
co khoa Ia cac chuoI ky fu. Sau moI Ian phan hoach fhanh cac danh sach con,
chung duoc noI IaI fhanh mof danh sach do sau do IaI duoc phan hoach fIop fuong
ung voI vj fr ko fruoc frong khoa. Chung fa su dung cac hang doI do chua cac
danh sach con, do frong gIaI fhuaf, khI phan hoach, cac phan fu Iuon duoc fhom
vao cuoI cac danh sach con va khI noI IaI fh cac phan fu IaI duoc Iay ra fu dau
cac danh sach con |IIIO).
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 178

Nou chung fa dung cac CTI hang va danh sach fong quaf co san do xu Iy, so
co mof so fhao fac dI chuyon cac phan fu khong can fhIof. Nguoc IaI, nou su dung
cau fruc IIon kof, co fho noI cac hang IIon kof fhanh mof danh sach kIon kof bang
cach noI rear cua hang nay vao front cua hang kIa, fh chuong frnh so hIou
qua hon raf nhIou. Qua frnh nay duoc mInh hoa frong hnh 8.17. Chuong frnh
radix_sort nhu vay can co fhom Iop dan xuaf fu Iop Queue co bo sung phuong
fhuc do noI cac hang IaI voI nhau, phan nay co fho xom nhu baI fap. Phan mInh
hoa fIop fhoo chung fa chI su dung Iop Queue don gIan co san.

Chung fa so dung mof mang co 28 hang doI do chua 28 danh sach con. Vj fr 0
fuong ung ky fu frong |khoang frang khong co ky fu), cac vj fr fu 1 don 26 fuong
ung cac ky fu chu caI |khong phan bIof chu hoa chu fhuong), con vj fr 27 fuong
ung moI ky fu con IaI |nou co) xuaf hIon frong khoa. VIoc xu Iy so duoc Iap IaI fu
ky fu cuoI don ky fu dau frong khoa, moI Ian Iap chung fa so duyof qua danh sach
IIon kof do fhom fung phan fu vao cuoI moI danh sach con fuong ung. Sau khI
danh sach da duoc phan hoach, chung fa noI cac danh sach con IaI fhanh mof
danh sach. CuoI vong Iap danh sach da co fhu fu.

Chung fa so hIon fhuc radix_sort nhu Ia mof phuong fhuc cua
Sortable_list.







HInh 8.16 TIon frnh cua radix_sort.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 179
// Co fho su dung cho baf ky hIon fhuc nao cua List.

template <class Record>
class Sortable_list: public List<Record> {
public: // Cac phuong fhuc sap fhu fu.
void radix_sort();

private: // Cac ham phu fro.
void rethread(Queue queues[]);
};

O day, Iop co so List co fho Ia baf ky hIon fhuc nao cua List frong chuong 4.
Ham phu fro rethread so duoc su dung do noI cac hang doI.



Chung fa so su dung cac phuong fhuc cua Iop Record, char key_letter(int
position) fra vo ky fu faI position cua khoa, hoac fra vo khoang frang nou
chIou daI cua khoa nho hon position. jnh nghIa Record nhu sau:



HInh 8.1? RadIx sorf IIon kof
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 180
class Record {
public:
char key_letter(int position) const;
Record(); // constructor mac djnh.
operator Key() const; // fra vo khoa cua phan fu.
// Cac phuong fhuc va cac fhuoc fnh khac cua Iop.
};
8.9.2.1. Phuong phup sup thu tu radix_sort

const int max_chars = 28;
template <class Record>
void Sortable_list<Record>::radix_sort()
/*
post: Cac phan fu cua danh sach da duoc sap fhoo fhu fu alphabet.
uses: Cac phuong fhuc cua cac Iop List, Queue, va Record;
functions position and rethread.
*/
{
Record data;
Queue queues[max_chars];
for (int position = key_size - 1; position >= 0; position--) {
// Iap fu vj fr cuoI don vj fr dau cac chuoI ky fu.
while (remove(0, data) == success) {
int queue_number = alphabetic_order(data.key_letter(position));
queues[queue_number].append(data); // ua vao hang fhch hop.
}
rethread(queues);// NoI cac danh sach con frong cac hang fhanh danh sach.
}
}
Ham nay su dung haI ham phu fro: alphabetic_order do xac djnh hang doI
fuong ung voI mof ky fu cho fruoc, va Sortable_list::rethread() do noI cac
hang. Chung fa co fho dung baf ky hIon fhuc nao cua hang fuong fhch voI dac fa
Queue fruu fuong frong chuong 3.
8.9.2.2. Chon mot queue
Ham ulphubetc_order Iay fhu fu cua mof ky fu cho fruoc frong bang chu
caI, voI quy uoc rang faf ca cac ky fu khong phaI Ia ky fu chu caI so co cung fhu
fu Ia 27, khoang frang co fhu fu 0. Ham khong phan bIof chu hoa va chu fhuong.

int alphabetic_order(char c)
/*
post: Tra vo fhu fu cua ky fu frong c fhoo fhu fu alphabet, hoac fra vo 0 nou c Ia khoang
frang.
*/
{
if (c == ' ') return 0;
if ('a' <= c && c <= 'z') return c - 'a' + 1;
if ('A' <= c && c <= 'Z') return c - 'A' + 1;
return 27;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 181
8.9.2.3. No cuc hung
Ham rethread noI 28 hang IaI fhanh mof Sortable_list. Ham cung Iam
rong faf ca cac hang nay do chung co fho duoc su dung frong Ian Iap sau cua gIaI
fhuaf. Ham nay co fho duoc vIof IaI fhoo cach phu fhuoc vao hIon fhuc cua cac
hang do gIaI fhuaf radix_sort co fho chay nhanh hon, chung fa xom nhu baI
fap.

template <class Record>
void Sortable_list<Record>::rethread(Queue queues[])
/*
post: MoI hang duoc noI IaI fhanh mof danh sach, cac hang fro fhanh rong.
uses: Cac phuong fhuc cua cac Iop List va Queue.
*/
{
Record data;
for (int i = 0; i < max_chars; i++)
while (!queues[i].empty()) {
queues[i].retrieve(data);
insert(size(), data);
queues[i].serve();
}
}

8.9.3. Phun tIch phuong phup radix_sort
Chu y rang fhoI gIan do chay radix_sort Ia (nk), n Ia so phan fu can sap
fhu fu va k Ia so ky fu co frong khoa. ThoI gIan can cho cac phuong phap sap fhu
fu khac cua chung fa phu fhuoc vao n va khong phu fhuoc fruc fIop vao chIou daI
cua khoa. ThoI gIan fof nhaf Ia doI voI merge_sort: nlgn + O(n).

HIou qua fuong doI cua cac phuong phap co IIon quan don kch fhuoc nk va n
lgn, co nghIa Ia, k va lgn. Nou cac khoa co chIou daI Ion va so phan fu can sap
fhu fu khong Ion |k Ion va Ig n fuong doI nho), fh cac phuong phap khac, fua nhu
merge_sort, so hIou qua hon radix_sort; nguoc IaI nou k nho |cac khoa ngan)
va so phan fu can sap fhu fu nhIou, fh radix_sort so nhanh hon moI phuong
phap sap fhu fu ma chung fa da bIof.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 8 Sap xep
Giao trnh Cau truc d lieu va Giai thuat 182

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 183
Chng 9 CAY NH| PHAN

So voI hIon fhuc IIon fuc cua cac cau fruc du IIou, cac danh sach IIon kof co
nhung uu dIom Ion vo fnh mom doo. Nhung chung cung co mof dIom you, do Ia su
fuan fu, chung duoc fo chuc fhoo cach ma vIoc dI chuyon fron chung chI co fho
qua fung phan fu mof. Trong chuong nay chung fa khac phuc nhuoc dIom nay
bang cach su dung cac cau fruc du IIou cay chua con fro. Cay duoc dung frong raf
nhIou ung dung, dac bIof frong vIoc fruy xuaf du IIou.
9.1. Cuc khu nem co bun ve cuy

Mof cuy |trcc) - hnh 9.1- gom mof fap huu han cac nut |noJc) va mof fap huu
han cac cunh |brancb) noI gIua cac nuf. Canh dI vao nuf goI Ia cunh vuo
|inJcgrcc), canh dI ra khoI nuf goI Ia cunh ru |outJcgrcc). So canh ra fu mof nuf
goI Ia buc |Jcgrcc) cua nuf do. Nou cay khong rong fh phaI co mof nuf goI Ia nut
goc |root), nut nuy khong co cunh vuo. Cay frong hnh 9.1 co M Ia nuf goc.
Cac nuf con IaI, moI nuf phaI co chInh xuc mot cunh vuo. Taf ca cac nuf dou co
fho co 0, 1, hoac nhIou hon so canh ra.









|a)
M
- A
- - N
- - C
- - - M | A | N C | ) ) O | Y | T X ) I S ) )
- |c)

- O
- - Y
- - - T
- - - X
- -
- - I
- - S
|b)
HInh 9.1 Cac cach bIou dIon cua cay

M
A
C N Y
D O
E L S
X T B
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 184
Nut lu |/caj) duoc djnh nghIa nhu Ia nuf cua cay ma so canh ra bang 0. Cac
nuf khong phaI nuf goc hoac nuf Ia fh duoc goI Ia nut trung gun hay nut
trong |intcrna/ noJc). Nuf co so canh ra khac 0 co fho goI Ia nut chu |parcnt)
cua cac nuf ma canh ra cua no dI vao, cac nuf nay cung duoc goI Ia cac nut con
|cbi/J) cua no. Cac nuf cung cha duoc goI Ia cac nut unh em |sib/ing) voI nhau.
Nuf fron nuf cha co fho goI Ia nut ong |granJparcnt, frong mof so baI foan
chung fa cung can goI fon nhu vay do frnh bay gIaI fhuaf).

Thoo hnh 9.1, cac nuf Ia gom: N, , , T, X, , I, S; cac nuf frung gIan gom:
A, C, O, Y. Nuf Y Ia cha cua haI nuf T va X. T va X Ia con cua Y, va Ia nuf anh
om voI nhau.

Ouong d |patb) fu nuf n
1
don nuf n
k
duoc djnh nghIa Ia mof day cac nuf n
1
,
n
2
, , n
k
sao cho n
I
Ia nuf cha cua nuf n
I+1
voI 1 I< k. Cheu du |/cngtb) duong
d nay Ia so canh fron no, do Ia k-1. MoI nuf co duong dI chIou daI bang 0 don
chnh no. Trong mof cay, fu nuf goc don moI nuf con IaI chI co duy nhaf mof
duong dI.

oI voI moI nuf n
I
, do suu |Jcptb) hay con goI Ia muc |/coc/) cua no chnh Ia
chIou daI duong dI duy nhaf fu nuf goc don no cong 1. Nuf goc co muc bang 1.
Cheu cuo |bcigbt) cuu nut n
I
Ia chIou daI cua duong dI daI nhaf fu no don mof
nuf Ia. MoI nuf Ia co chIou cao bang 1. Cheu cuo cuu cuy bang chIou cao cua
nuf goc. Oo suu cuu cuy bang do sau cua nuf Ia sau nhaf, no Iuon bang chIou cao
cua cay.

Nou gIua nuf n
1
va nuf n
2
co mof duong dI, fh n
1
duoc goI Ia nut truo c
|anccstor) cua n
2
va n
2
Ia nut suu |JcsccnJant) cua n
1
.

M Ia nuf fruoc cua nuf . M Ia nuf goc, co muc Ia 1. uong dI fu M don Ia:
M, A, C, , co chIou daI Ia 3. co muc Ia 4.

Ia nuf Ia, co chIou cao Ia 1. ChIou cao cua C Ia 2, cua A Ia 3, va cua M Ia 4
chnh bang chIou cao cua cay.

Mof cay co fho duoc chIa fhanh nhIou cay con |subtrcc). Mof cay con Ia baf ky
mof cau fruc cay bon duoI cua nuf goc. Nuf dau fIon cua cay con Ia nuf goc cua no
va doI khI nguoI fa dung fon cua nuf nay do goI cho cay con. Cay con goc A |hay
goI faf Ia cay con A) gom cac nuf A, N, C, . Mof cay con cung co fho chIa fhanh
nhIou cay con khac. KhaI nIom cay con dan don djnh nghIa do quy cho cay nhu
sau:


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 185
jnb ngba: Mof cay Ia fap cac nuf ma
- Ia fap rong, hoac
- co mof nuf goI Ia nuf goc co khong hoac nhIou cay con, cac cay con cung Ia cay
Cuc cuch beu den cuy
Thong fhuong co 3 cach bIou dIon cay: bIou dIon bang do fhj hnh 9.1a, bIou
dIon bang cach canh Io hnh 9.1b, va bIou dIon bang bIou fhuc co dau ngoac
hnh 9.1c.
9.2. Cuy nh{ phun
9.2.1. Cuc d{nh nghIu
jnb ngba: Mof cay nhj phan hoac Ia mof cay rong, hoac bao gom mof nuf goI Ia
nuf goc |root) va haI cay nhj phan duoc goI Ia cay con bon fraI va cay con bon
phaI cua nuf goc.

Iuu y rang djnh nghIa nay Ia djnh nghIa foan hoc cho mof cau fruc cay. o
dac fa cay nhj phan nhu mof kIou du IIou fruu fuong, chung fa can chI ra cac fac
vu co fho fhuc hIon fron cay nhj phan. Cac phuong fhuc co ban cua mof cay nhj
phan fong quaf chung fa ban don co fho Ia fao cay, gIaI phong cay, kIom fra cay
rong, duyof cay,

jnh nghIa nay khong quan fam don cach hIon fhuc cua cay nhj phan frong bo
nho. Chung fa so fhay ngay rang mof bIou dIon IIon kof Ia fu nhIon va do su
dung, nhung cac hIon fhuc khac nhu mang IIon fuc cung co fho fhch hop. jnh
nghIa nay cung khong quan fam don cac khoa hoac cach ma chung duoc sap fhu
fu. Cay nhj phan duoc dung cho nhIou muc dch khac hon Ia chI co fm kIom fruy
xuaf, do do chung fa can gIu mof djnh nghIa fong quaf.

Truoc khI xom xof xa hon vo cac dac fnh chung cua cay nhj phan, chung fa
hay quay vo djnh nghIa fong quaf va nhn xom ban chaf do quy cua no fho hIon
nhu fho nao frong cau fruc cua mof cay nhj phan nho.

Truong hop fhu nhaf, mof fruong hop co ban khong IIon quan don do quy, do
Ia mof cay nhj phan rong.

Cach duy nhaf do xay dung mof cay nhj phan co mof nuf Ia cho nuf do Ia goc
va cho haI cay con fraI va phaI Ia haI cay rong.

VoI cay co haI nuf, mof frong haI so Ia goc va nuf con IaI so fhuoc cay con.
Hoac cay con fraI hoac cay con phaI Ia cay rong, va cay con IaI chua chnh xac chI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 186
mof nuf. Nhu vay co haI cay nhj phan khac nhau co haI nuf. HaI cay nhj phan co
haI nuf co fho duoc vo nhu sau:


va


va day Ia haI cay khac nhau. Chung fa so khong bao gIo vo baf ky mof phan nao
cua mof cay nhj phan nhu sau:





do chung fa so khong fho noI duoc nuf bon duoI Ia con fraI hay con phaI cua nuf
fron.

oI voI fruong hop cay nhj phan co ba nuf, mof frong chung so Ia goc, va haI
nuf con IaI co fho duoc chIa gIua cay con fraI va cay con phaI fhoo mof frong cac
cach sau:
2 + 0 1 + 1 0 + 2

o co fho co haI cay nhj phan co haI nuf va chI co mof cay rong, fruong hop
fhu nhaf fron cho ra haI cay nhj phan. Truong hop fhu ba, fuong fu, cho fhom haI
cay khac. Truong hop gIua, cay con fraI va cay con phaI moI cay chI co mof nuf,
va chI co duy nhaf mof cay nhj phan co mof nuf non fruong hop nay chI co mof
cay nhj phan. Taf ca chung fa co nam cay nhj phan co ba nuf:









HInh 9.2- Cac cay nhj phan co ba nuf

Cac buoc do xay dung cay nay Ia mof dIon hnh cho cac fruong hop Ion hon.
Chung fa baf dau fu goc cua cay va xom cac nuf con IaI nhu Ia cac cach phan chIa
gIua cay con fraI va cay con phaI. Cay con fraI va cay con phaI Iuc nay so Ia cac
fruong hop nho hon ma chung fa da bIof.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 187
CoI N Ia so nuf cua cay nhj phan, H Ia chIou cao cua cay fh,

H
max
= N, H
mIn
= Iog
2
N +1
N
mIn
= H, N
max
= 2
H
-1

Khoang cach fu mof nuf don nuf goc xac djnh chI ph can do djnh vj no.
Chang han mof nuf co do sau Ia 5 fh chu ng fa phaI dI fu nuf goc va qua 5 canh
fron duong dI fu goc don no do fm don no. o do, nou cay cang fhap fh vIoc fm
don cac nuf so cang nhanh. Iou nay dan don fnh chaf can bang cua cay nhj
phan. Ho so can bang cua cay |ba/ancc jactor) Ia su chonh Ioch gIua chIou cao cua
haI cay con fraI va phaI cua no:
= H
I
-H
R

Mof cuy cun bung khI ho so nay bang 0 va cac cay con cua no cung can bang.
Mof cay nhj phan can bang voI chIou cao cho fruoc so co so nuf Ia Ion nhaf co
fho. Nguoc IaI, voI so nuf cho fruoc cay nhj phan can bang co chIou cao nho nhaf.
Thong fhuong dIou nay raf kho xay ra non djnh nghIa co fho noI Iong hon voI cac
frj = 1, 0, hoac 1 fhay v chI Ia 0. Chung fa so hoc ky hon vo cay can bang
AVI frong phan sau.

Mof cuy nh{ phun duy du |comp/ctc trcc) Ia cay co duoc so nuf foI da voI
chIou cao cua no. o cung chnh Ia cay co =0 voI moI nuf. Thuaf ngu cuy nh{
phun gun nhu duy du cung duoc dung cho fruong hop cay co duoc chIou cao foI
fhIou cua no va moI nuf o muc Ion nhaf don hof vo bon fraI.
Hnh 9.3 bIou dIon cay nhj phan day du co 31 nuf. CIa su IoaI dI cac nuf 19, 21,
23, 25, 27, 29, 31 fa co mof cay nhj phan gan nhu day du.
9.2.2. Ouyet cuy nh{ phun
Mof frong cac fac vu quan frong nhaf duoc fhuc hIon fron cay nhj phan Ia
duyof cay |traocrsa/). Mot phep duyet cuy lu mot su d chuyen quu khup
cuc nut cuu cuy theo mot thu tu d{nh truoc, mo nut ch duoc xu ly mot

HInh 9.3 Cay nhj phan day du voI 31 nuf.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 188
lun duy nhut. Cung nhu phop duyof fron cac cau fruc du IIou khac, hanh dong
ma chung fa can Iam khI gho qua mof nuf so phu fhuoc vao ung dung.

oI voI cac danh sach, cac nuf nam fhoo mof fhu fu fu nhIon fu nuf dau don
nuf cuoI, va phop duyof cung fhoo fhu fu nay. Tuy nhIon, doI voI cac cay, co raf
nhIou fhu fu khac nhau do duyof qua cac nuf.

Co 2 cach fIop can chnh khI duyof cay: duyof fhoo chIou sau va duyof fhoo
chIou rong.

uyof fhoo chIou sau |Jcjtb-jirst traocrsa/): moI nuf sau cua mof nuf con duoc
duyof fruoc khI sang mof nuf con khac.

uyof fhoo chIou rong |brcaJtb-jirst traocrsa/): moI nuf frong cung mof muc duoc
duyof fruoc khI sang muc khac.
9.2.2.1. Ouyet theo cheu suu
TaI mof nuf cho fruoc, co ba vIoc ma chung fa muon Iam: gho nuf nay, duyof
cay con bon fraI, duyof cay con bon phaI. Su khac nhau gIua cac phuong an duyof
Ia chung fa quyof djnh gho nuf do fruoc hoac sau khI duyof haI cay con, hoac gIua
khI duyof haI cay con.

Nou chung fa goI cong vIoc gho mof nuf Ia V, duyof cay con fraI Ia I, duyof
cay con phaI Ia R, fh co don sau cach kof hop gIua chung:

VIR IVR IRV VRI RVI RIV.

Cuc thu tu duyet cuy chuun

Thoo quy uoc chuan, sau cach duyof fron gIam xuong chI con ba boI chung fa
chI xom xof cac cach ma frong do cay con fraI duoc duyof fruoc cay con phaI. a
cach con IaI ro rang Ia fuong fu v chung chnh Ia nhung fhu fu nguoc cua ba cach
chuan. Cac cach chuan nay duoc daf fon nhu sau:

VIR IVR IRV
prcorJcr inorJcr postorJcr

Cac fon nay duoc chon fuong ung voI buoc ma nuf da cho duoc gho don. Trong
phop duyof prcorJcr, nuf duoc gho fruoc cac cay con; frong phop duyof inorJcr, no
duoc gho don gIua khI duyof haI cay con; va frong phop duyof postorJcr, goc cua
cay duoc gho sau haI cay con cua no.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 189
Phop duyof inorJcr doI khI con duoc goI Ia phop duyof doI xung |symmctric
orJcr), va postorJcr duoc goI Ia cnJorJcr.

Cuc vI du don gun

Trong v du fhu nhaf, chung fa hay xof cay nhj phan sau:






VoI phop duyof prcorJcr, goc cay mang nhan 1 duoc gho dau fIon, sau do phop
duyof dI chuyon sang cay con fraI. Cay con fraI chI chua mof nuf co nhan Ia 2,
nuf nay duoc duyof fhu haI. Sau do phop duyof chuyon sang cay con phaI cua nu f
goc, cuoI cung Ia nuf mang nhan 3 duoc gho. Vay phop duyof proordor so gho cac
nuf fhoo fhu fu 1, 2, 3.

Truoc khI goc cua cay duoc gho fhoo fhu fu inorJcr, chung fa phaI duyof cay
con fraI cua no fruoc. o do nuf mang nhan 2 duoc gho dau fIon. o Ia nuf duy
nhaf frong cay con fraI. Sau do phop duyof chuyon don nuf goc mang nhan 1, va
cuoI cung duyof qua cay con phaI. Vay phop duyof Inordor so gho cac nuf fhoo fhu
fu 2, 1, 3.

VoI phop duyof postorJcr, chung fa phaI duyof cac haI cay con fraI va phaI
fruoc khI gho nuf goc. Truoc fIon chung fa dI don cay con bon fraI chI co mof nuf
mang nhan 2, va no duoc gho dau fIon. TIop fhoo, chung fa duyof qua cay con
phaI, gho nuf 3, va cuoI cung chung fa gho nuf 1. Phop duyof postorJcr duyof cac
nuf fhoo fhu fu 2, 3, 1.

V du fhu haI phuc fap hon, chung fa hay xom xof cay nhj phan duoI day:











1
2 3
1
2
3
4
5
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 190
Tuong fu cach Iam fron chung fa co phop duyof prcorJcr so gho cac nuf fhoo
fhu fu 1, 2, 3, 4, 5. Phop duyof inorJcr so gho cac nuf fhoo fhu fu 1, 4, 3, 5, 2.
Phop duyof postorJcr so gho cac nuf fhoo fhu fu 4, 5, 3, 2, 1.

Cuy beu thuc

Cach chon cac fon prcorJcr, inorJcr, va postorJcr cho ba phop duyof cay fron
khong phaI Ia fnh co, no IIon quan chaf cho don mof frong nhung ung dung, do
Ia cac cay bIou fhuc.

Mof cay bIou fhuc |cxprcssion trcc) duoc fao non fu cac foan hang don gIan va
cac foan fu |so hoc hoac Iuan Iy) cua bIou fhuc bang cach fhay fho cac foan hang
don gIan bang cac nuf Ia cua mof cay nhj phan va cac foan fu bang cac nuf bon
frong cay. oI voI moI foan fu haI ngoI, cay con fraI chua moI foan hang va moI
foan fu fhuoc foan hang bon fraI cua foan fu do, va cay con phaI chua moI foan
hang va moI foan fu fhuoc foan hang bon phaI cua no.

oI voI foan fu mof ngoI, mof frong haI cay con so rong. Chung fa fhuong vIof
mof vaI foan fu mof ngoI pha bon fraI cua foan hang cua chung, chang han dau
fru |phop Iay so am) hoac cac ham chuan nhu Iog|) va cos|). Cac foan fu mof ngoI
khac duoc vIof bon phaI cua foan hang, chang han ham gIaI fhua |)! hoac ham
bnh phuong |)
2
. oI khI ca haI pha dou hop Io, nhu phop Iay dao ham co fho vIof
J1Jx pha bon fraI, hoac |) pha bon phaI, hoac foan fu fang ++ co anh huong

HInh 9.4 Cay bIou fhuc
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 191
khac nhau khI nam bon fraI hoac nam bon phaI. Nou foan fu duoc ghI bon fraI,
fh frong cay bIou fhuc no so co cay con fraI rong, nhu vay foan hang so xuaf hIon
bon phaI cua no frong cay. Nguoc IaI, nou foan fu xuaf hIon bon phaI, fh cay con
phaI cua no so rong, va foan hang so Ia cay con fraI cua no.

Mof so cay bIou fhuc cua mof vaI bIou fhuc don gIan duoc mInh hoa frong hnh
9.4. Hnh 9.5 bIou dIon mof cong fhuc bac haI phuc fap hon. a fhu fu duyof cay
chuan cho cay bIou fhuc nay IIof ko frong hnh 9.6.
Cac fon cua cac phop duyof IIon quan don cac dang aIan cua bIou fhuc: duyof
cay bIou fhuc fhoo prcorJcr Ia dang prcjix, frong do moI foan fu nam fruoc cac
foan hang cua no; duyof cay bIou fhuc fhoo inorJcr Ia dang injix |cach vIof bIou
fhuc quon fhuoc cua chung fa); duyof cay bIou fhuc fhoo postorJcr Ia dang postjix,
moI foan hang nam fruoc foan fu cua chung. Nhu vay cac cay con fraI va cay con
phaI cua moI nuf Iuon Ia cac foan hang cua no, va vj fr fuong doI cua mof foan fu
so voI cac foan hang cua no frong ba dang aIan hoan foan gIong voI fhu fu fuong
doI cua cac Ian gho cac fhanh phan nay fhoo mof frong ba phop duyof cay bIou
fhuc.

HInh 9.5 Cay bIou fhuc cho cong fhuc bac haI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 192

Cuy so sunh

Chung fa hay xom IaI v du frong hnh 9.7 va ghI IaI kof qua cua ba phop
duyof cay chuan nhu sau:

prcorJcr. JIm of Amy Ann Cuy va Jan Ron Kay Jon KIm TIm Roy Tom
inorJcr: Amy Ann of va Cuy Jan JIm Jon Kay KIm Ron Roy TIm Tom
postorJcr:Ann Amy va Jan Cuy of Jon KIm Kay Roy Tom TIm Ron JIm

Phop duyof inorJcr cho cac fon co fhu fu fhoo aIphabof. Cach fao mof cay so
sanh nhu hnh 9.7 nhu sau: dI chuyon sang fraI khI khoa cua nuf can fhom nho
hon khoa cua nuf dang xof, nguoc IaI fh dI chuyon sang phaI. Nhu vay cay nhj
phan fron da duoc xay dung sao cho moI nuf frong cay con fraI cua moI nuf co fhu
fu nho hon fhu fu cua no, va moI nuf frong cay con phaI co fhu fu Ion hon no. o
doI voI moI nuf, phop duyof inorJcr so duyof qua cac nuf frong cay con fraI fruoc,
roI don chnh no, va cuoI cung Ia cac nuf frong cay con phaI, non chung fa co duoc
cac nuf fhoo fhu fu.


HInh 9.6 Cac fhu fu duyof cho cay bIou fhuc

HInh 9.? Cay so sanh do fm nhj phan
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 193
Trong phan sau chung fa so fm hIou cac cay nhj phan voI dac fnh fron,
chung con duoc goI Ia cac cay nhj phan fm kIom |binary scarcb trcc), do chung
raf co ch va hIou qua cho you cau fm kIom.
9.2.2.2. Ouyet theo cheu rong

Thu fu duyof cay fhoo chIou rong Ia fhu fu duyof hof muc nay don muc kIa, co
fho fu muc cao don muc fhap hoac nguoc IaI. Trong moI muc co fho duyof fu fraI
sang phaI hoac fu phaI sang fraI. V du cay frong hnh 9.7 nou duyof fhoo chIou
rong fu muc fhap don muc cao, frong moI muc duyof fu fraI sang phaI, fa co: JIm,
of, Ron, Amy, Cuy, Kay, TIm, Ann, va, Jan, Jon, KIm, Roy, Tom.
9.2.3. Hen thuc len ket cuu cuy nh{ phun
Chung fa hay xom xof cach bIou dIon cua cac nuf do xay dung non cay.
9.2.3.1. Cuu truc co bun cho mot nut trong cuy nh{ phun

MoI nuf cua mof cay nhj phan |cung Ia goc cua mof cay con nao do) co haI cay
con fraI va phaI. Cac cay con nay co fho duoc xac djnh fhong qua cac con fro chI
don cac nuf goc cua no. Chung fa co dac fa sau:

template <class Entry>
struct Binary_node {
// Cac fhanh phan.
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
HInh 9.8 Cay nhj phan IIon kof
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 194
// constructors:
Binary_node();
Binary_node(const Entry &x);
};

Binary_node chua haI constructor dou khoI gan cac fhuoc fnh con fro Ia NULL
moI khI doI fuong duoc fao ra.

Trong hnh 9.8, chung fa fhay nhung fham chIou NULL, fuy nhIon chung fa co
fho quy uoc rang cac cay con rong va cac canh don no co fho bo qua khong can
hIon fhj khI vo cay.
9.2.3.2. Ouc tu cuy nh{ phun
Mof cay nhj phan co mof hIon fhuc fu nhIon frong vung nho IIon kof. Cung
nhu cac cau fruc IIon kof, chung fa so cap phaf dong cac nuf, noI kof chung IaI voI
nhau. Chung fa chI can mof con fro chI don nuf goc cua cay.

template <class Entry>
class Binary_tree {
public:
Binary_tree();
bool empty() const;
void preorder(void (*visit)(Entry &));
void inorder(void (*visit)(Entry &));
void postorder(void (*visit)(Entry &));

int size() const;
void clear();
int height() const;
void insert(const Entry &);

Binary_tree (const Binary_tree<Entry> &original);
Binary_tree & operator =(const Binary_tree<Entry> &original);
~Binary_tree();

protected:
// Cac ham do quy phu fro:
void recursive_inorder(Binary_node<Entry>*sub_root,
void (*visit)(Entry &))
void recursive_preorder(Binary_node<Entry>*sub_root,
void (*visit)(Entry &))
void recursive_postorder(Binary_node<Entry>*sub_root,
void (*visit)(Entry &))

Binary_node<Entry> *root;
};

VoI con fro root, co fho do dang nhan ra mof cay nhj phan rong boI bIou fhuc

root == NULL;

va khI fao mof cay nhj phan moI chung fa chI can gan root bang NULL.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 195
template <class Entry>
Binary_tree<Entry>::Binary_tree()
/*
post: Cay nhj phan rong duoc fao ra.
*/
{
root = NULL;
}

Phuong fhuc empty kIom fra xom mof cay nhj phan co rong hay khong:

template <class Entry>
bool Binary_tree<Entry>::empty() const
/*
post: Tra vo true nou cay rong, nguoc IaI fra vo false.
*/
{
return root == NULL;
}
9.2.3.3. Ouyet cuy

ay gIo chung fa so xay dung cac phuong fhuc duyof mof cay nhj phan IIon kof
fhoo ca ba phop duyof co ban. Cung nhu fruoc kIa, chung fa so gIa su nhu chung
fa da co ham visit do fhuc hIon mof cong vIoc mong muon nao do cho moI nuf
cua cay. Va nhu cac ham duyof cho nhung cau fruc du IIou khac, con fro ham
visit so Ia mof fhong so hnh fhuc cua cac ham duyof cay.

Trong cac ham duyof cay, chung fa can gho don nuf goc va duyof cac cay con
cua no. o quy so Iam cho vIoc duyof cac cay con fro non hof suc do dang. Cac cay
con duoc fm fhay nho cac con fro frong nuf goc, do do cac con fro nay can duoc
chuyon cho cac Ian goI do quy. MoI phuong fhuc duyof can goI ham do quy co mof
fhong so con fro. Chang han, phuong fhuc duyof inorJcr duoc vIof nhu sau:

template <class Entry>
void Binary_tree<Entry>::inorder(void (*visit)(Entry &))
/*
post: Cay duoc duyof fhoo fhu fu inorJcr
uses: Ham recursive_inorder
*/
{
recursive_inorder(root, visit);
}

Mof cach fong quaf, chung fa nhan fhay mof cach fong quaf rang baf ky
phuong fhuc nao cua Binary_froo ma ban chaf Ia mof qua frnh do quy cung duoc
hIon fhuc bang cach goI mof ham do quy phu fro co fhong so Ia goc cua cay. Ham
duyof inorJcr phu fro duoc hIon fhuc bang cach goI do quy don gIan nhu sau:

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 196
template <class Entry>
void Binary_tree<Entry>::recursive_inorder(Binary_node<Entry>*sub_root, void
(*visit)(Entry &))
/*
pre: sub_root hoac Ia NULL hoac chI don goc cua mof cay con.
post: Cay con duoc duyof fhoo fhu fu inorJcr.
uses: Ham recursive_inorder duoc goI do quy.
*/
{
if (sub_root != NULL) {
recursive_inorder(sub_root->left, visit);
(*visit)(sub_root->data);
recursive_inorder(sub_root->right, visit);
}
}

Cac phuong fhuc duyof khac cung duoc xay dung mof cach fuong fu bang cach
goI cac ham do quy phu fro. cac ham do quy phu fro co hIon fhuc nhu sau:

template <class Entry>
void Binary_tree<Entry>::recursive_preorder(Binary_node<Entry> *sub_root,
void (*visit)(Entry &))
/*
pre: sub_root hoac Ia NULL hoac chI don goc cua mof cay con.
post: Cay con duoc duyof fhoo fhu fu prcorJcr.
uses: Ham recursive_inorder duoc goI do quy.
*/
{
if (sub_root != NULL) {
(*visit)(sub_root->data);
recursive_preorder(sub_root->left, visit);
recursive_preorder(sub_root->right, visit);
}
}

template <class Entry>
void Binary_tree<Entry>::recursive_postorder(Binary_node<Entry> *sub_root,
void (*visit)(Entry &))
/*
pre: sub_root hoac Ia NULL hoac chI don goc cua mof cay con.
post: Cay con duoc duyof fhoo fhu fu postorJcr.
uses: Ham recursive_inorder duoc goI do quy.
*/
{
if (sub_root != NULL) {
recursive_postorder(sub_root->left, visit);
recursive_postorder(sub_root->right, visit);
(*visit)(sub_root->data);
}
}

Chuong frnh duyof cay fhoo chIou rong Iuon phaI su dung don CTI hang
doI. Nou duyof fhoo fhu fu fu muc fhap don muc cao, moI muc duyof fu fraI sang
phaI, fruoc fIon nuf goc duoc dua vao hang doI. Cong vIoc duoc Iap cho don khI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 197
hang doI rong: Iay mof nuf ra khoI hang doI, xu Iy cho no, dua cac nuf con cua no
vao hang doI |fhoo dung fhu fu fu fraI sang phaI). Cac bIon fho khac cua phop
duyof cay fhoo chIou rong cung vo cung don gIan, sInh vIon co fho fu suy nghI
fhom.

Chung fa do phan hIon fhuc cac phuong fhuc cua cay nhj phan nhu height,
size, va clear nhu Ia baI fap. Cac phuong fhuc nay cung duoc hIon fhuc do
dang bang cach goI cac ham do quy phu fro. Trong phan baI fap chung fa cung so
vIof phuong fhuc insert do fhom cac phan fu vao cay nhj phan, phuong fhuc
nay can do fao mof cay nhj phan, sau do, kof hop voI cac phuong fhuc nou fron,
chung fa so kIom fra Iop Binary_tree ma chung fa xay dung duoc.

Trong phan sau cua chuong nay, chung fa so xay dung cac Iop dan xuaf fu cay
nhj phan co nhIou dac fnh va huu ch hon |cac Iop dan xuaf nay so co cac phuong
fhuc fhom hoac IoaI phan fu frong cay fhch hop voI dac fnh cua fung IoaI cay).
Con hIon faI fh chung fa khong non fhom nhung phuong fhuc nhu vay vao cay
nhj phan co ban.

Mac du Iop Binary_tree cua chung fa xuaf hIon chI nhu Ia mof Iop vo ma cac
phuong fhuc cua no dou day cac cong vIoc can Iam don cho cac ham phu fro, ban
fhan no IaI mang mof y nghIa quan frong. Iop nay fap frung vao no nhIou ham
khac nhau va cung cap mof gIao dIon fhuan fIon fuong fu cac kIou du IIou fruu
fuong khac. Hon nua, chnh Iop moI co fho cung cap fnh dong kn: khong co no
fh cac du IIou frong cay khong duoc bao vo mof cach an foan va do dang bj fham
nhap va sua doI ngoaI y muon. CuoI cung, chung fa co fho fhay Iop Binary_tree
con Iam mof Iop co so cho cac Iop khac dan xuaf fu no huu ch hon.
9.3. Cuy nh{ phun tIm kem
Chung fa hay xom xof van do fm kIom mof khoa frong mof danh sach IIon
kof. Khong co cach nao khac ngoaI cach dI chuyon fron danh sach moI Ian mof
phan fu, va do do vIoc fm kIom fron danh sach IIon kof Iuon Ia fm fuan fu. VIoc
fm kIom so fro non nhanh hon nhIou nou chung fa su dung danh sach IIon fuc va
fm nhj phan. Tuy nhIon, danh sach IIon fuc IaI khong phu hop voI su bIon dong
du IIou. CIa su chung fa cung can fhay doI danh sach fhuong xuyon, fhom cac
phan fu moI hoac IoaI cac phan fu hIon co. Nhu vay danh sach IIon fuc so cha m
hon nhIou so voI danh sach IIon kof, do vIoc fhom va IoaI phan fu frong danh
sach IIon fuc moI Ian dou doI hoI phaI dI chuyon nhIou phan fu sang cac vj fr
khac. Trong danh sach IIon kof chI can fhay doI mof vaI con fro ma fhoI.

Van do chu chof frong phan nay chnh Ia:
Licu cbung ta co tbc tm mot bicn tbuc cbo cac Janb sacb co tbu tu ma trong
Jo cbung ta co tbc tm kicm, boac tbcm bot pban tu Jcu rat nbanb:
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 198
Cay nhj phan cho mof IoI gIaI fof cho van do nay. ang cach daf cac entry
cua mof danh sach co fhu fu vao frong cac nuf cua mof cay nhj phan, chung fa so
fhay rang chung fa co fho fm mof khoa cho fruoc qua O|Iog n) buoc, gIong nhu
fm nhj phan, dong fhoI chung fa cung co gIaI fhuaf fhom va IoaI phan fu frong
O|Iog n) fhoI gIan.

jnb ngba: Mof cay nhj phan fm kIom |binary scarcb trcc -ST) Ia mof cay
hoac rong hoac frong do moI nuf co mof khoa |nam frong phan du IIou cua no)
va fhoa cac dIou kIon sau:
1. Khoa cua nuf goc Ion hon khoa cua baf ky nuf nao frong cay con fraI cua no.
2. Khoa cua nuf goc nho hon khoa cua baf ky nuf nao frong cay con phaI cua no.
3. Cay con fraI va cay con phaI cua goc cung Ia cac cay nhj phan fm kIom.

HaI dac fnh dau fIon mo fa fhu fu IIon quan don khoa cua nuf goc, dac fnh
fhu ba mo rong chung don moI nuf frong cay; do do chung fa co fho fIop fuc su
dung cau fruc do quy cua cay nhj phan. Chung fa da vIof djnh nghIa nay fhoo
cach ma no bao dam rang khong co haI phan fu frong mof cay nhj phan fm kIom
co cung khoa, do cac khoa frong cay con fraI chnh xac Ia nho hon khoa cua goc,
va cac khoa cua cay con phaI cung chnh xac Ia Ion hon khoa cua goc. Chung fa co
fho fhay doI djnh nghIa do cho phop cac phan fu frung khoa. Tuy nhIon frong
phan nay chung fa co fho gIa su rang:

Kbong co bai pban tu trong mot cay nbj pban tm kicm co trung kboa.

Cac cay nhj phan frong hnh 9.7 va 9.8 Ia cac cay nhj phan fm kIom, do quyof
djnh dI chuyon sang fraI hoac phaI faI moI nuf dua fron cach so sanh cac khoa
frong djnh nghIa cua mof cay fm kIom.

9.3.1. Cuc dunh such co thu tu vu cuc cuch hen thuc
a don Iuc baf dau xay dung cac phuong fhuc C++ do xu Iy cho cay nhj phan
fm kIom, chung fa non Iuu y rang co f nhaf Ia ba quan dIom khac nhau duoI day:

Chung fa co fho xom cay nhj phan fm kIom nhu mof kIou du IIou fruu fuong
moI voI djnh nghIa va cac phuong fhuc cua no;
o cay nhj phan fm kIom Ia mof dang dac bIof cua cay nhj phan, chung fa co
fho xom cac phuong fhuc cua no nhu cac dang dac bIof cua cac phuong fhuc cua
cay nhj phan;
o cac phan fu frong cay nhj phan fm kIom co chua cac khoa, va do chung
duoc gan du IIou do fruy xuaf fhong fIn fhoo cach fuong fu nhu cac danh sach
co fhu fu, chung fa co fho nghIon cuu cay nhj phan fm kIom nhu Ia mof hIon
fhuc moI cua kIou du IIou fruu fuong danh sach co fhu fu |orJcrcJ /ist ADT).
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 199
Trong fhuc fo, doI khI cac Iap frnh vIon chI fap frung vao mof frong ba quan
dIom fron, va chung fa cung so nhu fho. Chung fa so dac fa Iop cay nhj phan fm
kIom dan xuaf fu cay nhj phan. Nhu vay, Iop cay nhj phan cua chung fa IaI bIo u
dIon cho mof kIou du IIou fruu fuong khac. Tuy nhIon, Iop moI so fhua ko cac
phuong fhuc cua Iop cay nhj phan fruoc kIa. ang cach nay, su su dung Iop fhua
ko nhan manh vao haI quan dIom fron. Quan dIom fhu ba fhuong duoc nhn fhay
frong cac ung dung cua cay nhj phan fm kIom. Chuong frnh cua nguoI su dung
co fho dung Iop cua chung fa do gIaI quyof cac baI foan sap fhu fu va fm kIom
IIon quan don danh sach co fhu fu.

Chung fa da dua ra nhung khaI bao C++ cho phop xu Iy cho cay nhj phan.
Chung fa so su dung hIon fhuc nay cua cay nhj phan Iam co so cho Iop cay nhj
phan fm kIom.

template <class Record>
class Search_tree: public Binary_tree<Record> {
public:
Error_code insert(const Record &new_data);
Error_code remove(const Record &old_data);
Error_code tree_search(Record &target) const;
private: // Cac ham do quy phu fro.
};

o Iop cay nhj phan fm kIom fhua ko fu Iop nhj phan, chung fa co fho dung
IaI cac phuong fhuc da djnh nghIa fron cay nhj phan fong quaf cho cay nhj phan
fm kIom. Cac phuong fhuc nay Ia constructor, destructor, clear, empty,
size, height, va cac phuong fhuc duyof preorder, inorder, postorder. o
fhom vao cac phuong fhuc nay, mof cay nhj phan fm kIom can fhom cac phuong
fhuc chuyon bIof hoa nhu insert, remove, va tree_search.

9.3.2. TIm kem tren cuy
Phuong fhuc moI quan frong dau fIon cua cay nhj phan fm kIom Ia: fm mof
phan fu voI mof khoa cho fruoc frong cay nhj phan fm kIom IIon kof. ac fa cua
phuong fhuc nhu sau:

Error_code Search_tree<Record> :: tree_search (Record &target) const;
post: Nou co mof phan fu co khoa frung voI khoa frong target, fh target duoc chop do boI
phan fu nay, phuong fhuc fra vo success; nguoc IaI phuong fhuc fra vo not_present.

O day chung fa dung Iop Record nhu da mo fa frong chuong ?. NgoaI fhuoc
fnh fhuoc Iop Key danh cho khoa, frong Record co fho con nhIou fhanh phan du
IIou khac. Trong cac ung dung, phuong fhuc nay fhuong duoc goI voI fhong so
target chI chua frj cua fhanh phan khoa. Nou fm fhay khoa can fm, phuong
fhuc so bo sung cac du IIou day du vao cac fhanh phan khac con IaI cua Record.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 200
9.3.2.1. Chen luoc
o fm mof khoa, fruoc fIon chung fa so sanh no voI khoa cua nuf goc frong
cay. Nou so frung, gIaI fhuaf dung. Nguoc IaI, chung fa dI sang cay con fraI hoac
cay con phaI va Iap IaI vIoc fm kIom frong cay con nay.

V du, chung fa can fm fon KIm frong cay nhj phan fm kIom hnh 9.7 va 9.8.
Chung fa so sanh KIm voI phan fu faI nuf goc, JIm. o KIm Ion hon JIm fhoo fhu
fu a/pbabct, chung fa dI sang phaI va fIop fuc so sanh KIm voI Ron. o KIm nho
hon Jon, chung fa dI chuyon sang fraI, so sanh KIm voI Kay. Chung fa IaI dI
chuyon sang phaI va gap duoc phan fu can fm.

ay ro rang Ia mof qua frnh do quy, cho non chung fa so hIon fhuc phuong
fhuc nay bang cach goI mof ham do quy phu fro. IIou dIou kIon dung cua vIoc fm
kIom do quy Ia g7 Ro rang Ia, nou chung fa fm fhay phan fu can fm, ham so ko f
fhuc fhanh cong. Nou khong, chung fa so cu fIop fuc fm cho don khI gap mof cay
rong, frong fruong hop nay vIoc fm kIom fhaf baI.

Ham do quy fm kIom phu fro so fra vo mof con fro chI don phan fu duoc fm
fhay. Mac du con fro nay co fho duoc su dung do fruy xuaf don du IIou Iuu frong
doI fuong cay, nhung chI co cac ham Ia nhung phuong fhuc cua cay moI co fho goI
ham fm kIom phu fro nay |v chI co chung moI co fho goI fhuoc fnh root cua
cay Iam fhong so). Nhu vay, vIoc fra vo con fro don mof nuf so khong vI pham
don fnh dong kn cua cay khI nhn fu ung dung bon ngoaI. Chung fa co dac fa
sau day cua ham fm kIom phu fro.

Binary_node<Record> *Search_tree<Record> :: search_for_node
(Binary_node<Record> *sub_root, const Record &target) const;
pre: sub_root hoac Ia NULL hoac chI don mof cay con cua Iop Search_tree.
post:Nou khoa cua target khong co frong cay con sub_tree, ham fra vo NULL; nguoc IaI, ham
fra vo con fro don nuf chua target.
9.3.2.2. Phen bun de quy
Cach don gIan nhaf do vIof ham fm kIom fron Ia dung do quy:

template <class Record>
Binary_node<Record> *Search_tree<Record>::search_for_node(
Binary_node<Record>* sub_root, const Record &target) const
{
if (sub_root == NULL || sub_root->data == target) return sub_root;
else if (sub_root->data < target)
return search_for_node(sub_root->right, target);
else return search_for_node(sub_root->left, target);
}

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 201
9.3.2.3. Khu de quy
o quy xuaf hIon frong ham fron chI Ia do quy duoI, do Ia Ionh cuoI cung duoc
fhuc hIon frong ham. ang cach su dung vong Iap, do quy duoI Iuon co fho duoc
fhay fho boI su Iap IaI nhIou Ian. Trong fruong hop nay chung fa can vIof vong
Iap fho cho Ionh if dau fIon, va fhay doI fhong so sub_root do no dI chuyon
xuong cac canh cua cay.

template <class Record>
Binary_node<Record> *Search_tree<Record>::search_for_node(
Binary_node<Record> *sub_root, const Record &target) const
{ while (sub_root != NULL && sub_root->data != target)
if (sub_root->data < target)
sub_root = sub_root->right;
else sub_root = sub_root->left;
return sub_root;
}
9.3.2.4. Phuong thuc tree_search
Phuong fhuc tree_search don gIan chI goI ham phu fro search_for_node
do fm nuf chua khoa frung voI khoa can fm frong cay fm kIom nhj phan. Sau
do no frch du IIou can fhIof va fra vo Error_code fuong ung.

template <class Record>
Error_code Search_tree<Record>::tree_search(Record &target) const
/*
post: Nou fm fhay khoa can fm frong target, phuong fhuc so bo sung cac du IIou day du vao
cac fhanh phan khac con IaI cua target va fra vo success. Nguoc IaI fra vo
not_present. Ca haI fruong hop cay dou khong fhay doI.
Uses: Ham search_for_node
*/
{
Error_code result = success;
Binary_node<Record> *found = search_for_node(root, target);
if (found == NULL)
result = not_present;
else
target = found->data;
return result;
}
9.3.2.5. Hunh v cuu gu thuut
Chung fa fhay rang tree_search dua fron co so cua fm nhj phan. Nou chung
fa fhuc hIon fm nhj phan fron mof danh sach co fhu fu, chung fa fhay rang fm
nhj phan fhuc hIon cac phop so sanh hoan foan gIong nhu tree_search. Chung
fa cung da bIof fm nhj phan fhuc hIon O|Iog n) Ian so sanh doI voI danh sach co
chIou daI n. Iou nay fhuc su fof so voI cac phuong phap fm kIom khac, do Iog n
fang raf cham khI n fang.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 202
Cay frong hnh 9.9a Ia cay fof nhaf doI voI vIoc fm kIom. Cay cang ram rap
cang fof: no co chIou cao nho nhaf doI voI so nuf cho fruoc. So nuf nam gIua nuf
goc va nuf can fm, ko ca nuf can fm, Ia so Ian so sanh can fhuc hIon khI fm
kIom. V vay, cay cang ram rap fh so Ian so sanh nay cang nho.

Khong phaI chung fa Iuon co fho du doan fruoc hnh dang cua mof cay nhj
phan fm kIom fruoc khI cay duoc fao ra, va cay o hnh |b) Ia mof cay dIon hnh
fhuong co nhaf so voI cay o hnh |a). Trong cay nay, vIoc fm phan fu c can bon
Ian so sanh, con hnh |a) chI can ba Ian so sanh. Tuy nhIon, cay o hnh |b) van
con fuong doI ram rap va vIoc fm kIom fron no chI do hon mof f so voI cay foI
uu frong hnh |a).
Trong hnh |c), cay da fro non suy fhoaI, va vIoc fm phan fu c can don 6 Ian
so sanh. Hnh |d) va |o) cac cay da fro fhanh chuoI cac mac xch. KhI fm fron cac
chuoI mac xch nhu vay, tree_search khong fho Iam duoc g khac hon Ia duyof
fu phan fu nay sang phan fu kIa. NoI cach khac, free_search khI fhuc hIon fron
chuoI cac mac xch nhu vay da suy fhoaI fhanh fm fuan fu. Trong fruong hop xau

HInh 9.9 Mof vaI cay nhj phan fm kIom co cac khoa gIong nhau
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 203
nhaf nay, voI mof cay co n nuf, tree_search co fho can don n Ian so sanh do
fm mof phan fu.

Trong fhuc fo, nou cac nuf duoc fhom vao mof cay nhj phan fm kIom froo mof
fhu fu ngau nhIon, fh raf hIom khI cay fro non suy fhoaI fhanh cac dang nhu o
hnh |d) hoac |o). Thay vao do, cay so co hnh dang gan gIong voI hnh |a) hoac
|b). o do, hau nhu Ia tree_search Iuon fhuc hIon gan gIong voI fm nhj phan.
oI voI cay nhj phan fm kIom ngau nhIon, su fhuc hIon tree_search chI cham
hon 39% so voI su fm kIom foI uu voI Ig n Ian so sanh cac khoa, va nhu vay no
cung fof hon raf nhIou so voI fm fuan fu co n Ian so sanh.

9.3.3. Them phun tu vuo cuy nh{ phun tIm kem
9.3.3.1. Out vun de
Tac vu quan frong fIop fhoo doI voI chung fa Ia fhom mof phan fu moI vao cay
nhj phan fm kIom sao cho cac khoa frong cay van gIu dung fhu fu; co nghIa Ia,
cay kof qua van fhoa djnh nghIa cua mof cay nhj phan fm kIom. ac fa fac vu
nay nhu sau:

Error_code Search_tree<Record>::insert(const Record &new_data);
post: Nou ban ghI co khoa frung voI khoa cua new_data da co frong cay fh Search_tree fra vo
duplicate_error. Nguoc IaI, new_data duoc fhom vao cay sao cho cay van gIu duoc cac
dac fnh cua mof cay nhj phan fm kIom, phuong fhuc fra vo success.
9.3.3.2. Cuc vI du
Truoc khI vIof phuong fhuc nay, chung fa hay xom mof vaI v du. Hnh 9.10
mInh hoa nhung g xay ra khI chung fa fhom cac khoa o, b, d, f, a, g, c vao mof
cay rong fhoo dung fhu fu nay.

KhI phan fu dau fIon o duoc fhom vao, no fro fhanh goc cua cay nhu hnh
9.10a. KhI fhom b, do b nho hon o, b duoc fhom vao cay con bon fraI cua o nhu
hnh |b). TIop fhoo, chung fa fhom d, do d nho hon o, chung fa dI qua fraI, so
sanh d voI b, chung fa dI qua phaI. KhI fhom f, chung fa qua phaI cua o nhu hnh
|d). o fhom a, chung fa qua fraI cua o, roI qua fraI cua b, do a Ia khoa nho nhaf
frong cac khoa can fhom vao. Tuong fu, khoa g Ia khoa Ion nhaf frong cac khoa
can fhom, chung fa dI sang phaI IIon fuc frong khI con co fho, nhu hnh |f). CuoI
cung, vIoc fhom c, so sanh voI o, ro sang fraI, so sanh voI b, ro phaI, va so sanh
voI d, ro fraI. Chung fa co duoc cay o hnh |g).
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 204
Hoan foan co fho co mof fhu fu fhom vao khac cung fao ra mof cay nhj phan
fm kIom fuong fu. Chang han, cay o hnh 9.10 co fho duoc fao ra khI cac khoa
duoc fhom fhoo fhu fu o, f, g, b, a, d, c hoac o, b, d, c, a, f, g hoac mof so fhu fu
khac.

Co mof fruong hop fhaf dac bIof. CIa su cac khoa duoc fhom vao mof cay rong
fhoo dung fhu fu fu nhIon a, b, ..., g, fh cay nhj phan fm kIom duoc fao ra so Ia
mof chuoI cac mac xch, nhu hnh 9.9o. ChuoI mac xch nhu vay raf kom hIou qua
doI voI vIoc fm kIom. Chung fa co kof Iuan sau:

Ncu cac kboa Juoc tbcm oao mot cay nbj pban tm kicm rong tbco tbu tu tu
nbicn cua cbung, tb pbuong tbuc insert sc sinb ra mot cay suy tboai oc mot
cbuoi mac xicb kcm bicu qua. Pbuong tbuc insert kbong ncn Jung ooi cac kboa
Ja co tbu tu.

Kof qua fron cung dung frong fruong hop cac khoa co fhu fu nguoc hoac gan
nhu co fhu fu.


HInh 9.10 Thom phan fu vao cay nhj phan fm kIom
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 205
9.3.3.3. Phuong phup
Tu v du fron don phuong fhuc insert fong quaf cua chung fa chI co mof buoc
nho.

Trong fruong hop fhu nhaf, fhom mof nuf vao mof cay rong raf do. Chung fa
chI can cho con fro root chI don nuf nay. Nou cay khong rong, chung fa can so
sanh khoa cua nuf can fhom voI khoa cua nuf goc. Nou nho hon, nuf moI can
fhom vao cay con fraI, nou Ion hon, nuf moI can fhom vao cay con phaI. Nou haI
khoa bang nhau fh phuong fhuc fra vo duplicate_error.

Iuu y rang chung fa vua mo fa vIoc fhom vao bang cach su dung do quy. Sau
khI chung fa so sanh khoa, chung fa so fhom nuf moI vao cho cay con fraI hoac
cay con phaI fhoo dung phuong phap ma chung fa su dung cho nuf goc.
9.3.3.4. Hum de quy
CIo chung fa da co fho vIof phuong fhuc insert, phuong fhuc nay so goI ham
do quy phu fro voI fhong so root.

template <class Record>
Error_code Search_tree<Record>::insert(const Record &new_data)
{
return search_and_insert(root, new_data);
}

Iuu y rang ham phu fro can fhay doI sub_root, do Ia fruong hop vIoc fhom
nuf moI fhanh cong. o do, fhong so sub_root phaI Ia fham chIou.

template <class Record>
Error_code Search_tree<Record>::search_and_insert(
Binary_node<Record> *&sub_root, const Record &new_data)
{
if (sub_root == NULL) {
sub_root = new Binary_node<Record>(new_data);
return success;
}
else if (new_data < sub_root->data)
return search_and_insert(sub_root->left, new_data);
else if (new_data > sub_root->data)
return search_and_insert(sub_root->right, new_data);
else return duplicate_error;
}

Chung fa da quy uoc cay nhj phan fm kIom so khong co haI phan fu frung
khoa, do do ham search_and_insert fu choI moI phan fu co frung khoa.

Su su dung do quy frong phuong fhuc insert fhaf ra khong phaI Ia ban chaf,
v day Ia do quy duoI. Cach hIon fhuc khong do quy duoc xom nhu baI fap.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 206
Xof vo fnh hIou qua, insert cung fhuc hIon cung mof so Ian so sanh cac khoa
nhu tree_search da Iam khI fm mof khoa da fhom vao fruoc do. Phuong fhuc
insert con Iam fhom mof vIoc Ia fhay doI mof con fro, nhung khong ho fhuc
hIon vIoc dI chuyon cac phan fu hoac baf cu vIoc g khac chIom nhIou fhoI gIan.
V fho, hIou qua cua insert cung gIong nhu tree_search:

Phuong fhuc insert co fho fhom mof nuf moI vao mof cay nhj phan fm
kIom ngau nhIon co n nuf frong O|Iog n) buoc. Co fho xay ra, nhung cuc ky hIom,
mof cay ngau nhIon fro non suy fhoaI va Iam cho vIoc fhom vao can don n buoc.
Nou cac khoa duoc fhom vao mof cay rong ma da co fhu fu fh fruong hop suy
fhoaI nay so xay ra.

9.3.4. Sup thu tu theo cuy
KhI duyof mof cay nhj phan fm kIom fhoo inorJcr chung fa so co duoc cac
khoa fhoo dung fhu fu cua chung. Iy do Ia v faf ca cac khoa bon fraI cua mof
khoa dou nho hon chnh no, va cac khoa bon phaI cua no dou Ion hon no. ang do
quy, dIou nay cung fIop fuc dung voI cac cay con cho don khI cay con chI con Ia
mof nuf. Vay phop duyof inorJcr Iuon cho cac khoa co fhu fu.
9.3.4.1. Thu tuc sup thu tu
Iou quan saf duoc fron Ia co so cho mof fhu fuc sap fhu fu fhu vj duoc goI Ia
trccsort. Chung fa chI can dung phuong fhuc insert do xay dung mof cay nhj
phan fm kIom fu cac phan fu can sap fhu fu, sau do dung phop duyof inorJcr
chung fa so co cac phan fu co fhu fu.
9.3.4.2. So sunh vo quicksort
Chung fa so xom fhu so Ian so sanh khoa cua trccsort Ia bao nhIou. Nuf dau
fIon Ia goc cua cay, khong can phaI so sanh khoa. VoI haI nuf fIop fhoo, khoa cua
chung fruoc fIon can so sanh voI khoa cua goc do sau do ro fraI hoac phaI.
Quicksort cung fuong fu, frong do, o buoc fhu nhaf moI khoa can so sanh voI
phan fu pioot do duoc daf vao danh sach con bon fraI hoac bon phaI. Trong
trccsort, khI moI nuf duoc fhom, no so dan dI foI vj fr cuoI cung cua no frong cau
fruc IIon kof. KhI nuf fhu haI fro fhanh nuf goc cua cay con fraI hoac cay con
phaI, moI nuf fhuoc mof frong haI cay con nay so duoc so sanh voI nuf goc cua no.
Tuong fu, frong quicksort moI khoa frong mof danh sach con duoc so sanh voI
phan fu pioot cua no. TIop fuc fhoo cach fuong fu, chung fa co duoc nhan xof sau:

Trccsort co cung so /an so sanb cac kboa ooi quicksort.

Nhu chung fa da bIof, quicksort Ia mof phuong phap raf fof. Xof frung bnh,
frong cac phuong phap ma chung fa da hoc, chI co mcrgcsort Ia co so Ian so sanh
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 207
cac khoa f nhaf. o do chung fa co fho hy vong rang trccsort cung Ia mof phuong
phap fof nou xof vo so Ian so sanh khoa. Tu phan 8.8.4 chung fa co fho kof Iuan:

Trong fruong hop frung bnh, frong mof danh sach co fhu fu ngau nhIon co n
phan fu, trccsort fhuc hIon

2n In n + O|n) 1.39 Ig n + O|n)

so Ian so sanh.

Trccsort con co mof uu dIom so voI quicksort. Quicksort can fruy xuaf moI
phan fu frong suof qua frnh sap fhu fu. VoI trccsort, khI baf dau qua frnh, cac
phan fu khong can phaI co san mof Iuc, ma chung duoc fhom vao cay fung phan
fu mof. o do trccsort fhch hop voI cac ung dung ma frong do cac phan fu duoc
nhan vao moI Iuc mof phan fu. u dem lon cuu treesort lu cuy nh{ phun tIm
kem vuu cho phep them houc lou phun tu d suu do, vuu cho phep tIm
kem theo tho gun logarit. Trong khI faf ca cac phuong phap sap fhu fu fruoc
kIa cua chung fa, voI hIon fhuc danh sach IIon fuc fh vIoc fhom hoac IoaI phan fu
raf kho, con voI danh sach IIon kof, fh vIoc fm kIom chI co fho Ia fuan fu.

Nhuoc dIom chnh cua trccsort duoc xom xof nhu sau. Chung fa bIof rang
quicksort co hIou qua raf fhap frong fruong hop xau nhaf cua no, nhung nou phan
fu pioot duoc chon fof fh fruong hop nay cung raf hIom khI xay ra. KhI chung fa
chon phan fu dau cua moI danh sach con Iam pioot, fruong hop xau nhaf Ia khI
cac khoa da co fhu fu. Tuong fu, nou cac khoa da co fhu fu fh trccsort so fro non
raf do, cay fm kIom so suy fhoaI vo mof chuoI cac mac xch. Trccsort khong bao
gIo non dung voI cac khoa da co fhu fu, hoac gan nhu co fhu fu.

9.3.5. Lou phun tu trong cuy nh{ phun tIm kem
KhI xom xof vo trccsort, chung fa da nhac don kha nang fhay doI frong cay
nhj phan fm kIom Ia mof uu dIom. Chung fa cung da co mof gIaI fhuaf fhom mof
nuf vao mof cay nhj phan fm kIom, va no co fho duoc su dung cho ca fruong hop
cap nhaf IaI cay cung nhu fruong hop xay dung cay fu dau. Nhung chung fa chua
do cap don cach IoaI mof phan fu ra khoI cay. Nou nuf can IoaI Ia mof nuf Ia, fh
cong vIoc raf do: chI can sua fham chIou don nuf can IoaI fhanh NULL |sau khI da
gIaI phong nuf do). Cong vIoc cung van do dang khI nuf can IoaI chI co mof cay
con khac rong: fham chIou fu nuf cha cua nuf can IoaI duoc chI don cay con khac
rong do.

KhI nuf can IoaI co don haI cay con khac rong, van do fro non phuc fap hon
nhIou. Cay con nao so duoc fham chIou fu nuf cha7 oI voI cay con con IaI can
phaI Iam nhu fho nao7 Hnh 9.11 mInh hoa fruong hop nay. Truoc fIon, chung fa
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 208
can fm nuf ngay ko fruoc nuf can IoaI frong phop duyof inorJcr |con goI Ia nuf
cuc phaI cua cay con fraI) bang cach dI xuong nuf con fraI cua no va sau do dI vo
bon phaI IIon fIop nhIou Ian cho don khI khong fho dI duoc nua. Nuf cuc phaI cua
cay con fraI nay so khong co nuf con bon phaI, cho non no co fho duoc IoaI dI mof
cach do dang. Nhu vay du IIou cua nuf can IoaI so duoc chop do boI du IIou cua nuf
nay, va nuf nay so duoc IoaI dI. ang cach nay cay van con gIu duoc dac fnh cua
cay nhj phan fm kIom, do gIua nuf can IoaI va nuf ngay ko fruoc no frong phop
duyof inorJcr khong con nuf nao khac, va fhu fu duyof inorJcr van khong bj xao
fron. |Cung co fho Iam fuong fu khI chon do IoaI nuf ngay ko sau cua nuf can IoaI
- nuf cuc fraI cua cay con phaI - sau khI chop du IIou cua nuf nay Ion du IIou cua
nuf can IoaI).


Chung fa baf dau bang mof ham phu fro so IoaI dI mof nuf nao do frong cay
nhj phan fm kIom. Ham nay co fhong so Ia dja chI cua nuf can IoaI. Thong so nay
phaI Ia fham bIon do vIoc fhay doI no Iam fhay doI fhuc su con fro duoc goI Iam fhong so. NgoaI
ra, muc dch cua ham Ia cap nhaf IaI cay non frong chuong frnh goI, fhong so fhuc su phaI Ia mof

HInh 9.11 IoaI mof phan fu ra khoI cay nhj phan fm kIom
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 209
frong cac fham chIou don chnh mof nuf cua cay, chu khong phaI chI Ia mof ban sao cua no. NoI
mof cach khac, nou nuf con fraI cua nuf x can bj IoaI fh ham so duoc goI nhu sau

remove_root(x->left),

nou chnh root can bj IoaI fh ham so goI

remove_root(root).

Cach goI sau day khong dung do khI y fhay doI, x->left khong ho fhay doI:

y = x->left; remove_root(y);

Ham phu fro remove_root duoc hIon fhuc nhu sau:

template <class Record>
Error_code Search_tree<Record>::remove_root(Binary_node<Record>
*&sub_root)
/*
pre: sub_root Ia NULL, hoac Ia dja chI cua nuf goc cua mof cay con ma nuf goc nay can duoc
IoaI khoI cay nhj phan fm kIom.
post: Nou sub_root Ia NULL, ham fra vo not_present. Nguoc IaI, goc cua cay con nay so
duoc IoaI sao cho cay con IaI van Ia cay nhj phan fm kIom. Thong so sub_root duoc gan
IaI goc moI cua cay con, ham fra vo success.
*/
{
if (sub_root == NULL) return not_present;
Binary_node<Record> *to_delete = sub_root; // Nho IaI nuf can IoaI.
if (sub_root->right == NULL)
sub_root = sub_root->left;
else if (sub_root->left == NULL)
sub_root = sub_root->right;
else { // Ca 2 cay con dou rong.
to_delete = sub_root->left; // Vo bon fraI do dI fm nuf dung ngay fruoc nuf can
IoaI frong fhu fu duyof inorJcr..

Binary_node<Record> *parent = sub_root;
while (to_delete->right != NULL) { // to_delete so don duoc nuf
parent = to_delete; // can fm va parent so Ia
to_delete = to_delete->right; // nuf cha cua no.
}
sub_root->data = to_delete->data; // Chop do Ion du IIou can IoaI.

if (parent == sub_root) // Truong hop dac bIof: nuf con
sub_root->left = to_delete->left; // fraI cua nuf can IoaI cung
// chnh Ia nuf dung ngay fruoc
// no frong fhu fu duyof inorJcr.
else parent->right = to_delete->left;
}
delete to_delete; // IoaI phan fu cuc phaI cua cay con fraI cua phan fu can IoaI.
return success;
}

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 210
Chung fa can phaI can fhan phan bIof gIua fruong hop nuf ngay fruoc nuf can
IoaI frong fhu fu duyof inorJcr Ia chnh nuf con fraI cua no voI fruong hop chung
fa can phaI dI chuyon vo bon phaI do fm. Truong hop fhu nhaf Ia fruong hop dac
bIof, nuf con fraI cua nuf can IoaI co cay con bon phaI rong. Truong hop fhu haI Ia
fruong hop fong quaf hon, nhung cung can Iuu y Ia chung fa dI fm nuf co cay con
phaI Ia rong chu khong phaI fm mof cay con rong.

Phuong fhuc remove duoI day nhan fhong so Ia du IIou cua nuf can IoaI chu
khong phaI con fro chI don no. o IoaI mof nuf, vIoc dau fIon can Iam Ia dI fm
no frong cay. Chung fa kof hop vIoc fm do quy frong cay voI vIoc IoaI bo nhu sau:

template <class Record>
Error_code Search_tree<Record>::remove(const Record &target)
/*
post: Nou fm duoc du IIou co khoa frung voI khoa frong target fh du IIou do so bj IoaI khoI
cay sao cho cay van Ia cay nhj phan fm kIom, phuong fhuc fra vo success. Nguoc IaI,
phuong fhuc fra vo not_present.
uses: Ham search_and_destroy
*/
{
return search_and_destroy(root, target);
}

Nhu fhuong Io, phuong fhuc fron goI mof ham do quy phu fro co fhong so Ia
con fro root.

template <class Record>
Error_code Search_tree<Record>::search_and_destroy(
Binary_node<Record>* &sub_root, const Record &target)
/*
pre: sub_root Ia NULL hoac Ia dja chI cua goc cua mof cay con cua cay nhj phan fm kIom.
post: Nou khoa frong fargof khong co frong cay con sub_root, ham fra vo not_present.
Nguoc IaI, nuf co chua du IIou fm fhay so duoc IoaI sao cho fnh chaf cay nhj phan fm kIom
van duocbao foan, ham fra vo success.
uses: Ham search_and_destroy (mof cach do quy) va ham remove_root.
*/
{
if (sub_root == NULL || sub_root->data == target)
return remove_root(sub_root);
else if (target < sub_root->data)
return search_and_destroy(sub_root->left, target);
else
return search_and_destroy(sub_root->right, target);
}
9.4. Xuy dung mot cuy nh{ phun tIm kem
CIa su chung fa co mof danh sach cac du IIou da co fhu fu, hoac co fho Ia mof
fIIo cac ban ghI co cac khoa da co fhu fu. Nou chung fa muon su dung cac du IIou
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 211
nay do fm kIom fhong fIn, hoac fhuc hIon mof so fhay doI nao do, chung fa co
fho fao mof cay nhj phan fm kIom fu danh sach hoac fIIo nay.

Chung fa co fho baf dau fu mof cay rong va don gIan su dung gIaI fhuaf fhom
vao cay do fhom fung phan fu. Tuy nhIon do cac phan fu da co fhu fu, cay fm
kIom cua chung fa so fro fhanh mof chuoI cac mac xch raf daI, va vIoc su dung
no fro non raf cham chap voI foc do cua fm fuan fu chu khong phaI Ia fm nhj
phan. Thay vao do chung fa mong muon rang cac phan fu so duoc xay dung fhanh
mof cay cang ram rap cang fof, co nghIa Ia cay khong bj cao qua, do gIam fhoI
gIan fao cay cung nhu fhoI gIan fm kIom. Chang han, khI so phan fu n bang 31,
chung fa muon cay so co duoc dang nhu hnh 9.12. ay Ia cay co duoc su can bang
fof nhaf gIua cac nhanh, va duoc goI Ia cay nhj phan day du.

Trong hnh 9.12, cac phan fu duoc danh so fhoo fhu fu ma gIa frj cua chung
fang dan. ay cung Ia fhu fu fu duyof cay inorJcr, va cung Ia fhu fu ma chung so
duoc fhom vao cay fhoo gIaI fhuaf cua chung fa. Chung fa cung so dung cac con so
nay nhu Ia nhan cua cac nuf frong cay. Nou chung fa xom xof ky so do fron,
chung fa co fho nhan fhay mof dac fnh quan frong cua cac nhan. Cac nhan cua
cac nuf Ia chI foan so Io. Cac nhan cua cac nuf o muc fron cac nuf Ia mof bac Ia 2,
6, 10, 14, 18, 22, 26, 30. Cac so nay dou gap doI mof so Io, co nghIa chung dou Ia
so chan, va chung dou khong chIa hof cho 4. Tron muc cao hon mof bac cac nuf co
nhan 4, 12, 20 va 28, day Ia nhung con so chIa hof cho 4, nhung khong chIa hof
cho 8. CuoI cung, cac nuf ngay duoI nuf goc co nhan Ia 8 va 24. va nuf goc co
nhan Ia 16.

Ncu cac nut cua mot cay nbj pban Jay Ju co cac nban tbco tbu tu Juyct
inorJcr, bat Jau tu 1, tb nban cua moi nut /a mot so co so /an cbia cban cbo 2
bang ooi bicu giua muc cua no ooi muc cua cac nut /a.

Nhu vay, nou cho muc cua cac nuf Ia Ia 1, khI fhom mof nuf moI, dua vao nhan
cua no chung fa so fnh duoc muc fuong ung.

HInh 9.12 Cay nhj phan day du voI 31 nuf.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 212
CIa su chung fa khong bIof fruoc so nuf so fao cay. Iou nay duoc gIaI fhch
rang, khI cac nuf don fu mof fIIo hoac mof danh sach IIon kof, chung fa khong co
cach g fhuan fIon do dom fruoc so nuf ca. Iou gIa fhIof nay cung con mof uu
dIom Ia chung fa khong can phaI Io Iang vo vIoc so nuf co phaI Ia mof so Iuy fhua
cua 2 fru dI 1 hay khong. Trong fruong hop so nuf khong phaI Ia so Iuy fhua cua
2 fru dI 1, cay duoc fao ra so khong phaI Ia mof cay day du va doI xung hoan foan
nhu hnh 9.12. VoI gIa fhIof cay so Ia mof cay day du, chung fa so dua dan cac
nuf vao cay, cho don khI moI phan fu da duoc dua vao cay, chung fa so xac djnh
cach do kof fhuc vIoc fao cay.

9.4.1. Thet ke gu thuut
KhI nhan phan fu fhu nhaf co nhan Ia 1, chu ng fa so fao mof nuf Ia co cac con
fro Ioff va rIghf dou Ia NULL. Nuf so 2 nam fron nuf 1, nhu hnh 9.13. o nuf 2
nam gIu nuf 1, bang cach nao do chung fa can nho dja chI nuf 1 cho don khI co
nuf 2. Nuf so 3 IaI Ia nuf Ia, nhung no Ia nuf con phaI cua nuf 2, vay chung fa can
nho IaI dja chI nuf 2

Iam nhu vay IIou chung fa co can phaI na m gIu mof danh sach cac con fro don
faf ca cac nuf da duoc dua vao cay, do sau do chung moI duoc gan vao con fro

HInh 9.13 Tao cac nuf dau fIon cho mof cay nhj phan fm kIom
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 213
left hoac right cua cha chung khI cha chung xuaf hIon sau hay khong7 Cau fra
IoI Ia khong. o khI nuf 2 duoc fhom vao, moI moI noI voI nuf 1 da hoan faf. Nuf
2 can duoc nho cho don khI nuf 4 duoc fhom vao, do fao IIon kof fraI cua nuf 4.
Tuong fu, nuf 4 can duoc nho cho don khI nuf 8 duoc fhom vao. Trong hnh 9.13,
cac muI fon chI cac nuf can duoc nho IaI khI cay dang Ion Ion.

Chung fa fhay rang do fhuc hIon cac moI noI sau do, doI voI moI muc chung fa
chI can nho IaI duy nhaf mof con fro chI don mof nuf, do chnh Ia nuf cuoI cung
frong muc do. Chung fa nam gIu cac con fro nay frong mof danh sach goI Ia
last_node, va danh sach nay cung so raf nho. Iay v du, mof cay co 20 muc co
fho chua don 2
20
-1 > 1,000,000 nuf, nhung chI can 20 phan fu frong last_node.

KhI mof nuf duoc fhom vao, chung fa co fho gan con fro rIghf cua no Ia NULL,
co fho chI Ia fam fhoI, v nuf con phaI cua no |nou co) so duoc fhom vao sau. Con
fro fraI cua mof nuf moI so Ia NULL nou do Ia nuf Ia. Nguoc IaI, nuf con fraI cua
no chnh Ia nuf o ngay muc fhap hon muc cua no ma dja chI dang chua frong
last_node. Chung fa cung co fho xu Iy cho cac nuf Ia fuong fu nhu cac nuf khac
bang cach, nou cho muc cua nuf Ia Ia 1, fh chung fa so cho phan fu dau fIon, faI
vj fr 0, cua last_node Iuon mang frj NULL. Cac muc bon fron muc cua nuf Ia so
Ia 2, 3, ...
9.4.2. Cuc khu buo vu hum mun
Chung fa co fho djnh nghIa mof Iop moI, goI Ia Buildable_tree, dan xuaf fu
Iop Search_tree.

template <class Record>
class Buildable_tree: public Search_tree<Record> {
public:
Error_code build_tree(const List<Record> &supply);
private: // Cac ham phu fro.
};

uoc dau fIon cua build_tree Ia nhan cac phan fu. o don gIan chung fa so
cho rang cac phan fu nay duoc chua frong mof danh sach cac Record goI Ia
supply. Tuy nhIon, chung fa cung co fho vIof IaI ham do nhan cac phan fu fu mof
hang doI, hoac mof fap fIn, hoac fham ch fu mof cay nhj phan fm kIom khac voI
mong muon can bang IaI cay nay.

KhI nhan cac phan fu moI do fhom vao cay, chung fa so cap nhaf IaI mof bIon
count do bIof duoc co bao nhIou phan fu da duoc fhom vao. Ro rang Ia frj cua
count con duoc dung do Iay du IIou fu danh sach supply. Quan frong hon nua,
frj cua count con xac djnh muc cua nuf dang duoc fhom vao cay, no so duoc goI
cho mof ham chuyon Io vIoc fnh foan nay.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 214
Sau khI faf ca cac phan fu fu supply da duoc fhom vao cay nhj phan fm kIom
moI, chung fa can fm goc cua cay va noI faf ca cac cay con phaI con roI rac.

template <class Record>
Error_code Buildable_tree<Record>::build_tree
(const List<Record>&supply)
/*
post: Nou du IIou frong supply co fhu fu fang dan, cay nhj phan fm kIom kha can bang so
duoc fao ra fu cac du IIou nay, phuong fhuc fra vo success. Nguoc IaI, cay nhj phan fm
kIom chI duoc fao ra fu mang cac du IIou fang dan daI nhaf fnh baf dau fu dau danh sach
suppIy, phuong fhuc fra vo fail.
uses: Cac phuong fhuc cua Iop List va cac ham build_insert, connect_subtrees, va
find_root
*/
{ Error_code ordered_data = success; // So duoc gan IaI Ia fail nou du IIou
khong fang dan.
int count = 0;
Record x, last_x;
List<Binary_node<Record> *> last_node; // ChI don cac nuf cuoI cung cua moI muc
frong cay.
Binary_node<Record> *none = NULL;
last_node.insert(0, none); // Iuon Ia NULL (danh cho cac nuf Ia frong cay).
while (supply.retrieve(count, x) == success) {
if (count > 0 && x <= last_x) {
ordered_data = fail;
break;
}
build_insert(++count, x, last_node);
last_x = x;
}
root = find_root(last_node);
connect_trees(last_node);
return ordered_data;
}

9.4.3. Them mot nut
Phan fron da xom xof cach noI cac IIon kof fraI cua cac nuf, nhung frong qua
frnh xay dung cay, cac IIon kof phaI cua cac nuf co Iuc van con Ia NULL va chung
can duoc fhay doI sau do. KhI mof nuf moI duoc fhom vao, no co fho so co mof cay
con phaI khong rong. o no Ia nuf moI nhaf va Ion nhaf duoc dua vao cay cho
don fhoI dIom hIon faI, cac nuf frong cay con phaI cua no chua co. Nguoc IaI, mof
nuf moI duoc fhom cung co fho Ia nuf con phaI cua mof nuf nao do da duoc dua
vao fruoc. ong fhoI, no co fho Ia con fraI cua mof nuf co khoa Ion hon, frong
fruong hop nay fh nuf cha cua no chua co. Chung fa co fho xac djnh fung fruong
hop dang xay ra nho vao danh sach last_node. Nou muc level cua mof nuf
dang duoc fhom vao Ion hon hoac bang 1, fh nuf cha cua no co muc level+1.
Chung fa fm phan fu fhu level+1 frong last_node. Nou con fro right cua nuf
nay van con Ia NULL fh nuf dang duoc fhom moI chnh Ia nuf con phaI cua no.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 215
Nguoc IaI, nou no da co con phaI fh nuf dang duoc fhom moI phaI Ia con fraI cua
mof nuf nao do so duoc fhom vao sau. Xom hnh 9.1.

Chung fa co fho vIof ham fhom mof nuf moI vao cay nhu sau:

template <class Record>
void Buildable_tree<Record>::build_insert(int count,
const Record &new_data,
List<Binary_node<Record>*> &last_node)
/*
post: Mof nuf moI chua new_data duoc fhom vao cay. Muc cua nuf nay bang so Ian count chIa
chan cho 2 cong fhom 1, nou xom muc cua nuf Ia bang 1.
uses: Cac phuong fhuc cua Iop List.
*/
{
int level;
for (level = 1; count % 2 == 0; level++)
count /= 2; // Su dung count do fnh muc cua nuf ko.
Binary_node<Record> *next_node = new Binary_node<Record>(new_data),
*parent;
last_node.retrieve(level - 1, next_node->left); // Nuf moI duoc fao ra
// nhan con fraI chnh Ia nuf co dja chI dang duoc Iuu
// frong last_node faI phan fu fuong ung voI muc
// ngay duoI muc cua nuf moI.
if (last_node.size() <= level)
last_node.insert(level, next_node); // Nuf moI Ia nuf dau fIon xuaf hIon
// frong muc cua no.
else
last_node.replace(level, next_node);// a co nhIou nuf cung muc va nuf
// moI nay chnh Ia nuf xuaf hIon
// moI nhaf frong cac nuf cung muc
// non can Iuu IaI dja chI.
if (last_node.retrieve(level + 1, parent)==success
&& parent->right==NULL)
// ay Ia fruong hop nuf cha cua
// nuf moI da fon faI va nuf cha nay
// so nhan no Iam con phaI.
parent->right = next_node;
}

9.4.4. Houn tut cong vec
Tm goc cua cay vua duoc fao Ia mof vIoc do dang: goc chnh Ia nuf o muc cao
nhaf frong cay, con fro chI don no chnh Ia phan fu cuoI cung frong danh sach
last_node. Cay co 21 nuf nhu hnh 9.13 co nuf cao nhaf Ia nuf 16 o muc 5, do
chnh goc cua cay. Cac con fro don cac nuf cuoI cua moI muc duoc chua frong
last_node nhu hnh vo 9.14.



Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 216
Chung fa co ham nhu sau:

template <class Record>
Binary_node<Record> *Buildable_tree<Record>::find_root
(List<Binary_node<Record>*> &last_node)
/*
pre: anh sach last_node chua dja chI cac nuf cuoI cung cua moI muc frong cay nhj phan fm
kIom.
post: Tra vo dja chI nuf goc cua cay nhj phan fm kIom da duoc fao ra.
uses: Cac phuong fhuc cua Iop List.
*/
{
Binary_node<Record> *high_node;
last_node.retrieve(last_node.size() - 1, high_node);
// Tm dja chI nuf goc cua cay faI phan fu fuong ung voI muc cao nhaf frong cay.
return high_node;
}

CuoI cung, chung fa can xac djnh cach noI cac cay con con nam ngoaI. Chang
han, voI cay co n = 21, chung fa can noI ba fhanh phan o hnh 9.13 vao mof cay
duy nhaf. Thoo hnh vo chung fa fhay rang mof so nuf frong cac phan fron cua
cay co fho van con con fro rIghf Ia NULL, frong khI cac nuf da fhom vao cay bay
gIo phaI fro fhanh nuf con phaI cua chung.

af ky nuf nao frong so cac nuf co con fro rIghf van con Ia NULL, fru nuf Ia,
dou Ia mof frong cac nuf nam frong last_node. VoI n=21, do Ia cac nuf 16 va 20
faI cac vj fr 5 va 3 fuong ung frong last_node frong hnh 9.14.
Trong ham sau day chung fa dung con fro high_node do chI don cac nuf co
con fro rIghf Ia NULL. Chung fa can xac djnh con fro lower_node chI don nuf con
phaI cua high_node. Con fro lower_node co fho duoc xac djnh boI nuf cao nhaf
frong last_node ma khong phaI Ia nuf con fraI cua high_node. o xac djnh mof

HInh 9.14 Hoan faf cay nhj phan fm kIom.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 217
nuf co phaI Ia con fraI cua high_node hay khong chung fa so sanh khoa cua no
voI khoa cua high_node.
template <class Record>
void Buildable_tree<Record>::connect_trees
(const List<Binary_node<Record>*> &last_node)
/*
pre: anh sach last_node chua dja chI cac nuf cuoI cung cua moI muc frong cay nhj phan fm
kIom. Cay nhj phan fm kIom duoc da duoc fao gan hoan chInh.
post: Cac IIon kof cuoI cung frong cay duoc noI IaI.
uses: Cac phuong fhuc cua Iop List.
*/
{ Binary_node<Record> *high_node, // from last_node with NULL right child
*low_node; // candidate for right child of high_node
int high_level = last_node.size() - 1,
low_level;
while (high_level > 2) { // Nodes on levels 1 and 2 are already OK.
last_node.retrieve(high_level, high_node);
if (high_node->right != NULL)
high_level--; // Search down for highest dangling node.
else { // Case: undefined right tree
low_level = high_level;
do { // Find the highest entry not in the left
subtree.
last_node.retrieve(--low_level, low_node);
}while (low_node != NULL && low_node->data < high_node->data);
high_node->right = low_node;
high_level = low_level;
}
}
}
9.4.5. Ounh gu
Cay nhj phan fm kIom do gIaI fhuaf fron day fao ra khong Iuon Ia mof cay
can bang fof nhaf. Nhu chung fa fhay, hnh 9.14 Ia cay co n = 21 nuf. Nou no co
31 nuf, no moI co su can bang fof nhaf. Nou nuf fhu 32 duoc fhom vao fh no so
fro fhanh goc cua cay, va faf ca 31 nuf da co so fhuoc cay con fraI cua no. Trong
fruong hop nay, cac nuf Ia nam cach nuf goc 5 buoc fm kIom. Nhu vay cay co 32
nuf fhuong so phaI can so Ian so sanh nhIou hon so Ian so sanh can fhIof Ia mof.
VoI cay co 32 nuf, nou nuf goc duoc chon mof cach foI uu, fh da so cac nuf Ia can
4 buoc fm kIom fu nuf goc, chI co mof nuf Ia Ia can 5 buoc.

Mof Ian so sanh doI ra frong fm nhj phan khong phaI Ia mof su fra gIa cao,
va ro rang rang cay duoc fao ra boI phuong phap fron day cua chung fa so khong
bao gIo co so muc nhIou hon so muc foI uu qua mof don vj. Con co nhIou phuong
phap phuc fap hon do fao ra mof cay nhj phan fm kIom daf duoc su can bang cao
nhaf co fho, nhung mof phuong phap don gIan nhu fron day cung raf can fhIof,
dac bIof Ia phuong phap nay khong cun bet truoc so nut se duoc them vuo
cuy.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 218
Trong phan 9.5 chung fa so fm hIou vo cay AVI, frong do vIoc fhom hay IoaI
phan fu Iuon bao dam cay van gan voI frang fhaI can bang. Tuy nhIon, doI voI
nhIou ung dung, gIaI fhuaf don gIan ma chung fa mo fa o day da Ia fhch hop.
9.5. Cun bung cheu cuo: Cuy AVL

CIaI fhuaf frong phan 9.4 co fho duoc su dung do xay dung mof cay nhj phan
fm kIom gan nhu can bang, hoac do khoI phuc su can bang. Tuy nhIon, frong
nhIou ung dung, vIoc fhom va IoaI phan fu frong cay xay ra fhuong xuyon, va voI
mof fhu fu khong bIof fruoc. Trong mof vaI ung dung IoaI nay, dIou quan frong
can co Ia foI uu fhoI gIan fm kIom bang cach Iuon duy fr cay gan voI fnh frang
can bang. Tu nam 1962 haI nha foan hoc nguoI Nga, C. M. AdoISon-VoISkII va
. M. IandIs, da mo fa mof phuong phap nham dap ung you cau nay, va cay nhj
phan fm kIom nay duoc goI Ia cay AVI.

Cay AVI daf duoc muc dch Ia vIoc fm kIom, fhom vao, IoaI bo phan fu frong
mof cay n nuf co duoc fhoI gIan Ia O|Iog n), ngay ca frong fruong hop xau nhaf.
ChIou cao cua cay AVI n nuf, ma chung fa so xom xof sau, so khong bao gIo vuof
qua 1.44Ig n, va nhu vay ngay ca frong fruong hop xau nhaf, cac hanh vI frong
cay AVI cung khong fho cham hon mof cay nhj phan fm kIom ngau nhIon. Tuy
nhIon, frong phan Ion cac fruong hop, fhoI gIan fm kIom fhaf su fhuong raf gan
voI Ig n, va nhu vay hanh vI cua cac cay AVI raf gan voI hanh vI cua mof cay nhj
phan fm kIom can bang hoan foan Iy fuong.

9.5.1. O{nh nghIu
Trong mof cay can bang hoan foan, cac cay con fraI va cay con phaI cua baf ky
mof nuf nao cung phaI co cung chIou cao. Mac du chung fa khong fho Iuon Iuon
daf duoc dIou nay, nhung bang cach xay dung cay nhj phan fm kIom mof cach
can fhan, chung fa Iuon co fho bao dam rang chIou cao cua cay con fraI va chIou
cao cua cay con phaI cua baf ky mof nuf nao dou hon kom nhau khong qua 1.
Chung fa co djnh nghIa sau:

jnb ngba: Cay AVI Ia mof cay nhj phan fm kIom frong do chIou cao cay con
fraI va chIou cao cay con phaI cua nuf goc hon kom nhau khong qua 1, va ca haI
cay con fraI va phaI nay dou Ia cay AVI.

MoI nuf cua cay AVI co fhom mof fhong so can bang mang frj left-higher,
equal-height, hoac right-higher fuong ung fruong hop cay con fraI cao
hon, bang, hoac fhap hon cay con phaI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 219
Trong so do, chung fa dung / do chI nuf co cay con fraI cao hon cay con phaI,
- chI nuf can bang co haI cay con cao bang nhau, va ` chI nuf co cay con phaI
cao hon cay con fraI. Hnh 9.15 mInh hoa mof vaI cay AVI nho va mof so cay nhj
phan khong fhoa djnh nghIa cay AVI.
Iuu y rang, djnh nghIa khong you cau moI nuf Ia co cung muc hoac phaI o cac
muc ko nhau. Hnh 9.16 mInh hoa mof vaI cay AVI raf khong doI xung, voI cac
cay con fraI cao hon cac cay con phaI.


Chung fa dung kIou IIof ko do khaI bao fhong so can bang:

enum Balance_factor {left_higher,equal_height,right_higher};
HInh 9.15 - Cac v du vo cay AVI va cac cay nhj phan khac.

HInh 9.16 Mof so cay AVI khong doI xung voI cay con fraI cao hon cay con phaI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 220
Thong so can bang phaI co frong faf ca cac nuf cua cay AVI, chung fa can bo
sung dac fa mof node nhu sau:
template <class Record>
struct AVL_node: public Binary_node<Record> {
Balance_factor balance;
// constructors:
AVL_node();
AVL_node(const Record &x);
// Cac ham ao duoc djnh nghIa IaI:
void set_balance(Balance_factor b);
Balance_factor get_balance() const;
};

Mof dIom can Iuu y frong dac fa nay Ia cac con fro left va right cua Binary_node co kIou
Binary_node`. o do cac con fro ma AVL_node fhua ko cung co kIou nay. Tuy nhIon, frong mof
cay AVI, ro rang Ia chung fa can cac nuf cua cay AVI fham chIou don cac nuf khac cua cay AVI.
Su khong fuong fhch vo kIou cua con fro nay khong phaI Ia mof van do nghIom frong, v mof con
fro don mof doI fuong cua mof Iop co so cung co fho chI don mof doI fuong cua Iop dan xuaf.
Trong fruong hop cua chung fa, cac con fro Ioff va rIgfh cua mof AVL_node co fho chI don cac
AVL_node khac mof cach hop Io. IoI ch cua vIoc hIon fhuc AVL_node fhua ko fu Binary_node Ia
su su dung IaI faf ca cac phuong fhuc cua cay nhj phan va cay fm kIom. Tuy nhIon, chung fa can
bao dam rang khI fhom mof nuf moI vao cay AVI, chung fa chI fhom dung cac nuf AVI ma fhoI.

Chung fa so su dung cac phuong fhuc get_balance va set_balance do xac
djnh fhong so can bang cua AVL_node.
template <class Record>
void AVL_node<Record>::set_balance(Balance_factor b)
{
balance = b;
}

template <class Record>
Balance_factor AVL_node<Record>::get_balance() const
{
return balance;
}

Chung fa so goI haI phuong fhuc nay fhong qua con fro chI don nuf cua cay, chang han left-
>get_balance(). Tuy nhIon, cach goI nay co fho gap van do doI voI frnh bIon djch C++ do Ioff
Ia con fro chI don mof Binary_node chu khong phaI AVL_node. Trnh bIon djch phaI fu choI
bIou fhuc left->get_balance() do no khong chac rang do co Ia phuong fhuc cua doI fuong
*left hay khong. Chung fa gIaI quyof van do nay bang cach fhom vao cac phIon ban gIa |Jummy
ocrsion) cua cac phuong fhuc get_balance() va set_balance() cho cau fruc Binary_node. Cac
phuong fhuc gIa duoc fhom vao nay chI do danh cho cac hIon fhuc cua cay AVI dan xuaf.

Sau khI chung fa bo sung cac phuong fhuc gIa cho cau fruc Binary_node, frnh bIon djch so
chap nhan bIou fhuc left->set_balance(). Tuy nhIon, van con mof van do ma frnh bIon djch
van khong fho gIaI quyof duoc: no non su dung phuong fhuc cua AVL_node hay phuong fhuc gIa7
Su Iua chon dung chI co fho duoc fhuc hIon frong fhoI gIan chay cua chuong frnh, khI kIou cua
*left da duoc bIof. Mof cach fuong ung, chung fa phaI khaI bao cac phIon ban set_balance va
get_balance cua Binary_node Ia cac phuong fhuc ao |oirtua/). Iou nay co nghIa Ia su Iua chon
phIon ban nao so duoc fhuc hIon frong fhoI gIan chay cua chuong frnh. Chang han, nou
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 221
set_balance() duoc goI nhu mof phuong fhuc cua AVL_node, fh phIon ban cua AVI so duoc su
dung, nou no duoc goI nhu mof phuong fhuc cua Binary_node fh phIon ban gIa so duoc su dung.

uoI day Ia dac fa cua Binary_node da duoc sua doI:
template <class Entry>
struct Binary_node {
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node();
Binary_node(const Entry &x);
// virtual methods:
virtual void set_balance(Balance_factor b);
virtual Balance_factor get_balance() const;
};

template <class Entry>
void Binary_node<Entry>::set_balance(Balance_factor b)
{
}

template <class Entry>
Balance_factor Binary_node<Entry>::get_balance() const
{
return equal_height;
}

NgoaI ra khong co su fhay doI nao khac frong cac Iop va cac phuong fhuc cua
chung fa, va moI ham xu Iy cho cac nuf fruoc kIa cua chung fa bay gIo da co fho
su dung cho cac nuf AVI.

ay gIo chung fa da co fho dac fa Iop cho cay AVI. Chung fa chI can djnh
nghIa IaI cac phuong fhuc fhom va IoaI phan fu do co fho duy fr cau fruc cay can
bang. Cac phuong fhuc khac cua cay nhj phan fm kIom dou co fho duoc fhua ko
ma khong can fhay doI g.

template <class Record>
class AVL_tree: public Search_tree<Record> {
public:
Error_code insert(const Record &new_data);
Error_code remove(const Record &old_data);
private: // Cac ham phu fro.
};
Thuoc tnh d lieu lp nay tha ke c la con tro root. Con tro nay co kieu
Binary_node<Record>* va do o, nh chung ta a thay, no co the cha a ch cua mot
nut cua cay nh phan nguyen thuy hoac a ch cua mot nut cua cay AVL. Chung ta phai bao
am rang phng thc insert c nh ngha lai ch tao ra cac nut co kieu AVL_node,
lam nh vay mi bao am rang moi nut c truy xuat thong qua con tro root cua cay AVL
eu la cac nut AVL.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 222
9.5.2. Them mot nut
9.5.2.1. Oun nhup
Chung fa hay fhoo doI su Ion Ion cua cay AVI frong hnh 9.17 qua vIoc fhom
mof so phan fu.


Qua frnh fhom o hnh 9.17 duoc fIon hanh chnh xac fhoo cung mof cach voI
qua frnh fhom vao cay nhj phan fm kIom fhong fhuong, ngoaI fru vIoc cap nhaf
IaI fhong so can bang. Tuy nhIon, chung fa Iuu y rang cac fhong so can bang chI
co fho duoc xac djnh sau khI vIoc fhom vao da duoc fhuc hIon. KhI v duoc fhom
vao fhoo hnh 9.17, fhong so can bang frong goc k fhay doI, nhung no khong fhay
doI khI p duoc fhom ko sau do. Ca v va p dou duoc fhom vao cay con phaI f cua
nuf goc, va chI sau khI vIoc fhom vao hoan faf, fhong so can bang faI nuf goc k
moI co fho duoc xac djnh.

Chung fa co fho fhom mof nuf moI vao mof cay AVI bang cach nhu sau. Truoc
hof fhoo dung gIaI fhuaf fhom vao mof cay nhj phan fm kIom bnh fhuong : so
sanh khoa cua nuf moI voI khoa cua nuf goc, va fhom nuf moI vao cay con fraI
hoac cay con phaI fhch hop.


HInh 9.1? Thom nuf vao cay AVI: cac fruong hop don gIan
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 223
Trong qua frnh Ian fm xuong cac nhanh, nou khoa can fhom vao chua co fh
vIoc fhom nuf moI cuoI cung so duoc fhuc hIon faI mof cay con rong. Tu cay con
rong fro fhanh cay con co mof nuf, chIou cao no da fang Ion. Iou nay co fho anh
huong don cac nuf fron duong dI fu nuf cha cua no fro Ion goc. V vay frong qua
frnh duyof cay dI xuong do fm vj fr fhom vao, chung fa can Iuu IaI vof do co fho
Ian nguoc vo do xu Iy. Chung fa co fho dung ngan xop, hoac don gIan hon Ia dung
ham do quy.

Tham bIon taller cua ham do quy duoc gan bang true faI Ian do quy cuoI
cung, do chnh Ia Iuc nuf moI duoc fao ra faI mof cay con rong Iam cho no fang
chIou cao nhu da noI o fron. Nhung vIoc sau day can duoc fhuc hIon faI moI nuf
nam fron duong dI fu nuf cha cua nuf vua duoc fao ra cho don nuf goc cua cay.
Trong khI ma fham bIon taller fra Ion con Ia true, vIoc gIaI quyof cu phaI fIop
fuc cho don khI co mof nuf nhan duoc frj fra vo cua fham bIon nay Ia false. Mof
khI co mof cay con nao do bao Ion rang chIou cao cua no khong bj fang Ion fh cac
nuf fron cua no so khong bj anh huong g, gIaI fhuaf kof fhuc. Nguoc IaI, goI nuf
dang duoc xu Iy frong ham do quy Ia sub_root. Sau khI goI do quy xuong cay con
va nhan duoc fhong bao fra vo rang chIou cao cay con co fang |taller == true),
can xof cac fruong hop sau:

1. Cay con fang chIou cao von Ia cay con fhap hon cay con con IaI, fh chI co
fhong so can bang frong sub_root Ia can fhay doI, cay co goc Ia
sub_root cung khong fhay doI chIou cao. Tham bIon taller duoc gan vo
false baf dau fu day.

2. Truoc khI mof cay con bao Ion Ia fang chIou cao fh haI cay con von cao
bang nhau. Truong hop nay can fhay doI fhong so can bang frong
sub_root, dong fhoI cay co goc Ia sub_root cung cao Ion. Tham bIon
taller van gIu nguyon Ia true do nuf fron cua sub_root gIaI quyof fIop.

3. Cay con fang chIou cao von Ia cay con cao hon cay con con IaI. KhI do
sub_root so co haI cay con co chIou cao chonh Ioch Ia 2, khong fhoa djnh
nghIa cay AVI. ay Ia fruong hop chung fa can don ham right_balance
hoac left_balance do can bang IaI cay co goc Ia sub_root nay. Chung
fa so nghIon cuu nhIom vu cua haI ham nay sau, nhung faI day cung co fho
noI fruoc rang vIoc can bang IaI Iuon gIaI quyof duoc frIof do. Co nghIa Ia
cay co goc Ia sub_root so khong bj fang chIou cao, va nhu vay, fham bIon
taller cung duoc gan vo false baf dau fu day.

VoI cac quyof djnh fron, chung fa co fho vIof cac phuong fhuc va cac ham phu
fro do fhom mof nuf moI vao cay AVI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 224
template <class Record>
Error_code AVL_tree<Record>::insert(const Record &new_data)
/*
post: Nou khoa frong new_data da co frong cay, phuong fhuc fra vo duplicate_error. Nguoc
IaI, new_data duoc fhom vao cay sao cho cay van fhoa cay AVI, phuong fhuc fra vo
success.
uses: Ham avl_insert.
*/
{ bool taller;
return avl_insert(root, new_data, taller);
}

template <class Record>
Error_code AVL_tree<Record>::avl_insert(Binary_node<Record> *&sub_root,
const Record &new_data, bool &taller)
/*
pre: sub_root Ia NULL hoac Ia goc mof cay con frong cay AVI.
post: Nou khoa frong new_data da co frong cay, phuong fhuc fra vo duplicate_error. Nguoc
IaI, new_data duoc fhom vao cay sao cho cay van fhoa cay AVI, phuong fhuc fra vo
success. Nou cay con co fang chIou cao, fhong so taller duoc gan frj true, nguoc IaI
no duoc gan frj false.
uses: Cac phuong fhuc cua AVL_node; ham avl_insert mof cach do quy, cac ham
left_balance va right_balance.
*/
{ Error_code result = success;
if (sub_root == NULL) {
sub_root = new AVL_node<Record>(new_data);
taller = true;
}

else if (new_data == sub_root->data) {
result = duplicate_error;
taller = false;
}

else if (new_data < sub_root->data) { // Thom vao cay con fraI.
result = avl_insert(sub_root->left, new_data, taller);
if (taller == true)
switch (sub_root->get_balance()) { // Change balance factors.

case left_higher:
left_balance(sub_root);
taller = false; // Can bang IaI Iuon Iam cho cay khong bj cao Ion.
break;

case equal_height:
sub_root->set_balance(left_higher); // Cay con co goc sub_root
// da bj cao Ion, taller van Ia true.
break;

case right_higher:
sub_root->set_balance(equal_height);
taller = false; // Cay con co goc sub_root khong bj cao Ion.
break;
}
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 225
else { // Thom vao cay con phaI.
result = avl_insert(sub_root->right, new_data, taller);
if (taller == true)
switch (sub_root->get_balance()) {

case left_higher:
sub_root->set_balance(equal_height);
taller = false; // Cay con co goc sub_root khong bj cao Ion.

break;

case equal_height:
sub_root->set_balance(right_higher);// Cay con co goc sub_root // da
bj cao Ion, taller van Ia true.
break;

case right_higher:
right_balance(sub_root);
taller = false; // Can bang IaI Iuon Iam cho cay khong bj cao Ion.
break;
}
}
return result;
}

9.5.2.2. Cuc phep quuy
Chung fa hay xof fruong hop nuf moI duoc fhom vao cay con cao hon va chIou
cao cua no fang Ion, chonh Ioch chIou cao haI cay con fro fhanh 2, va cay khong
con fhoa dIou kIon cua cay AVI. Chung fa can fo chuc IaI mof phan cua cay do
khoI phuc IaI su can bang. Ham right_balance so xom xof fruong hop cay co
cay con phaI cao hon cay con fraI 2 don vj. |Truong hop nguoc IaI duoc gIaI quyof
frong ham left_balance ma chung fa so xom nhu baI fap). Cho root Ia goc cua
cay va right_tree Ia goc cua cay con phaI cua no.

Co ba fruong hop can phaI xom xof, phu fhuoc vao fhong so can bang cua goc
cua right_tree.

Trng hp 1: Cuy con phu cuu right_tree cuo hon cuy con tru cuu no
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 226


Truong hop fhu nhaf, khI fhong so can bang frong nuf goc cua right_tree Ia
right_higher, xom hnh 9.18, can fhuc hIon phop quay fraI |/cjt rotation).
Chung fa can quay nuf goc cua right_tree huong vo root, ha root xuong fhanh
cay con fraI. Cay con T2, von Ia cay con fraI cua right_tree, fro fhanh cay con
phaI cua root. o T2 gom cac nuf co khoa nam gIua khoa cua root va khoa cua
nuf goc cua right_tree non cach fhay doI nhu vay van bao dam fhu fu cac khoa
cua mof cay nhj phan fm kIom. Phop quay fraI duoc hIon fhuc frong ham
rotate_left duoI day. Chung fa dac bIof Iuu y rang, khI fhuc hIon fhoo mof fraf fu
fhch hop, cac buoc gan fao fhanh mof su quay vong cua cac frj frong ba bIon con
fro. Sau phop quay, chIou cao cua foan bo cay gIam 1, nhung do no vua fang nhu
da noI o fron |va day cung chnh Ia nguyon nhan gay non su maf can bang can
phaI can bang IaI bang phop quay nay) , non chIou cao cuoI cung cua cay xom nhu
khong doI.


template <class Record>
void AVL_tree<Record>::rotate_left(Binary_node<Record> *&sub_root)
/*
pre: sub_root Ia dja chI cua goc cua mof cay con frong cay AVI. Cay con nay co cay con phaI
khong rong.
post: sub_root duoc gan IaI dja chI cua nuf von Ia con phaI cua no, nuf goc cua cay con ban
dau so fhanh nuf con fraI cua cay con moI.
*/


HInh 9.18 Truong hop 1: KhoI phuc su can bang boI phop quay fraI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 227
{
if (sub_root == NULL || sub_root->right == NULL) // cac fruong hop
// khong fho xay ra
cout << "WARNING: program error detected in rotate_left" << endl;

else {
Binary_node<Record> *right_tree = sub_root->right;
sub_root->right = right_tree->left;
right_tree->left = sub_root;
sub_root = right_tree;
}
}


Trng hp 2: Cuy con tru cuu right_tree cuo hon cuy con phu cuu no

Truong hop fhu haI, khI fhong so frong right_tree Ia left_higher, phuc
fap hon. Thoo hnh vo 9.19, nuf sub_tree can dI chuyon Ion haI muc do fhanh
nuf goc moI. Cay con phaI T3 cua sub_tree so fro fhanh cay con fraI cua
right_tree. Cay con fraI T2 cua sub_tree fro fhanh cay con phaI cua root.
Qua frnh nay con duoc goI Ia phop quay kop |Joub/c rotation), do su bIon doI can
qua haI buoc. Thu nhaf Ia cay con co goc Ia right_tree duoc quay sang phaI do
sub_tree fro fhanh goc cua cay nay. Sau do cay co goc Ia root quay sang fraI do
sub_tree fro fhanh goc.

Trong fruong hop fhu haI nay, fhong so can bang moI cua root va
right_tree phu fhuoc vao fhong so can bang fruoc do cua sub_tree. Thong so
can bang moI cua sub_tree Iuon Ia equal_height. Hnh 9.19 mInh hoa cac cay
con cua sub_tree co chIou cao bang nhau, nhung fhuc fo sub_tree co fho Ia
Ioff_hIghor hoac rIghf_hIghor. Cac fhong so can bang kof qua so Ia:

HInh 9.19 Truong hop 2: KhoI phuc su can bang boI phop quay kop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 228
old sub_tree new root new right_tree new sub_tree
- - - -
/ - \ -
\ / - -

Trng hp 3: Hu cuy con cuu right_tree cuo bung nhuu

CuoI cung, chung fa xof fruong hop fhu ba, khI ca haI cay con cua right_tree
cao bang nhau, nhung fhuc fo fruong hop nay khong fho xay ra.

Cung non nhac IaI rang fruong hop can gIaI quyof o day Ia do chung fa vua
fhom mof nuf moI vao cay co goc right_tree, Iam cho cay nay co chIou cao Ion
hon chIou cao cay con fraI cua root Ia 2 don vj. Nou cay right_tree co haI cay
con cao bang nhau sau khI nhan fhom mof nuf moI vao cay con fraI hoac cay con
phaI cua no, fh no du khong the tung cheu cuo, do chIou cao cua no van Iuon
bang chIou cao cua cay con von cao hon cong fhom 1. Vay, fruoc khI fhom nuf moI
ma cay co goc Ia right_tree da cao hon cay con fraI cua roof 2 don vj Ia vo Iy
va saI gIa fhIof rang cay von phaI fhoa dIou kIon cua cay AVI.
9.5.2.3. Hum rght_bulunce
Chung fa co ham right_balance duoI day. Cac ham rotate_right va
left_balance cung fuong fu rotate_left va right_balance, chung fa xom
nhu baI fap.

template <class Record>
void AVL_tree<Record>::right_balance(Binary_node<Record> *&sub_root)
/*
pre: sub_root chua dja chI goc cua cay con frong AVI ma faI nuf goc nay dang vI pham dIou
kIon AVI: cay con phaI cao hon cay con fraI 2 don vj.
post: VIoc can bang IaI gIup cho cay con co goc sub_root da fhoa dIou kIon cay AVI.
uses: cac phuong fhuc cua AVL_node; cac ham rotate_right va rotate_left.
*/
{
Binary_node<Record> *&right_tree = sub_root->right;

switch (right_tree->get_balance()) {

case right_higher: // Thuc hIon 1 phop quay don sang fraI.
sub_root->set_balance(equal_height);
right_tree->set_balance(equal_height);
rotate_left(sub_root);
break;

case equal_height: // Truong hop khong fho xay ra.
cout << "WARNING:program error detected in right_balance" <<endl;

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 229
case left_higher: // Quay kop: quay don sang phaI, roI quay don sang fraI.
Binary_node<Record> *sub_tree = right_tree->left;
switch (sub_tree->get_balance()) {

case equal_height:
sub_root->set_balance(equal_height);
right_tree->set_balance(equal_height);
break;

case left_higher:
sub_root->set_balance(equal_height);
right_tree->set_balance(right_higher);
break;

case right_higher:
sub_root->set_balance(left_higher);
right_tree->set_balance(equal_height);
break;
}
sub_tree->set_balance(equal_height);
rotate_right(right_tree);
rotate_left(sub_root);
break;
}
}

Hnh 9.20 mInh hoa mof v du vIoc fhom vao can co quay don va quay kop.
9.5.2.4. Hunh v cuu gu thuut
So Ian ma ham avl_insert goI do quy chnh no do fhom mof nuf moI co fho
Ion bang chIou cao cua cay. Thoaf nhn, duong nhu Ia moI Ian goI do quy dou dan
don mof Ian quay don hoac quay kop cho cay con fuong ung, nhung fhuc ra, nhIou
nhaf Ia chI co mof phop quay |don hoac kop) Ia duoc fhuc hIon. o nhn fhay dIou
nay, chung fa bIof rang cac phop quay duoc fhuc hIon chI frong cac ham
right_balance va left_balance, va cac ham nay duoc goI chI khI chIou cao
cua cay con co fang Ion. Tuy nhIon, khI cac ham nay fhuc hIon xong, cac phop
quay da Iam cho chIou cao cay con fro vo gIa frj ban dau, nhu vay, doI voI cac Ian
goI do quy fruoc do chua kof fhuc, chIou cao cay con fuong ung so khong fhay doI,
va so khong co mof phop quay hay mof su fhay doI cac fhong so can bang nao
nua.

Phan Ion vIoc fhom vao cay AVI khong dan don phop quay. Ngay ca khI phop
quay Ia can fhIof, no fhuong xay ra gan voI nuf Ia vua duoc fhom vao. Mac du gIaI
fhuaf fhom vao mof cay AVI Ia phuc fap, nhung chung fa co Iy do do fIn rang
fhoI gIan chay cua no khong khac bao nhIou so voI vIoc fhom vao mof cay nhj
phan fm kIom bnh fhuong co cung chIou cao. Chung fa con co fho hy vong rang
chIou cao cua cay AVI nho hon raf nhIou chIou cao cua cay nhj phan fm kIom
bnh fhuong, va nhu vay ca haI vIoc fhom vao va IoaI bo nuf so hIou qua hon
nhIou so voI cay nhj phan fm kIom bnh fhuong.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 230
9.5.3. Lou mot nut
VIoc IoaI mof nuf x ra khoI mof cay AVI cung fhoo y fuong fuong fu, cung bao
gom phop quay don va phop quay kop. Chu ng fa so phac fhao cac buoc cua gIaI
fhuaf duoI day, hIon fhuc cu fho cua ham xom nhu baI fap.

1. Chung fa chI can xom xof fruong hop nuf x can IoaI co nhIou nhaf Ia mof
cay con, v doI voI fruong hop x co haI cay con, chung fa so fm nuf y Ia nuf
ko fruoc no |hoac nuf ko sau no) frong fhu fu duyof inorJcr do IoaI fhay cho
no. Tu nuf con fraI cua x nou dI chuyon sang phaI cho don khI khong fho dI
chuyon duoc nua, chung fa gap mof nuf y khong co con phaI. Iuc do chung
fa so chop du IIou frong y vao x, khong fhay doI fhong so can bang cung
nhu con fraI va con phaI cua x. CuoI cung nuf y so duoc IoaI dI fhay cho nuf
x fhoo cac buoc duoI day.

2. CoI nuf can IoaI Ia x. IoaI nuf x ra khoI cay. o x co nhIou nhaf mof con,
vIoc IoaI x don gIan chI Ia noI fham chIou fu nuf cha cua x don nuf con cua
no |hoac NULL nou x khong co con nao). ChIou cao cay con co goc Ia x gIam
dI 1, va dIou nay co the unh huong den cuc nut num tren duong d tu
x nguoc ve goc cuu cuy. V vay frong qua frnh duyof cay do xuong don
nuf x, chung fa can Iuu vof bang cach su dung ngan xop do co fho xu Iy Ian
nguoc vo. o don gIan, chung fa co fho dung hum de quy vo thum ben
shorter kIou bool cho bIof chIou cao cua cay con co bj gIam dI hay
khong. Cac vIoc can Iam faI moI nuf phu fhuoc vao frj cua fham bIon
shorter ma con no fra vo sau khI vIoc goI do quy xuong cay con kof fhuc,
vao fhong so can bang cua no, va doI khI phu fhuoc vao ca fhong so can
bang cua nuf con cua no.

HInh 9.20 Thom nuf vao cay AVI: cac fruong hop can co phop quay.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 231
3. Ion bool shorter duoc khoI gan frj fruo. Cac buoc sau day so duoc fhuc
hIon faI moI nuf nam fron duong dI fu nuf cha cua x cho don nuf goc cua
cay. Trong khI ma fham bIon shorter fra Ion con Ia true, vIoc gIaI quyof
cu fIop fuc cho don khI co mof nuf nhan duoc frj fra vo cua fham bIon nay
Ia false. Mof khI co mof cay con nao do bao rang chIou cao cua no khong
bj gIam dI fh cac nuf fron cua no so khong bj anh huong g ca. Nguoc IaI,
goI nuf p Ia nuf vua goI do quy xuong nuf con xong va nhan fhong bao
shorter Ia true, can xof cac fruong hop sau:

Trng hp 1: Nuf p hIon faI co fhong so can bang Ia equal_height.
Thong so nay so fhay doI fuy fhuoc vao cay con fraI hay cay con phaI cua
no da bj ngan dI. Ion shorter doI fhanh false.

Trng hp 2: Nuf p hIon faI co fhong so can bang khong lu
equal_height. Cuy con von cuo hon vuu b{ ngun d. Thong so can
bang cua p chI can doI vo equal_height. Truong hop nay cay goc p cung
bj gIam chIou cao non fham bIon shorter van Ia true do fra Ion fron cho
cha cua p gIaI quyof fIop.

Trng hp 3: Nuf p hIon faI co fhong so can bang khong lu
equal_height. Cuy con von thup hon vuu b{ ngun d. Nhu vay faI nuf
p v phum deu ken cuu cuy AVL, va chung fa fhuc hIon phop quay do
khoI phuc IaI su can bang nhu sau. CoI q Ia goc cua cay con cao hon cua p,
co 3 fruong hop fuong ung voI fhong so can bang frong q:

Truong bop Ja: Thong so cun bung cuu q lu equal_height. Thuc
hIon mof phop quuy don do fhay doI cac fhong so can bang cua p va q,
frang fhaI can bang so duoc khoI phuc, shorter doI fhanh false.

Truong bop Jb: Thong so cun bung cuu q gong vo thong so cun
bung cuu p. Thuc hIon mof phop quuy don do chuyon cac fhong so
nay tbanb equal_height, shorter oan /a true.

Truong bop Jc: Thong so cun bung cuu q nguoc vo thong so cun
bung cuu p. Thuc hIon mof phop quuy kep |fruoc hof quay quanh q,
sau do quay quanh p), fhong so can bang cua goc moI so Ia
equal_height, cac fhong so can bang cua p va q duoc bIon doI fhch
hop, shorter van Ia true.

Trong cac fruong hop 3a, b, c, chIou cua cac phop quay phu fhuoc vao cay con
fraI hay cay con phaI bj ngan dI. Hnh 9.21 mInh hoa mof vaI fruong hop, va mof
v du IoaI mof nuf duoc mInh hoa frong hnh 9.22.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 232



HInh 9.21 Cac fruong hop IoaI mof nuf ra khoI cay AVI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 233



HInh 9.22 V du IoaI mof nuf ra khoI cay AVI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 234
9.5.4. Cheu cuo cuu cuy AVL
VIoc fm chIou cao cua mof cay AVI frung bnh Ia mof vIoc raf kho, do do vIoc
xac djnh so buoc frung bnh can fhuc hIon boI cac gIaI fhuaf frong phan nay cung
khong do. Cach do nhaf cho chung fa Ia xac djnh nhung g so xay ra frong fruong
hop xau nhaf, va cac kof qua nay so cho chung fa fhay rang cac hanh vI cua cay
AVI frong fruong hop xau nhaf cung khong fo hon cac hanh vI cua cac cay ngau
nhIon. ang chung fhuc nghIom cho fhay cac hanh vI frung bnh cua cac cay AVI
fof hon raf nhIou so voI cac cay ngau nhIon, hau nhu no con fof ngang voI nhung
g so co duoc fu mof cay can bang hoan foan.

o xac djnh chIou cao foI da co fho co duoc cua mof cay AVI co n nuf, chung
fa so xom fhu voI mof chIou cao h cho fruoc, cay AVI so co so nuf foI fhIou Ia bao
nhIou. CoI I
h
Ia mof cay nhu vay, fh cay con fraI va cay con phaI cua nuf goc cua
I
h


so Ia I
I
va I
r
. Mof frong haI cay con nay phaI co chIou cao Ia h-1, gIa su cay I
I
,
va cay con con IaI co chIou cao h-1 hoac h-2. o I
h
co so nuf foI fhIou cua mof cay
AVI co chIou cao h, I
I
cung phaI co so nuf foI fhIou cua cay AVI cao h-1 |co
nghIa Ia I
I
co dang I
h-1
), va I
r
phaI co chIou cao h-2 voI so nuf foI fhIou |I
r
co
dang I
h-2
).

Cac cay duoc fao boI quy fac fron, nghIa Ia cac cay fhoa dIou kIon cay AVI
nhung cang fhua cang fof, duoc goI Ia cac cay Fibonacci. Mof so f cay dau fIon co
fho duoc fhay frong hnh 9.23.

VoI ky hIou 1T1 bIou dIon so nuf frong cay T, chung fa co cong fhuc sau:

1 I
h
1 = 1 I
h-1
1 + 1 I
h-2
1 + 1.


HInh 9.23 Cac cay IIbonaccI
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 235
voI 1 I
0
1 = 1 va 1 I
1
1 = 2. ang cach fhom 1 vao ca haI vo, chung fa fhay
con so 1 I
h
1+1 fhoa djnh nghIa cua cac so Fibonacci bac 2. ang cach fnh cac
so Fibonacci chung fa co

1 I
h
1+1


Iay /ogarit haI vo va chI gIu IaI cac so Ion chung fa co

h 1.44 Ig 1 I
h
1.

Kof qua cho fhay mof cay AVI n nuf fhua nhaf so co chIou cao xap xI 1.44 Ig
n. Mof cay nhj phan can bang hoan foan co n nuf co chIou cao bang Ig n, con cay
suy fhoaI so co chIou cao Ia n. ThoI gIan chay cac gIaI fhuaf fron cay AVI duoc
bao dam khong vuof qua 44 phan fram fhoI gIan can fhIof doI voI cay foI uu.
Trong fhuc fo, cac cay AVI con fof hon raf nhIou. Iou nay co fho duoc chung
mInh nhu sau, ngay ca doI voI cac cay Fibonacci - cac cay AVI frong fruong hop
xau nhaf fhoI gIan fm kIom frung bnh chI co 4 phan fram Ion hon cay foI uu.
Phan Ion cac cay AVI so khong fhua fhof nhu cac cay Fibonacci, va do do fhoI
gIan fm kIom frung bnh fron cac cay AVI frung bnh raf gan voI cay foI uu.
Thuc nghIom cho fhay so Ian so sanh frung bnh khoang Ig n + 0.25 khI n Ion.
1 1+ 5

5 2
h+2
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 9 Cay nh phan
Giao trnh Cau truc D lieu va Giai thuat 236





Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 237
Chng 10 CAY NHK NHANH

Chuong nay fIop fuc nghIon cuu vo cac cau fruc du IIou cay, fap frung vao cac
cay ma so nhanh faI moI nuf nhIou hon haI. Chung fa baf dau fu vIoc frnh bay
cac moI noI frong cay nhj phan. Ko fIop chung fa fm hIou vo mof Iop cua cay goI
Ia trie duoc xom nhu fu dIon chua cac fu. Sau do chung fa fm hIou don cay B-tree
co y nghIa raf Ion frong vIoc fruy xuaf fhong fIn frong cac fap fIn. MoI phan
frong so nay doc Iap voI cac phan con IaI. CuoI cung, chung fa ap dung y fuong
cua B-tree do co duoc mof Iop khac cua cay nhj phan fm kIom goI Ia cay do-don
|red-black tree).
10.1. Vuon cuy, cuy, vu cuy nh{ phun
Nhu chung fa da fhay, cay nhj phan Ia mof dang cau fruc du IIou don gIan va
hIou qua. Tuy nhIon, voI mof so ung dung can su dung cau fruc du IIou cay ma
frong do so con cua moI nuf chua bIof fruoc, cay nhj phan voI han cho moI nuf chI
co foI da haI con khong dap ung duoc. Phan nay Iam sang fo mof dIou ngac nhIon
fhu vj va huu ch: cay nhj phan cung cap mof kha nang bIou dIon nhung cay khac
bao quaf hon.
10.1.1. Cuc ten go cho cuy
Truoc khI mo rong vo cac IoaI cay, chung fa xof don cac djnh nghIa. Trong
foan hoc, khaI nIom cay co mof y nghIa rong: do Ia mof fap baf ky cac dIom |goI
Ia dnh), va fap baf ky cac cap noI haI dInh khac nhau |goI Ia cunh hoac nhanh)
sao cho Iuon co mof day IIon fuc cac canh |duong d) fu mof dInh baf ky don mof
dInh baf ky khac, va khong co chu frnh, nghIa Ia khong co duong dI nao baf dau
fu mof dInh nao do IaI quay vo chnh no.

oI voI cac ung dung frong may fnh, chung fa fhuong khong can nghIon cuu
cay mof cach fong quaf nhu vay, va khI can Iam vIoc voI nhung cay nay, do nhan
manh, chung fa fhuong goI chung Ia cac cuy tu do |free tree). Cac cay cua chung
fa phan Ion Iuon co mof dInh dac bIof, goI Ia goc cua cay, va cac cay dang nay
chung fa so goI Ia cac cuy co goc |rooted tree).

Mof cay co goc co fho duoc vo fhoo cach fhong fhuong cua chung fa Ia goc nam
fron, cac nuf va nhanh khac quay xuong duoI, voI cac nuf Ia nam duoI cung. Mac
du vay, cac cay co goc van chua phaI Ia faf ca cac dang cay ma chung fa fhuong
dung. Trong mof cay co goc, fhuong khong phan bIof fraI hoac phaI, hoac khI mof
nuf co nhIou nuf con, khong fho noI rang nuf nao Ia nuf con fhu nhaf, fhu haI,
v.v...Nou khong v mof Iy do nao khac, su fhI hanh fuan fu cac Ionh fhuong buoc
chaf mof fhu fu Ion cac nuf con cua mof nuf. Chung fa djnh nghIa mof cay co fhu
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 238
fu |ordered tree) Ia mof cay co goc frong do cac con cua mof nuf duoc gan cho
mof fhu fu.
Iuu y rang cac cay co fhu fu ma frong do moI nuf co khong qua haI con van
chua phaI cung mof Iop voI cay nhj phan. Nou mof nuf frong cay nhj phan chI co
mof con, no co fho nam bon fraI hoac bon phaI, Iuc do fa co haI cay nhj phan
khac nhau, nhung chung cung Ia mof cay co fhu fu.

Nhu mof nhan xof cuoI cung IIon quan don cac djnh nghIa, chung fa hay Iuu y
rang cay 2-tree ma chung fa da nghIon cuu khI phan fch cac gIaI fhuaf o nhung
chuong fruoc Ia mof cay co goc |nhung khong nhaf fhIof phaI Ia cay co fhu fu) voI
dac fnh Ia moI nuf frong cay co 0 hoac 2 nuf con.

Hnh 10.1 cho fhay raf nhIou dang cay khac nhau voI so nuf nho. MoI Iop cay
ko fu cay dau fIon co duoc bang cach kof hop cac cay fu cac Iop co fruoc fhoo
nhIou cach khac nhau. Cac cay nhj phan co fho co duoc fu cac cay co fhu fu fuong
ung, bang cach phan bIof cac nhanh fraI va phaI.
HInh 10.1 - Cac dang khac nhau cua cay.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 239
10.1.2. Cuy co thu tu
10.1.2.1. Hen thuc trong muy tInh
Nou chung fa muon su dung mof cay co fhu fu nhu mof cau fruc du IIou, mof
cach hIon nhIon do hIon fhuc frong bo nho may fnh Ia mo rong cach hIon fhuc
chuan cua mof cay nhj phan, voI so con fro fhanh vIon frong moI nuf fuong ung
so cay con co fho co, fhay v chI co haI nhu doI voI cay nhj phan. Chang han,
frong mof cay co mof vaI nuf co don muoI cay con, chung fa can phaI gIu don
muoI con fro fhanh vIon frong mof nuf. Nhung nhu vay so dan don vIoc cay phaI
chua mof so raf Ion cac con fro chua frj NULL. Chung fa co fho fnh duoc chnh
xac con so nay. Nou cay co n nuf, moI nuf co k con fro fhanh vIon, fh so co faf ca
Ia n x k con fro. MoI nuf co chnh xac Ia mof con fro fham chIou don no, ngoaI fru
nuf goc. Nhu vay co n-1 con fro khac NULL. TI Io cac con fro NULL so Ia:

> 1 -

Nou mof nuf co fho co muoI cay con, fh co hon 90% con fro Ia NULL. Ro rang
Ia phuong phap bIou dIon cay co fhu fu nay hao fon raf nhIou vung nho. Iy do Ia
v, frong moI nuf, chung fa da gIu mof danh sach IIon fuc cac con fro don faf ca
cac con cua no, va cac danh sach IIon fuc nay chua qua nhIou vung nho chua duoc
su dung. Chung fa can fm cach fhay fho cac danh sach IIon fuc nay boI cac danh
sach IIon kof.
10.1.2.2. Hen thuc len ket
o nam cac con cua mof nuf frong mof danh sach IIon kof, chung fa can haI
IoaI fham chIou. Thu nhaf Ia fham chIou fu nuf cha don nuf con dau fIon bon fraI
cua no, chung fa so goI Ia first_child. Thu haI, moI nuf, ngoaI fru nuf goc, so
xuaf hIon nhu mof phan fu frong danh sach IIon kof nay, do do no can fhom mof
fham chIou don nuf ko frong danh sach, nghIa Ia fham chIou don nuf con ko fIop
cung cha. Tham chIou fhu haI nay duoc goI Ia next_sibling. HIon fhuc nay duoc
mInh hoa frong hnh 10.2.

(n x k) (n 1)

n x k
1

k

HInh 10.2 HIon fhuc IIon kof cua cay co fhu fu
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 240
10.1.2.3. Su tuong ung tu nhen
oI voI moI nuf cua cay co fhu fu chung fa da djnh nghIa haI fham chIou
first_child va next_sibling. ang cach su dung haI fham chIou nay chung fa
co duoc cau fruc cua mof cay nhj phan, nghIa Ia, hIon fhuc IIon kof cua mof cay co
fhu fu Ia mof cay nhj phan IIon kof. Nou muon, chung fa co fho co duoc mof hnh
anh do nhn hon cho cay nhj phan bang cach su dung hIon fhuc IIon kof cua cay
co fhu fu va quay fhoo chIou kIm dong ho mof goc nho, sao cho cac fham chIou
huong xuong |first_child) huong sang fraI, va cac fham chIou nam ngang
|next_sibling) huong sang phaI. oI voI hnh 10.2, chung fa co duoc cay nhj
phan o hnh 10.3.

10.1.2.4. Su tuong ung nguoc lu
CIa su nhu chung fa Iam nguoc IaI cac buoc cua qua frnh fron, baf dau fu mof
cay nhj phan va co gang khoI phuc IaI mof cay co fhu fu. Iou quan saf dau fIon
chung fa can nhan fhay Ia khong phaI moI cay nhj phan dou co fho co duoc fu
mof cay co fhu fu boI qua frnh fron: do fham chIou next_sibling cua nuf goc
cua cay co fhu fu Iuon bang NULL non goc cua cay nhj phan fuong ung Iuon co cay
con bon phaI rong. o fm hIou su fuong ung nguoc IaI nay mof cach can fhan,
chung fa can phaI xom xof mof Iop cau fruc du IIou khac qua mof so djnh nghIa
moI duoI day.




HInh 10.3 Hnh da duoc quay cua hIon fhuc IIon kof
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 241
10.1.3. Rung vu vuon
Trong qua frnh fm hIou vo cay nhj phan chung fa da co kInh nghIom vo cach
su dung do quy, doI voI cac Iop khac cua cay chung fa cung so fIop fuc Iam nhu
vay. Su dung do quy co nghIa Ia fhu hop van do fhanh van do nho hon. o do
chung fa non xom fhu dIou g so xay ra nou chung fa Iay mot cuy co goc hoac
mot cuy co thu tu va caf bo dI nuf goc. Nhung phan con IaI, nou khong rong, so
Ia mot tup cuc cuy co goc hoac mot tup co thu tu cuc cuy co thu tu fuong
ung.
Thuaf ngu chuan do goI mof fap fruu fuong cac cay do Ia rung |forest), nhung
khI chung fa dung fhuaf ngu nay, noI chung chung fa fhuong hnh dung do Ia cac
cuy co goc. Cum fu rung co fhu fu |ordered forest) doI khI con duoc su dung do
goI tup co thu tu cuc cuy co thu tu, do do chung fa so do cu mof fhuaf ngu co
fnh dac fa fuong fu cho lop cuc cuy co thu tu, do Ia fhuaf ngu vuon |orchard).

Iuu y rang chung fa khong chI co duoc mof rung hoac mof vuon nho vao
cach IoaI bo dI nuf goc cua mof cuy co goc hoac mof cuy co thu tu , chung fa
con co fho fao non mof cuy co goc hoac mof cuy co thu tu bang cach baf dau fu
mof rung hoac mof vuon, fhom mof nuf moI faI dInh, va noI cac nhanh fu nuf
moI nay don goc cua faf ca cac cay frong rung hoac vuon do. Cach nay duoc mInh
hoa frong hnh 10.4.
Chung fa so su dung qua frnh nay do dua ra mof djnh nghIa do quy moI cho
cac cay co fhu fu va cac vuon. Truoc hof, chung fa hay xom fhu non baf dau nhu
fho nao. Chung fa nho rang mof cay nhj phan co fho rong. Mof rung hay mof
vuon cung co fho rong. Tuy nhIon mof cay co goc hay mof cay co fhu fu khong fho
Ia cay rong, v no phaI chua f nhaf Ia mof nuf goc. Nou chung fa muon baf dau
xay dung cay va rung, chung fa co fho Iuu y rang mof cay voI chI mof nuf co fho
co duoc bang cach fhom mof goc moI vao mof rung dang rong. Mof khI chung fa
da co cay nay roI fh chung fa co fho fao duoc mof rung gom bao nhIou cay mof
nuf cung duoc. Sau do chung fa co fho fhom goc moI do fao cac cay co goc chIou

HInh 10.4 IoaI bo va fhom nuf goc.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 242
cao Ia 1. ang cach nay chung fa co fho fIop fuc fao non cac cay co goc phu hop
voI djnh nghIa do quy sau:

nh ngha: Mof cuy co goc |rooted tree) bao gom mof nuf don , goI Ia goc
|root) cua cay, va mof rung I |forest) gom cac cay goI Ia cac cay con
cua nuf goc.

Mof rung F Ia mof fap |co fho rong) cac cay co goc.

Mof qua frnh fao fuong fu cho cac cay co fhu fu va vuon.

nh ngha: Mof cuy co thu tu T |ordered tree) bao gom mof nuf don , goI Ia
goc |root) cua cay,va mof vuon O |orchard) gom cac cay duoc goI Ia cac
cay con cua goc .

Chung fa co fho bIou dIon cay co fhu fu bang mof cap co fhu fu

T = {, Ol.

Mof vuon O hoac Ia mof fap rong, hoac gom mof cay co fhu fu T, goI Ia cay fhu
nhaf |first tree) cua vuon, va mof vuon khac O |chua cac cay con IaI cua vuon).
Chung fa co fho bIou dIon vuon bang mof cap co fhu fu

O = |T, O).

Iuu y rang fhu fu cua cac cay an chua frong djnh nghIa cua vuon. Mof vuon
khong rong chua cay fhu nhaf va cac cay con IaI fao non mof vuon khac, vuon
nay IaI co mof cay fhu nhaf va Ia cay fhu haI cua vuon ban dau. TIop fuc doI voI
cac vuon con IaI chung fa co cay fhu ba, fhu fu, v.v...cho don khI vuon cuoI cung Ia
mof vuon rong. Xom hnh 10.5.
HInh 10.5 Cau fruc do quy cua cac cay co fhu fu va vuon.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 243
10.1.4. Su tuong ung hInh thuc
ay gIo chung fa co fho co mof kof qua mang fnh nguyon fac cho phan nay.

jnh Iy: Cho S la mot tap hu han bat ky gom cac nut. Co mot anh xa mot-mot f
t tap cac vn co tap nut la S en tap cac cay nh phan co tap nut la S.

Chng minh nh ly:
Chung fa so dung nhung ky hIou frong cac djnh nghIa do chung mInh djnh Iy
fron. Truoc hof chung fa can mof ky hIou fuong fu cho cay nhj phan. Mof cay nhj
phan hoac Ia mof fap rong hoac gom mof nuf goc va haI cay nhj phan
1

va
2
. Ky hIou cho mof cay nhj phan khong rong Ia mof bo ba

= ,
1
,
2
|.

Chung fa so chung mInh djnh Iy bang phuong phap quy nap foan hoc fron so
nuf frong S. Truong hop fhu nhaf duoc xof Ia mof vuon rong , fuong ung voI
mof cay nhj phan rong.

f|) = .

Nou vuon O khong rong, no duoc ky hIou bang mof bo haI

O = |T, O
2
)

voI T Ia mof cay co fhu fu va O
2
Ia mof vuon khac. Cay fhu fu T duoc ky hIou
boI mof cap
T ={, O
1
l

voI Ia mof nuf va O
1
Ia mof vuon khac. Thay bIou fhuc T vao bIou fhuc O fa co
O = |{, O
1
l, O
2
).

Thoo gIa fhIof quy nap, f Ia mof anh xa mof-mof fu cac vuon co f nuf hon S don
cac cay nhj phan, voI O
1
va O
2
nho hon O, non cac cay nhj phan f|O
1
) va f|O
2
)
duoc xac djnh boI gIa fhIof quy nap. Nou chung fa djnh nghIa anh xa f fu mof
vuon don mof cay nhj phan boI

f|{, O
1
l, O
2
) = , f|O
1
), f|O
2
)|.

fh f Ia mof su fuong ung mof-mof gIua cac vuon va cac cay nhj phan co cung so
nuf. VoI baf ky cach fhay fho nao cho cac ky fu , O
1
, va O
2
o vo fraI dou co chnh
xac mof cach do fhay fho cho chung o vo phaI, va nguoc IaI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 244
10.1.5. Phep quuy
Chung fa co fho su dung dang ky hIou cua su fuong ung do hnh dung phop
bIon doI fu vuon sang cay nhj phan. Trong cay nhj phan , f|O
1
), f|O
2
)| fham
chIou fraI fu don nuf goc cua cay nhj phan f |O
1
), do Ia nuf con fhu nhaf cua
frong cay co fhu fu {, O
1
l. Tham chIou phaI fu don nuf von Ia goc cua cay co
fhu fu ko fIop vo bon phaI frong vuon. Co nghIa Ia, fham chIou fraI frong cay
nhj phan fuong ung voI con fhu nhaf frong cay co fhu fu, va fham chIou phaI
fuong ung om ko. Cac quy fac bIon doI frong hnh nhu sau:

1. Vo vuon sao cho con fhu nhaf cua moI nuf nam ngay duoI no, fhay v canh
khoang cach cho faf ca cac con nam dou bon duoI nuf nay.
2. Vo mof fham chIou fhang dung fu moI nuf don nuf con fhu nhaf cua no, va
vo mof fham chIou nam ngang fu moI nuf don om ko cua no.
3. IoaI bo faf ca cac fham chIou khac con IaI.
4. Quay so do 45 do fhoo chIou kIm dong ho, sao cho cac fham chIou fhang
dung fro fhanh cac fham chIou fraI va cac fham chIou nam ngang fro fhanh
cac fham chIou phaI.
5. Qua frnh nay duoc mInh hoa frong hnh 10.6

10.1.6. Tong ket
Chung fa da xom xof ba cach bIou dIon su fuong ung gIua cac vuon va cac cay
nhj phan:

Cac fham chIou Irst_chld va next_sblng.
Phop quay cac so do.
Su fuong duong ky hIou mof cach hnh fhuc.

NhIou nguoI cho rang cach fhu haI, quay cac so do, Ia cach do nho va do hnh
dung nhaf. Cach fhu nhaf, fao cac fham chIou, fhuong duoc dung do vIof cac
chuong frnh fhuc su. CuoI cung, cach fhu ba, su fuong duong ky hIou mof cach

HInh 10.6 Chuyon doI fu vuon sang cay nhj phan.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 245
hnh fhuc, fhuong raf co ch frong vIoc chung mInh raf nhIou dac fnh cua cay nhj
phan va vuon.
10.2. Cuy tu den tIm kem: Tre
Trong cac chuong fruoc chung fa da fhay su khac nhau frong vIoc fm kIom
frong mof danh sach va vIoc fra cuu frong mof bang. Chung fa co fho ap dung y
fuong frong vIoc fra cuu bang vao vIoc fruy xuaf fhong fIn frong mof cay bang
cach su dung mof khoa hoac mof phan cua khoa. Thay v fm kIom bang cach so
sanh cac khoa, chung fa co fho xom khoa nhu Ia mof chuoI cac ky fu |chu caI hoac
ky so), va su dung cac ky fu nay do xac djnh duong dI faI moI buoc. Nou cac khoa
cua chung fa chua cac chu caI, chung fa so fao mof cay co 26 nhanh fuong ung 26
chu caI Ia ky fu dau fIon cua cac khoa. MoI cay con bon duoI IaI co 26 nhanh
fuong ung voI ky fu fhu haI, va cu fho fIop fuc o cac muc cao hon. Tuy nhIon
chung fa cung co fho fIon hanh phan fhanh nhIou nhanh o mof so muc ban dau,
sau do nou cay fro non qua Ion, chung fa co fho dung mof vaI cach fhuc khac nao
do do sap fhu fu cho nhung muc con IaI.
10.2.1. Tres
Co mof phuong phap Ia caf fIa bof cac nhanh khong can fhIof frong cay. o Ia
cac nhanh khong dan don mof khoa nao. Iay v du, frong fIong Anh, khong co
cac fu baf dau boI bb, bc, bf, bg, ..., nhung co cac fu baf dau boI ba, bd, bo.
o do, moI nhanh va nuf cho cac fu khong fon faI co fho duoc IoaI khoI cay. Cay
kof qua nay duoc goI Ia Trie. Tu nay nguyon fhuy duoc Iay fu retrieval, nhung
fhuong duoc doc Ia try.

nh ngha: Mof cay Trie bac m co fho duoc djnh nghIa mof cach hnh fhuc Ia
mof cay rong hoac gom mof chuoI noI fIop co fhu fu cua m cay Trie
bac m.
10.2.2. TIm kem mot khou
CIa su cac fu co 3 ky fu co nghIa gom cac fu duoc Iuu frong cay Trie o hnh
10.7. VIoc fm kIom mof khoa duoc baf dau fu nuf goc. Ky fu dau fIon cua khoa
duoc dung do xac djnh nhanh nao can dI xuong. Nhanh can dI rong co nghIa Ia
khoa can fm chua co frong cay. Nguoc IaI, fron nhanh duoc chon nay, ky fu fhu
haI IaI duoc dung do xac djnh nhanh nao frong muc ko fIop can dI xuong, va cu
fho fIop fuc. KhI chung fa xof don cuoI fu, Ia chung fa da don duoc nuf co con fro
fham chIou don fhong fIn can fm. oI voI nuf fuong ung mof fu khong co nghIa
so co con fro fham chIou don fhong fIn Ia NULL. Chang han, fu u Ia phan dau cua
fu ubu, fu nay IaI Ia phan dau cua fu ubucu, nhung chuoI ky fu ubuc khong phaI
Ia mof fu co nghIa, do do nuf bIou dIon ubuc co con fro fham chIou fhong fIn Ia
NULL.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 246
10.2.3. Gu thuut C++
Chung fa so chuyon qua frnh fm kIom vua duoc mo fa fron fhanh mof
phuong fhuc fm kIom cac ban ghI co khoa Ia cac chuoI ky fu. Chung fa so su
dung phuong fhuc char key_letter(int position) fra vo ky fu faI vj fr
position frong khoa hoac ky fu rong nou khoa co chIou daI ngan hon position,
va ham phu fro int alphabetic_order(char symbol) fra vo fhu fu cua
symbol frong bang chu caI. Ham nay fra vo 0 cho ky fu rong, 27 cho cac ky fu
khong phaI chu caI. Trong hIon fhuc IIon kof, cay Trie chua mof con fro don nuf
goc cua no.

class Trie {
public: // Cac phuong fhuc cap nhaf, fm kIom, fruy xuaf.

private:
Trie_node *root;
};
HInh 10.? TrIo chua cac fu duoc cau fao fu a, b, c.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 247
MoI nuf cua Trie can chua mof con fro chI don mof ban ghI va mof mang cac
con fro don cac nhanh. So nhanh Ia 28 fuong ung kof qua fra vo cua
alphabetic_order.

const int num_chars = 28;
struct Trie_node {
// Cac fhuoc fnh
Record *data;
Trie_node *branch[num_chars];
// constructors
Trie_node();
};

Constructor cho Trie_node don gIan chI gan faf ca cac con fro Ia NULL.
10.2.4. TIm kem trong cuy Trie
Phuong fhuc sau fm mof ban ghI chua khoa cho fruoc frong cay Trie.

Error_code Trie::trie_search(const Key &target, Record &x) const
/*
post: Nou fm fhay khoa target, ban ghI x chua khoa so duoc fra vo, phuong fhuc fra vo
success. Nguoc IaI phuong fhuc fra vo not_present.
uses: Cac phuong fhuc cua Iop Key.
*/
{
int position = 0;
char next_char;
Trie_node *location = root;
while (location!=NULL&&(next_char=target.key_letter(position))!=' ')
{
location = location->branch[alphabetic_order(next_char)];
// I xuong dan cac nhanh fuong ung voI cac ky fu frong target.
position++;// o xof ky fu ko fIop cua target.
}

if (location != NULL && location->data != NULL) {
x = *(location->data);
return success;
}
else
return not_present;
}

Iou kIon kof fhuc vong Iap Ia con fro location bang NULL |khoa can fm
khong co frong cay), hoac ky fu ko Ia rong |da xof hof chIou daI khoa can fm).
Kof fhuc vong Iap, con fro location nou khac NULL chnh Ia con fro fham chIou
ban ghI chua khoa can fm.
10.2.5. Them phun tu vuo Trie
Thom mof phan fu vao cay Trie hoan foan fuong fu nhu fm kIom: Ian fhoo
cac nhanh do dI xuong cho don khI gap vj fr fhch hop, fao ban ghI chua du IIou
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 248
va cho con fro data chI don. Nou fron duong dI chung fa gap mof nhanh NULL,
chung fa phaI fao fhom cac nuf moI do dua vao cay sao cho co fho fao duoc mof
duong dI don nuf fuong ung voI khoa moI can fhom vao.

Error_code Trie::insert(const Record &new_entry)
/*
post: Nou khoa cua new_entry da co frong Trie, phuong fhuc fra vo duplicate_error.
Nguoc IaI new_entry duoc fhom vao Trie, phuong fhuc fra vo success.
uses: cac phuong fhuc cua cac Iop Record va Trie_node.
*/
{
Error_code result = success;
if (root == NULL) root = new Trie_node; // Tao mof cay Trie rong.
int position = 0; // Vj fr ky fu dang xof frong new_entry.
char next_char;
Trie_node *location = root; // I dan xuong cac nhanh frong Trie.
while (location != NULL &&
(next_char = new_entry.key_letter(position)) != ' ') {
int next_position = alphabetic_order(next_char);
if (location->branch[next_position] == NULL)
location->branch[next_position] = new Trie_node;
location = location->branch[next_position];
position++;
}
// Khong con nhanh do dI fIop hoac da xof hof cac ky fu cua new_entry.
if (location->data != NULL) result = duplicate_error;
else location->data = new Record(new_entry);
return result;
}

10.2.6. Lou phun tu trong Tre
Cach fhuc hIon cua vIoc fhom va fm kIom phan fu cung duoc ap dung cho vIoc
IoaI mof phan fu frong cay Trie. Chung fa Ian fhoo duong dI fuong ung voI khoa
can IoaI, khI gap nuf nay, chung fa gan NULL cho con fro data. Tuy nhIon, nou
nuf nay co faf ca cac fhuoc fnh dou Ia cac con fro NULL |cac cay con va con fro
data), chung fa can xoa Iuon chnh no. Va dIou nay can phaI duoc fhuc hIon cho
faf ca cac nuf fron cua no fron duong dI fu no nguoc vo nuf goc cho don khI gap
mof nuf co f nhaf mof fhuoc fnh fhanh vIon khac NULL. o Iam duoc dIou nay,
chung fa co fho fao mof ngan xop chua cac con fro don cac nuf fron duong dI fu
nuf goc don nuf can fm do IoaI. Hoac chung fa co fho su dung do quy frong gIaI
fhuaf IoaI phan fu nham franh vIoc su dung ngan xop mof cach fuong mInh. Ca
haI cach nay dou duoc xom nhu baI fap.
10.2.7. Truy xuut Tre
So buoc can fhuc hIon do fm kIom frong cay Trie |hoac fhom nuf moI vao
Trie) fI Io voI so ky fu fao non mof khoa, khong phu fhuoc vao logarit cua so
khoa nhu cac cach fm kIom dua fron cac cay khac. Nou so ky fu nho so voI
logarit co so 2 cua so khoa, cay Trie fo ra co uu fho hon cay nhj phan fm kIom
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 249
nhIou. Iay v du, cac khoa gom moI kha nang cua mof chuoI 5 ky fu, fh cay Trie
co fho chua don n = 26
5
= 11,881,376 khoa voI moI Ian fm kIom foI da Ia 5 Ian
Iap do dI xuong 5 muc, frong khI do cay nhj phan fm kIom fof nhaf co fho fhuc
hIon don Ig n 23.5 Ian so sanh cac khoa.

Tuy nhIon, frong nhIou ung dung co so ky fu frong mof khoa Ion, va fap cac
khoa fhuc su xuaf hIon IaI f so voI moI kha nang co fho co cua cac khoa. Trong
fruong hop nay, so Ian Iap can co do fm mof khoa frong cay Trie co fho vuof xa
so Ian so sanh cac khoa can co frong cay nhj phan fm kIom.

CuoI cung, IoI gIaI fof nhaf co fho Ia su kof hop cua nhIou phuong phap. Cay
Trie co fho duoc su dung cho mof f ky fu dau cua cac khoa, va sau do mof phuong
phap khac co fho duoc su dung cho phan con IaI cua khoa.
10.3. TIm kem ngou: B-tree
Tu fruoc don nay, chung fa da gIa su rang moI cau fruc du IIou dou duoc gIu
frong bo nho foc do cao; nghIa Ia chung fa da chI xom xof vIoc fruy xuaf fhong fIn
frong |internal information retrieval). VoI mof so ung dung, gIa fhIof nay co fho
chap nhan duoc, nhung voI nhIou ung dung quan frong khac fh khong. Chung fa
hay xom xof van do fruy xuaf fhong fIn ngoaI |external information retrieval),
frong do cac ban ghI can fm kIom va fruy xuaf duoc Iuu frong cac fap fIn.
10.3.1. Tho gun truy xuut
ThoI gIan can co do fham nhap va fruy xuaf mof fu frong bo nho foc do cao
nhIou nhaf Ia mof vaI mIcrogIay. ThoI gIan can do djnh vj mof ban ghI frong dIa
cung duoc do bang mIIIgIay, doI voI dIa mom co fho vuof qua mof gIay. Nhu vay
fhoI gIan cho mof Ian fruy xuaf ngoaI Ion gap hang ngan Ian so voI mof Ian fruy
xuaf frong. KhI mof ban ghI nam frong dIa, fhuc fo moI Ian khong phaI chI doc
mof fu, ma doc mof frang Ion |page) hay con goI Ia mof khoI |block) fhong fIn.
Kch fhuoc chuan cua khoI fhuong fu 256 don 1024 ky fu hoac fu.

Muc dch cua chung fa frong vIoc fm kIom ngoaI Ia phaI Iam foI fhIou so Ian
fruy xuaf dIa, do moI Ian fruy xuaf chIo m fhoI gIan dang ko so voI cac fnh foan
bon frong bo nho. MoI Ian fruy xuaf dIa, chung fa co duoc mof khoI ma co fho
chua nhIou ban ghI. ang cach su dung cac ban ghI nay, chung fa co fho chon Iua
gIua nhIou kha nang do quyof djnh khoI nao so duoc fruy xuaf ko fIop. Nho do ma
foan bo du IIou khong can phaI Iuu dong fhoI frong bo nho. KhaI nIom cay nhIou
nhanh ma chung fa so xom xof duoI day dac bIof fhch hop doI voI vIoc fm kIom
ngoaI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 250
10.3.2. Cuy tIm kem nheu nhunh
Cay nhj phan fm kIom duoc fong quaf hoa mof cach fruc fIop don cay fm
kIom nhIou nhanh, frong do, voI mof so nguyon m nao do duoc goI Ia bac |order)
cua cay, moI nuf co nhIou nhaf m nuf con. Nou k |k m) Ia so con cua mof nuf fh
nuf nay chua chnh xac Ia k-1 khoa, va cac khoa nay phan hoach faf ca cac khoa
cua cac cay con fhanh k fap con. Hnh 10.8 cho fhay mof cay fm kIom co 5
nhanh nam xon ko cac phan fu fu fhu 1 va don fhu 4 frong moI nuf, frong do
mof vaI nhanh co fho rong.


10.3.3. Cuy nheu nhunh cun bung
CIa su moI Ian doc fap fIn, chung fa doc Ion duoc mof khoI chua cac khoa
frong cung mof nuf. Nho su phan hoach cac khoa frong cac cay con dua fron cac
khoa nay, chung fa bIof duoc nhanh nao chung fa can fIop fuc cong vIoc fm kIom
khoa can fm. ang cach nay so Ian doc dIa foI da chnh Ia chIou cao cua cay. Va
chI ph bo nho cung chI danh foI da Ia cho cac nuf fron duong dI fu nuf goc don
nuf co khoa can fm, chu khong phaI foan bo du IIou Iuu frong cay.

Muc dch cua chung fa su dung cay fm kIom nhIou nhanh do Iam gIam vIoc
fruy xuaf fap fIn, do do chung fa mong muon chIou cao cua cay cang nho cang fof.
Chung fa co fho fhuc hIon dIou nay bang cach cho rang, fhu nhaf, khong co cac
cay con rong xuaf hIon bon fron cac nuf Ia |nhu vay su phan hoach cac khoa
fhanh cac fap con so hIou qua nhaf); fhu haI, rang moI nuf Ia dou fhuoc cung mof
muc |do cho vIoc fm kIom duoc bao dam Ia so kof fhuc voI cung so Ian fruy xua f

HInh 10.8 Mof cay fm kIom 5 nhanh |khong phaI cay -froo)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 251
fap fIn); va, fhu ba, rang moI nuf, ngoaI fru cac nuf Ia co f nhaf mof so nuf con
foI fhIou nao do. Chung fa dua ra you cau ra ng, moI nuf, ngoaI fru cac nuf Ia, co f
nhaf Ia mof nua so con so voI so con foI da co fho co. Cac dIou kIon fron dan don
djnh nghIa sau:

nh ngha: Mof cay B-tree buc m Ia mof cay m nhanh, frong do,
1. MoI nuf Ia co cung muc.
2. MoI nuf frung gIan |khong phaI nuf Ia va nuf goc), co nhIou nhaf m nuf con
khac rong, f nhaf Ia m/2 nuf con khac rong.
3. So khoa frong moI nuf frong nho hon so nuf con khac rong 1 don vj, va cac
khoa nay phan hoach cac khoa frong cac cay con fhoo cach cua cay fm kIom.
4. Nuf goc co nhIou nhaf m nuf con, va nou no khong do ng fhoI Ia nuf Ia |fruong
hop cay chI co 1 nuf), fh no co fho co f nhaf Ia 2 nuf con.

Cay frong hnh 10.8 khong phaI Ia cay B-tree, do mof vaI nuf co cac nuf con
rong, mof vaI nuf co qua f con, va cac nuf Ia khong cung mof muc. Hnh 10.9
mInh hoa mof cay B-tree co bac Ia 5 voI cac khoa Ia cac ky fu chu caI. Truong
hop nay moI nuf frung gIan co f nhaf 3 nuf con |phan hoach boI 2 khoa).


10.3.4. Them phun tu vuo B-tree
Iou kIon moI nuf Ia fhuoc cung muc nhan manh hanh vI dac frung cua B-
tree: Nguoc voI cay nhj phan fm kIom, B-tree khong cho phop Ion Ion faI cac
nuf Ia; fhay vao do, no Ion Ion faI goc. Phuong phap chung do fhom phan fu vao
no nhu sau. Truoc hof, fhuc hIon vIoc fm kIom do xom khoa can fhom da co
frong cay hay chua. Nou chua co, vIoc fm kIom so kof fhuc faI mof nuf Ia. Khoa
moI so duoc fhom vao nuf Ia. Nou nuf Ia von chua day, vIoc fhom vao hoan faf.


HInh 10.9 Cay B-tree bac 5.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 252
KhI nuf Ia can fhom phan fu moI da day, nuf nay so duoc phan Iam haI nuf canh
nhau frong cung mof muc, khoa chnh gIua so khong fhuoc nuf nao frong haI nuf
nay, no duoc goI nguoc Ion do fhom vao nuf cha. Nho vay, sau nay, khI can fm
kIom, su so sanh voI khoa gIua nay so dan duong xuong fIop cay con fuong ung
bon fraI hoac bon phaI. Qua frnh phan doI cac nuf co fho duoc Ian fruyon nguoc
vo goc. Qua frnh nay so cham duf khI co mof nuf cha nao do can duoc fhom mof
khoa goI fu duoI Ion ma chua day. KhI mof khoa duoc fhom vao nuf goc da day,
nuf goc so duoc phan Iam haI va khoa nam gIua cung duoc goI nguoc Ion, va no so
fro fhanh mof goc moI. o chnh Ia Iuc duy nhaf cay B-tree fang fruong chIou
cao.

Qua frnh nay co fho duoc Iam sang fo bang v du fhom vao cay B-tree cap 5
o hnh 10.10. Chung fa so Ian Iuof fhom cac khoa

a g f b k d h m j e s i r x c l n t u p

vao mof cay rong fhoo fhu fu nay.

on khoa dau fIon so duoc fhom vao chI mof nuf, nhu frong phan dau cua hnh
10.10. Chung duoc sap fhu fu ngay khI duoc fhom vao. Tuy nhIon, doI voI khoa
fhu nam, k, nuf nay khong con cho. Nuf nay duoc phan Iam haI nuf moI, khoa
nam gIua, I, duoc chuyon Ion fron va fao non nuf moI, do cung Ia goc moI. o cac
nuf sau khI phan chIa chI chua mof nua so khoa co fho co, ba khoa fIop fhoo co
fho duoc fhom vao ma khong gap kho khan g. Tuy nhIon, vIoc fhom vao don gIan
nay cung doI hoI vIoc fo chuc IaI cac khoa frong mof nuf. o fhom j, mof Ian nua
IaI can phan chIa mof nuf, va Ian nay khoa chuyon Ion fron chnh Ia j.

Mof so Ian fhom cac khoa fIop fhoo duoc fhuc hIon fuong fu. Ian fhom cuoI
cung, p, dac bIof hon. VIoc fhom p vao fruoc fIon Iam phan chIa mof nuf von
chua k, l, m, n, va goI khoa nam gIua m Ion fron cho nuf cha chua c, I, j, r, fuy
nhIon, nuf nay da day. Nhu vay, nuf nay IaI phan chIa Iam haI nuf moI, va cuoI
cung nuf goc moI chua j duoc fao ra.

Co haI dIom can chu y khI quan saf su Ion Ion co fraf fu cua B-tree. Thu
nhaf, khI mof nuf duoc phan doI, no fao ra haI nuf moI, moI nuf chI co mof nua
so phan fu foI da co fho co. Nho do, nhung Ian fhom fIop fhoo co fho khong can
phaI phan chIa nuf Ian nua. Nhu vay mof Ian phan chIa nuf Ia chuan bj cho mof
vaI Ian fhom don gIan. Thu haI, khoa duoc chuyon Ion fron Iuon Ia khoa nam gIua
chu khong phaI chnh khoa can fhom vao. o do, nhIou Ian fhom Iap IaI so co
chIou huong caI fhIon su can bang cho cay, khong phu fhuoc vao fhu fu cac khoa
duoc fhom vao.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 253

10.3.5. Gu thuut C++: tIm kem vu them vuo
o phaf frIon fhanh gIaI fhuaf C++ fm kIom va fhom vao mof cay B-tree,
chung fa hay baf dau voI cac khaI bao cho cay. o don gIan chung fa so xay dung
cay B-tree frong bo nho foc do cao, su dung cac con fro chua dja chI cac nuf
frong cay. Trong phan Ion cac ung dung, cac con fro nay co fho duoc fhay fho boI


HInh 10.10 Su Ion Ion cua cay -froo.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 254
dja chI cua cac khoI hoac frang frong dIa, hoac so fhu fu cac ban ghI frong fap
fIn.
10.3.5.1. Cuc khu buo
Chung fa so cho nguoI su dung fu do chon Iua kIou cua ban ghI ma ho muon
Iuu vao cay B-tree. Iop B-tree cua chung fa, va Iop node fuong ung, so co
fhong so template Ia Iop Record. Thong so template fhu haI so Ia mof so
nguyon bIou dIon bac cua B-tree. o co duoc mof doI fuong B-tree, nguoI su
dung chI vIoc khaI bao mof cach don gIan, chang han:B-tree<int, 5>
sample_tree, so khaI bao sample_tree Ia mof cay B-tree bac 5 chua cac ban
ghI Ia cac so nguyon.

template <class Record, int order>
class B_tree {
public: // Cac phuong fhuc.

private: // Thuoc fnh:
B_node<Record, order> *root;
// Cac ham phu fro.
};

on frong moI nuf cua B-tree chung fa can mof danh sach cac phan fu va
mof danh sach cac con fro don cac nuf con. o cach danh sach nay ngan, do don
gIan, chung fa dung cac mang IIon fuc va mof fhuoc fnh count do bIou dIon
chung.

template <class Record, int order>
struct B_node {
// Cac fhuoc fnh:
int count;
Record data[order - 1];
B_node<Record, order> *branch[order];
// constructor:
B_node();
};

Thuoc fnh count chua so ban ghI hIon faI frong fung nuf. Nou count khac 0
fh nuf co count+1 nuf con khac rong. Nhanh branch[0] chI don cay con chua
cac ban ghI co cac khoa nho hon khoa frong data[0]; voI moI frj cua position
nam gIua 1 va count-1, ko ca haI can nay, branch[position] chI don cay con
co cac khoa nam gIua haI khoa cua data[position-1] va data[position]; va
branch[count] chI don cay con co cac khoa Ion hon khoa frong data[count-
1].

Constructor cua B_node fao mof nuf rong bang cach gan count bang 0.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 255
10.3.5.2. TIm kem
Nhu v du don gIan dau fIon, chung fa vIof phuong fhuc fm kIom frong mof
cay B-tree cho mof ban ghI co khoa frung voI khoa cua target. Trong phuong
fhuc fm kIom cua chung fa, nhu fhuong Io, chung fa so gIa fhIof rang cac ban ghI
nay co fho duoc so sanh boI cac foan fu so sanh chuan. Cung nhu vIoc fm kIom
frong cay nhj phan fm kIom, chung fa baf dau bang cach goI mof ham do quy
phu fro.

template <class Record, int order>
Error_code B_tree<Record, order>::search_tree(Record &target)
/*
post: Nou fm fhay phan fu co khoa frung voI khoa frong target fh foan bo ban ghI phan fu
nay duoc chop vao target, phuong fhuc fra vo success. Nguoc IaI, phuong fhuc fra vo
not_present .
uses: Ham do quy phu fro recursive_search_tree
*/
{
return recursive_search_tree(root, target);
}

Thong so vao cho ham do quy phu fro recursive_search_tree Ia con fro
don goc cua cay con frong B-tree va ban ghI target chua khoa can fm. Ham so
fra vo ma IoI cho bIof vIoc fm kIom kof fhuc fhanh cong hay khong; nou fm
fhay, target duoc cap nhaf boI ban ghI chua khoa duoc fm fhay frong cay.

Phuong phap chung do fm kIom bang cach Ian fhoo cac con fro do dI xuong
frong cay fuong fu cach fm kIom frong cay nhj phan fm kIom. Tuy nhIon, frong
mof cay nhIou nhanh, chung fa can fon nhIou cong hon frong vIoc xac djnh ra
nhanh can xuong fIop fhoo frong moI nuf. VIoc nay so duoc fhuc hIon boI mof
ham phu fro khac cua B-tree Ia search_node, ham nay fm ban ghI co khoa
frung voI khoa cua target frong so cac ban ghI co frong nuf duoc fham chIou boI
con fro current. Ham search_node co su dung fham bIon position, nou fm
fhay, fham bIon nay so nhan vo chI so cua ban ghI chua khoa can fm frong nuf
fham chIou boI current; nguoc IaI no chua chI so cua nhanh bon duoI fIop fhoo
can fm.

template <class Record, int order>
Error_code B_tree<Record, order>::recursive_search_tree
(B_node<Record, order> *current, Record &target)
/*
pre: current Ia NULL hoac chI don goc mof cay con frong B_tree.
post: Nou khoa frong target khong fm fhay, ham fra vo not_present. Nguoc IaI, target
duoc cap nhaf boI ban ghI co chua khoa fm duoc frong cay, ham fra vo success.
uses: Ham phu fro recursive_search_tree mof cach do quy va ham search_node.
*/
{
Error_code result = not_present;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 256
int position;
if (current != NULL) {
result = search_node(current, target, position);
if (result == not_present)
result=recursive_search_tree(current->branch[position],
target);
else
target = current->data[position];
}
return result;
}

Ham fron duoc vIof do quy do chung fo su fuong fu gIua cau fruc cua no voI cau
fruc cua ham fhom phan fu frong phan fIop fhoo duoI day. Tuy nhIon, day Ia do
quy duoI, va no co fho duoc fhay boI cau fruc Iap.
10.3.5.3. TIm kem trong mot nut
Ham search_node duoI day fhuc hIon vIoc fm fuan fu. Ham nay can xac
djnh xom target da co frong nuf hIon faI hay chua, nou chua, no can xac djnh
nhanh nao frong so count+1 nhanh Ia chua target. uoI day Ia cach fm fuan
fu voI bIon fam chay fu 0 don vj fr fm fhay hoac vua vuof qua khoa cua
target.

template <class Record, int order>
Error_code B_tree<Record, order>::search_node
(B_node<Record, order> *current, const Record &target, int &position)
/*
pre: current chua dja chI 1 nuf frong B_tree.
post: Nou khoa frong target duoc fm fhay frong *current, fhong so position so chua vj fr
cua phan fu target frong nuf nay, target duoc cap nhaf IaI, ham fra vo success.
Nguoc IaI, ham fra vo not_present, position so Ia chI so cua nhanh con bon duoI can
fIop fuc vIoc fm kIom.
uses: Cac phuong fhuc cua Iop Record.
*/
{
position = 0;
while (position < current->count && target >current->data[position])
position++; // Tm fuan fu.
if (position < current->count && target == current->data[position])
return success;
else
return not_present;
}

oI voI cay B-tree co cac nuf kha Ion, ham fron can duoc sua doI do su dung
cach fm nhj phan fhay v fm fuan fu. Trong mof vaI ung dung, moI ban ghI cua
cay B-tree chua raf nhIou du IIou, dIou nay Iam cho bac cua cay fro non fuong
doI nho, va vIoc fm fuan fu frong mof nuf Ia fhch hop. Trong nhIou ung dung
khac, chI co cac khoa Ia duoc chua frong cac nuf, non bac cua cay fro non kha Ion,
chung fa can dung cach fm nhj phan do fm vj fr cua mof khoa frong mof nuf.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 257

Mof kha nang khac cung co fho duoc xom xof, do Ia vIoc su dung mof cay nhj
phan fm kIom fhay cho mang IIon fuc cac phan fu frong moI nuf cua cay B-tree.
10.3.5.4. Them vuo: phuong thuc insert vu hum de quy push_down
VIoc fhom phan fu vao mof cay B-tree co fho duoc xay dung mof cach fu
nhIon nhu mof ham do quy. o quy cho phop chung fa gIu duoc vof cua duong dI
don mof nuf frong cay, do khI quay vo |khI cac Ian goI do quy Ian Iuof kof fhuc),
chung fa co fho fhuc hIon fIop mof so cong vIoc can fhIof o cac nuf fhuoc muc
fron fhoo fhu fu nguoc voI khI dI xuong. Nho vay, chung fa khong can su dung
ngan xop mof cach fuong mInh. Cach Iam nay hoan foan fuong fu voI cach ma
chung fa da Iam frong vIoc can bang IaI khI fhom hoac IoaI mof nuf frong cay can
bang.

Nhu fhuong Io, chung fa can bIof chac Ia khoa can fhom chua co frong cay.
Phuong fhuc fhom vao insert chI can mof fhong so new_entry chua ban ghI
can fhom. Tuy nhIon, ham do quy push_down cua chung fa can fhom ba fham
bIon bo sung. Thong qua cac fham bIon nay, mof nuf, sau khI goI do quy xuong
nuf con cua no, so bIof duoc can phaI gIaI quyof nhung vIoc g ma nuf con cua no
da goI gam fro IaI. o chnh Ia khI mof nuf o muc nao do duoc phan doI va qua
frnh nay co fho so phaI Ian fruyon nguoc vo nuf goc cua cay.

Ham do quy push_down voI fhong so new_entry duoc goI xuong cay con co
goc Ia current do fhom new_entry vao cay con nay. Ham push_down fra vo
duplicate_error nou new_entry da co frong cay; fra vo success nou vIoc
fhom vao fhanh cong va moI chuyon da duoc gIaI quyof frIof do frong cay con ma
no xu Iy. Trong fruong hop co su fhom new_entry vao cay con ma cong vIoc con
chua gIaI quyof frIof do |ngay faI nuf *current co su phan chIa Iam haI nuf),
ham push_down so fra vo overflow do bao Ion nuf cha cua cay con nay gIaI
quyof fIop. Iuc do, cac fham bIon so co vaI fro nhu sau. o nuf *current can
duoc phan doI, chung fa so do current chI don nuf chua mof nua so phan fu bon
fraI, va dja chI cua nuf moI chua mof nua so phan fu bon phaI so duoc fra Ion muc
fron fhong qua fham bIon right_branch. Tham bIon median duoc su dung do
chua ban ghI nam gIua do fra Ion muc fron.

Truong hop co mof nuf duoc phan doI duoc mInh hoa frong hnh 10.11.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 258

Qua frnh do quy duoc baf dau frong phuong fhuc insert cua B-tree. Trong
fruong hop nhung vIoc can gIaI quyof Ian fruyon Ion don fan nuf goc va Ian goI do
quy ngoaI cung cua ham push_down fra vo overflow, fh van con mof ban ghI,
median, can duoc fhom vao cay. Mof nuf goc moI can duoc fao ra do chua ban ghI
nay, va chIou cao cua cay B-tree fang fhom 1. o Ia cach duy nhaf do B-tree
fang chIou cao.

template <class Record, int order>
Error_code B_tree<Record, order>::insert(const Record &new_entry)
/*
post: Nou khoa frong new_entry da co frong B-tree, phuong fhuc fra vo duplicate_error.
Nguoc IaI, new_entry duoc fhom vao cay sao cho cay van fhoa dIou kIon cay B-tree,
phuong fhuc fra vo success.
uses: Cac phuong fhuc cua B_node va ham phu fro push_down.
*/
{
Record median;
B_node<Record, order> *right_branch, *new_root;
Error_code result =push_down(root, new_entry, median, right_branch);
if (result == overflow) { // Cay fang chIou cao Ion 1 don vj.
//Mof nuf moI duoc fao ra do Iam goc moI cho cay, goc cu cua cay so Ia goc cua cay con
fhuoc nhanh con dau fIon cua nuf goc.
new_root = new B_node<Record, order>;
new_root->count = 1;
new_root->data[0] = median;
new_root->branch[0] = root;
new_root->branch[1] = right_branch;
root = new_root;
result = success;
}
return result;
}

HInh 10.11- Hanh vI cua ham push_down khI mof nuf duoc phan doI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 259
10.3.5.5. Them de quy vuo mot cuy con
Chung fa hay hIon fhuc ham do quy push_down. Ham nay su dung con fro
current fham chIou don goc cua cay con can fhuc hIon vIoc fm kIom do fhom
vao. Trong cay B-tree, ban ghI moI fruoc hof can duoc fhom vao mof nuf Ia.
Chung fa so su dung dIou kIon current == NULL do kof fhuc do quy; nghIa Ia,
chung fa so fIop fuc dI chuyon xuong fhoo cay frong khI fm kIom new_entry cho
don khI gap phaI mof cay con rong. o cay B-tree khong Ion Ion bang cach
fhom nuf Ia moI, chung fa khong fhom new_entry ngay Iap fuc, ma fhay vao do
ham so fra vo overflow, new_entry duoc goI fra vo fhong qua fham bIon
median va so duoc fhom vao mof nuf Ia da co o muc fron. VIoc can Iam fIop fhoo
cung hoan foan gIong voI fruong hop fong quaf faI baf cu nuf nao frong cay ma
chung fa so xom xof fIop sau day.

KhI mof Ian do quy fra vo overflow, cung co nghIa Ia con mof ban ghI
median van chua duoc fhom vao cay, va chung fa so fhu fhom no vao nuf hIo n
faI. Nou nuf nay con cho frong, vIoc fhom so hoan faf, ham fra vo success. Iou
nay cung Iam cho cac Ian do quy fruoc do so Ian Iuof kof fhuc ma khong phaI Iam
g fhom. Nguoc IaI, nuf *current duoc phan fhanh haI nuf *current va
*right_branch, va mof ban ghI nam gIua, median |co fho khac voI ban ghI
median fu Ian do quy bon duoI fra vo), duoc goI nguoc Ion pha fron cua cay,
fhong so fra vo van duoc gIu nguyon Ia overflow.

Push_down su dung ba ham phu fro: search_node |gIong nhu frong fruong
hop fm kIom); push_in fhom ban ghI median vao nuf *current voI gIa fhIof
rang nuf nay con cho frong; va split do chIa doI nuf *current da day fhanh
haI nuf moI, haI nuf nay so Ia anh om frong cung mof muc frong cay B-tree.

template <class Record, int order>
Error_code B_tree<Record, order>::push_down
(B_node<Record, order> *current,
const Record &new_entry,
Record &median,
B_node<Record, order> *&right_branch)
/*
pre: current Ia NULL hoac chI don mof nuf frong cay B_tree.
post: Nou khoa frong new_entry da co frong cay con co goc current, ham fra vo
duplicate_error. Nguoc IaI new_entry duoc chon vao cay con, nou dIou nay Iam cho
cay con cao Ion, ham fra vo overflow va ban ghI median duoc fach ra do duoc chon o
muc cao hon frong cay B-tree, dong fhoI right_branch chua goc cua cay con bon phaI
ban ghI median nay. Nou cay con khong can cao Ion fh ham fra vo success.
uses: Ham push_down (mof cach do quy), search_node, split_node, and push_in.
*/
{
Error_code result;
int position;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 260
if (current == NULL) { // o khong fho chon vao mof cay con rong non do quy // kof
fhuc, vIoc can Iam so duoc gIaI quyof o muc fron sau do.
median = new_entry;
right_branch = NULL;
result = overflow;
}
else { // Search the current node.
if (search_node(current, new_entry, position) == success)
result = duplicate_error;
else {
Record extra_entry;
B_node<Record, order> *extra_branch;
result = push_down(current->branch[position], new_entry,
extra_entry, extra_branch);
if (result == overflow) { // Can gIaI quyof cong vIoc nuf con goI Ion.
if (current->count < order - 1) {
result = success;
push_in(current, extra_entry, extra_branch, position);
}

else split_node(current, extra_entry, extra_branch,
position, right_branch, median);
//an ghI median va right_branch duoc cap nhaf frong chnh ham nay
}
}
}
return result;
}
10.3.5.6. Them mot khou vuo mot nut
Ham phu fro ko fIop, push_in, fhom ban ghI entry va con fro bon phaI cua
no Ia right_branch vao nuf *current, gIa su rang nuf nay con cho frong do
fhom vao. Hnh 10.12 mInh hoa fruong hop nay.



HInh 10.12- Hanh vI cua ham push in.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 261
template <class Record, int order>
void B_tree<Record, order>::push_in(B_node<Record, order> *current,
const Record &entry, B_node<Record,
order> *right_branch, int position)
/*
pre: current chua dja chI mof nuf frong B_tree. Nuf *current chua day va entry can
duoc chon vao *current faI vj fr position, right_branch can duoc cap nhaf chnh
Ia cay con bon phaI cua entry frong *current.
post: entry va right_branch da duoc chon vao *current faI vj fr position.
*/
{
for (int i = current->count; i > position; i--) {
// I chuyon cac phan fu can fhIof sang phaI do nhuong cho.
current->data[i] = current->data[i - 1];
current->branch[i + 1] = current->branch[i];
}
current->data[position] = entry;
current->branch[position + 1] = right_branch;
current->count++;
}
10.3.5.7. Phun do mot nut dung duy
Ham phu fro cuoI cung cho phuong fhuc fhom vao, split_node, duoc su dung
khI can fhom ban ghI extra_entry cung con fro chI don cay con extra_branch
vao nuf da day *current. Ham nay fao nuf moI fham chIou boI right_half va
chuyon mof nua so ban ghI bon phaI cua nuf *current sang, goI ban ghI nam
gIua Ion pha fron cua cay do no co fho duoc fhom vao sau do.

I nhIon Ia khong fho fhom ban ghI extra_entry fhang vao nuf da day:
fruoc hof chung fa can xac djnh xom extra_entry so fhuoc nua bon fraI hay nua
bon phaI so ban ghI san co frong nuf *current, sau do dI chuyon cac ban ghI
fhch hop, va cuoI cung so fhom extra_entry vao bon fuong ung. Chung fa so
chIa doI so phan fu frong nuf *current sao cho ban ghI median Ia phan fu co
khoa Ion nhaf frong nua so phan fu bon fraI. Hnh 10.13 mInh hoa dIou nay.

template <class Record, int order>
void B_tree<Record,order>::split_node
(B_node<Record,order> *current, // Nuf can duoc phan doI.
const Record &extra_entry, // Phan fu moI can chon vao.
B_node<Record,order>*extra_branch, // Cay con bon phaI cua extra_entry.
int position,// Vj fr cua extra_entry frong *current so voI cac phan fu da co.
B_node<Record,order>*&right_half,
//Nuf moI do chua mof nua so phan fu fu *current.
Record &median)//Phan fu gIua khong nam frong ca haI *current hoac
// *right_half ma so duoc chuyon Ion pha fron frong cay B_tree.
/*
pre: current chua dja chI mof nuf frong cay B_tree.
Nuf *current da day, nhung phan fu extra_entry cung cay con bon phaI cua no
extra_branch can duoc chon vao vj r position, 0 <=position <order.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 262
post: Cac phan fu da co frong nuf *current cung voI extra_entry va extra_branch (xom
nhu da duoc xop vao dung vj fr position) duoc phan phoI vao nuf *current va nuf moI
*right_half, ngoaI fru phan fu chnh gIua frong so cac phan fu nay duoc dua vao
median.
uses: cac phuong fhuc cua B_node, ham push_in.
*/
{ right_half = new B_node<Record, order>;
int mid = order/2; //
if (position <= mid){ // Truong hop 1: extra_entry fhuoc nua bon fraI.
for (int i = mid; i < order - 1; i++){ // Chuyon cac phan fu fu
// *current sang `right_half fruoc roI moI goI ham push_in do
// chon extra_entry va extra_branch vao *current sau.
right_half->data[i - mid] = current->data[i];
right_half->branch[i + 1 - mid] = current->branch[i + 1];
}
current->count = mid;
right_half->count = order - 1 - mid;
push_in(current, extra_entry, extra_branch, position);
}
else { // Truong hop 2: extra_entry fhuoc nua bon phaI.
mid++; // Tam fhoI van do phan fu can chop vao median o IaI frong nua bon
fraI.
for (int i = mid; i < order - 1; i++) {// Chuyon cac phan fu fu
// *current sang `right_half fruoc roI moI goI ham push_in do
// chon extra_entry va extra_branch vao `right_half sau.
right_half->data[i - mid] = current->data[i];
right_half->branch[i + 1 - mid] = current->branch[i + 1];
}
current->count = mid;
right_half->count = order - 1 - mid;
push_in(right_half, extra_entry, extra_branch, position - mid);
}
median = current->data[current->count -1];//Chop phan fu vao median
right_half->branch[0] = current->branch[current->count];
current->count--;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 263

10.3.6. Lou phun tu trong B-tree
10.3.6.1. Phuong phup
oI voI vIoc IoaI bo phan fu, chung fa mong muon rang phan fu duoc IoaI bo
fhuoc mof nuf Ia nao do. Nou phan fu nay khong fhuoc nuf Ia, fh phan fu ngay
ko fruoc no |hoac ngay ko sau no) fhoo fhu fu fu nhIon cua cac khoa so fhuoc nuf
Ia. Chung fa so daf phan fu ko fruoc nay |hoac ko sau) fho vao cho cua phan fu
can IoaI, sau do IoaI vj fr cua no ra khoI nuf Ia. Cach Iam nay raf gIong voI cach
Iam frong cay nhj phan fm kIom.


HInh 10.13 Hanh vI cua ham split.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 264
Nou nuf Ia can IoaI dI mof phan fu co nhIou hon so phan fu foI fhIou fh vIoc
IoaI kof fhuc. Nguoc IaI, nou nuf Ia dang chua so phan fu bang so phan fu foI
fhIou, fh fruoc hof chung fa so xom xof haI nuf Ia ko can voI no va cung mof cha
|hoac chI mof nuf Ia ko can frong fruong hop nuf Ia dang xof nam o bIon), nou
mof frong haI co nhIou hon so phan fu foI fhIou fh mof phan fu frong so do co
fho dI chuyon Ion nuf cha va phan fu frong nuf cha so dI chuyon xuong nuf Ia
dang fhIou phan fu |Chung fa bIof rang can phaI dI chuyon nhu vay do buo dum
thu tu guu cuc phun tu). CuoI cung, nou ca haI nuf Ia ko can chI co so phan fu
foI fhIou, fh nuf Ia dang fhIou can kof hop voI mof frong haI nuf Ia ko can, co
luy them mot phun tu tu nut chu, fhanh mof nuf Ia moI |Oo so nut con
gum nen so phun tu trong nut chu cung phu gum). Nuf nay so chua so
phan fu khong nhIou hon so phan fu foI da duoc phop. Nou buoc nay Iam cho nuf
cha con IaI so phan fu f hon so phan fu foI fhIou, fh vIoc gIaI quyof cung fuong
fu, va qua frnh nay so Ian fruyon nguoc Ion pha fron cua cay. Qua frnh Ian
fruyon so cham duf khI mof nuf cha nao do khI cho dI mof phan fu van khong fro
non fhIou huf phan fu. Trong fruong hop dac bIof, khI phan fu cuoI cung frong
nuf goc bj Iay dI fh nuf nay cung duoc gIaI phong va cay so gIam chIou cao.
10.3.6.2. VI du
Qua frnh IoaI bo frong cay B-tree bac 5 san co cua chung fa duoc mInh hoa
frong hnh 10.14. Ian IoaI fhu nhaf khong co van do g do h nam frong nuf Ia
dang co nhIou hon so phan fu foI fhIou. Ian fhu haI, IoaI r, do r khong fhuoc nuf
Ia, non phan fu ngay ko sau r Ia s duoc chop do Ion r, va s duoc IoaI khoI nuf Ia.
Ian fhu ba, vIoc IoaI p Iam cho nuf chua no con qua f phan fu. Khoa s fu nuf cha
duoc chuyon xuong Iap dI su fhIou huf va vj fr cua s duoc fho boI t.

VIoc IoaI d fIop fhoo phuc fap hon, no Iam cho nuf con IaI qua f phan fu, va
ca haI nuf ko cung cha dou khong fho sang bof phan fu cho no. Nuf dang fhIou
huf nay phaI kof hop voI mof frong haI nuf ko, khI do mof phan fu nam gIua
chung fu nuf cha duoc dua xuong |bIou dIon boI nof roI frong so do fhu nhaf cua
fruong hop nay). Nuf kof hop duoc gom cac phan fu u, b, c, e fhoo so do fhu haI.
Tuy nhIon, qua frnh nay Iam cho nuf cha chI con IaI mof phan fu I. a nuf pha
fron cua cay phaI duoc kof hop IaI va cuoI cung chung fa co cay nhu so do cuoI cua
hnh vo.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 265


HInh 10.14 IoaI phan fu ra khoI -froo.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 266
10.3.6.3. Hen thuc C++
Chung fa co fho vIof gIaI fhuaf IoaI phan fu voI cau fruc fong fho fuong fu nhu
gIaI fhuaf fhom vao. Chung fa so su dung do quy, voI mof phuong fhuc rIong do
khoI dong qua frnh do quy. Thay cho vIoc day mof phan fu fu nuf cha xuong
frong khI goI do quy xuong bon duoI, chung fa so cho ham do quy fra vo mof nuf
dang fhIou phan fu fhong qua fham bIon. Ian goI do quy bon fron so phan fch
dIou g da xay ra va fhuc hIon vIoc dI chuyon cac phan fu can fhIof. KhI phan fu
cuoI cung frong nuf goc bj Iay dI, nuf rong so duoc gIaI phong va chIou cao cua cay
gIam bof 1.

template <class Record, int order>
Error_code B_tree<Record, order>::remove(const Record &target)
/*
post: Nou khoa frong target duoc fm fhay frong cay, phan fu chua khoa nay bj IoaI khoI cay,
phuong fhuc fra vo success. Nguoc IaI, phuong fhuc fra vo not_present.
uses: Ham recursive_remove.
*/
{
Error_code result;
result = recursive_remove(root, target);
if (root != NULL && root->count == 0) { // Cay gIam chIou cao.
B_node<Record, order> *old_root = root;
root = root->branch[0];
delete old_root;
}
return result;
}
10.3.6.4. Lou de quy
Phan Ion cong vIoc duoc fhuc hIon frong ham do quy recursive_remove.
Truoc fIon no fm nuf chua target. Nou target duoc fm fhay va nuf chua no
khong Ia nuf Ia, fh phan fu ko sau target so duoc fm va duoc chop do Ion no.
Phan fu ko sau nay so duoc IoaI bo. VIoc IoaI phan fu frong nuf Ia duoc fhuc hIon
mof cach do dang, va nhung phan cong vIoc con IaI so duoc fIop fuc nho do quy.
KhI mof Ian goI do quy duoc fra vo, ha m so kIom fra xom nuf fuong ung co con du
so phan fu hay khong, nou fhIou, no dI chuyon cac phan fu do dap ung you cau.
Cac ham phu fro so duoc su dung frong mof so buoc nay.

template <class Record, int order>
Error_code B_tree<Record, order>::recursive_remove
(B_node<Record, order> *current, const Record &target)
/*
pre: current Ia NULL hoac chua dja chI nuf goc cua mof cay con frong B_tree.
post: Nou khoa frong target duoc fm fhay frong cay, phan fu chua khoa nay bj IoaI khoI cay
sao cho cay van gIu fnh chaf cay B-tree, phuong fhuc fra vo success. Nguoc IaI,
phuong fhuc fra vo not_present.
uses: Cac ham search_node, copy_in_predecessor,
recursive_remove (mof cach do quy), remove_data, va restore.
*/
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 267
{
Error_code result;
int position;
if (current == NULL) result = not_present;
else {
if (search_node(current, target, position) == success){
// Khoa frong target duoc fm fhay frong current.
result = success;
if (current->branch[position] !=NULL){//current khong phaI nuf Ia
copy_in_predecessor(current, position);

recursive_remove(current->branch[position],
current->data[position]);
}
else remove_data(current, position);// IoaI phan fu frong nuf Ia.
}
else result =recursive_remove(current->branch[position], target);
if (current->branch[position] != NULL)
if (current->branch[position]->count < (order - 1) / 2)
restore(current, position);
}
return result;
}
10.3.6.5. Cuc hum phu tro
CIo chung fa da co fho kof fhuc qua frnh IoaI bo frong mof cay B-tree bang
cach vIof cac ham phu fro cho no. Ham remove_data IoaI mof phan fu va nhanh
bon phaI cua no khoI mof nuf frong cay B-tree. Ham nay duoc goI chI frong
fruong hop khI mof phan fu duoc IoaI khoI mof nuf Ia cua cay.

template <class Record, int order>
void B_tree<Record, order>::remove_data(B_node<Record, order> *current,
int position)
/*
pre: current Ia dja chI nuf Ia co entry faI vj fr position.
post: entry duoc IoaI khoI nuf *current.
*/
{
for (int i = position; i < current->count - 1; i++)
current->data[i] = current->data[i + 1];
current->count--;
}

Ham copy_in_predecessor duoc goI khI mof phan fu can duoc IoaI ra khoI
mof nuf khong phaI nuf Ia. Trong fruong hop nay, phan fu ngay ko fruoc |fhoo
fhu fu cac khoa) so duoc fm bang cach baf dau fu nhanh bon fraI cua no va dI
xuong fhoo cac nhanh fan cung bon phaI cua moI nuf cho don khI gap nuf Ia.
Phan fu fan cung bon phaI cua nuf Ia nay so fhay fho phan fu can duoc IoaI.




Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 268
template <class Record, int order>
void B_tree<Record, order>::copy_in_predecessor
(B_node<Record, order> *current, int position)
/*
pre: current Ia dja chI nuf khong phaI nuf Ia frong B-tree va co entry Ia phan fu can IoaI
faI position.
post: entry duoc fhay fho boI phan fu dung ngay ko fruoc no frong fhu fu fang dan cua khoa.
*/
{
B_node<Record, order> *leaf = current->branch[position]; // I chuyon qua
nhanh fraI do fm phan fu ngay ko fruoc entry.
while (leaf->branch[leaf->count] != NULL)
leaf = leaf->branch[leaf->count]; // Xuong phan fu cuc phaI cua nhanh fraI cua
current.
current->data[position] = leaf->data[leaf->count - 1];
}

CuoI cung, chung fa can chI ra cach khoI phuc IaI so nuf foI fhIou cho nuf duoc
fham chIou boI root->branch[position] nou nhu Ian do quy bon frong Iam cho
no fro non fhIou phan fu. Ham chung fa vIof duoI day hoI fhIon vo bon fraI,
nghIa Ia, fruoc hof no fm nuf anh om ko bon fraI do xIn bof phan fu, va no chI
xof don nuf anh om ko bon phaI khI nuf ko bon fraI khong fhua phan fu. Cac
buoc fhuc hIon duoc mInh hoa frong hnh 10.15.





HInh 10.15 KhoI phuc IaI so phan fu foI fhIou frong mof nuf.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 269
template <class Record, int order>
void B_tree<Record, order>::restore(B_node<Record, order> *current,
int position)
/*
pre: current Ia dja chI mof nuf khong phaI nuf Ia frong B-tree;
current->branch[position] Ia dja chI nuf dang bj fhIou mof phan fu.
post: Nuf do current->branch[position] chI don duoc khoI phuc IaI cho du so phan fu foI
fhIou can co.
uses: Cac ham move_left, move_right, combine.
*/
{ if (position == current->count)// Truong hop khong co nuf anh om bon phaI.
if (current->branch[position - 1]->count > (order - 1) / 2)
move_right(current, position - 1);
else
combine(current, position);
else if (position == 0) // Truong hop khong co nuf anh om bon fraI.
if (current->branch[1]->count > (order - 1) / 2)
move_left(current, 1);
else
combine(current, 1);
else // Truong hop co nuf anh om ca haI bon.
if (current->branch[position - 1]->count > (order - 1) / 2)
move_right(current, position - 1);
else if (current->branch[position + 1]->count > (order - 1) / 2)
move_left(current, position + 1);
else
combine(current, position);
}

Cac hanh vI cua ba ham con IaI move_left, move_right, va combine duoc
fho hIon raf ro rang frong hnh 10.15.

template <class Record, int order>
void B_tree<Record, order>::move_left(B_node<Record, order> *current,
int position)
/*
pre: current Ia dja chI mof nuf frong B-tree, nhanh con faI position co nuf goc co so
phan fu nhIou hon so phan fu foI fhIou fhoo quy djnh, nhanh con faI position1 co nuf
goc dang fhIou 1 phan fu.
post: Mof phan fu cua *current dI chuyon xuong nuf goc cua nhanh con faI
position1, phan fu faI vj fr 0 frong nuf goc cua nhanh faI position dI chuyon Ion
*current (cay con faI vj fr 0 cung nhu cac phan fu con IaI frong nuf goc cua nhanh nay
so duoc djch chuyon hop Iy).
*/
{ B_node<Record, order> *left_branch = current->branch[position - 1],
*right_branch = current->branch[position];
left_branch->data[left_branch->count] = current->data[position - 1];
// Iay mof entry fu nuf cha *current.
left_branch->branch[++left_branch->count] = right_branch->branch[0];
// CIaI quyof cho cay con faI vj fr 0 frong nhanh con bon phaI: so phan fu frong nhanh con
// bon fraI fang fhom 1 non so cay con cung phaI fang fhom 1, dong fhoI cach dI chuyon nay
// van bao dam fhu fu cac khoa frong cay.
current->data[position - 1] = right_branch->data[0];
// Nuf cha *current Iay mof onfry fu nhanh con bon phaI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 270
right_branch->count--;
for (int i = 0; i < right_branch->count; i++) {
// jch chuyon faf ca cac phan fu vo bon fraI do Iap cho frong.
right_branch->data[i] = right_branch->data[i + 1];
right_branch->branch[i] = right_branch->branch[i + 1];
}
right_branch->branch[right_branch->count] =
right_branch->branch[right_branch->count + 1];
}


template <class Record, int order>
void B_tree<Record, order>::move_right(B_node<Record, order> *current,
int position)
/*
pre: current Ia dja chI mof nuf frong B-tree, nhanh con faI position co nuf goc co so
phan fu nhIou hon so phan fu foI fhIou fhoo quy djnh, nhanh con faI position+1 co nuf
goc dang fhIou 1 phan fu.
post: Mof phan fu cua *current dI chuyon xuong nuf goc cua nhanh con faI
position+1. Phan fu co khoa Ion nhaf |faI count-1) frong nuf goc cua nhanh faI
position dI chuyon Ion *current (cay con bon phaI cua no duoc bo fr IaI hop Iy).
*/
{
B_node<Record, order> *right_branch = current->branch[position + 1],
*left_branch = current->branch[position];
right_branch->branch[right_branch->count + 1] =
right_branch->branch[right_branch->count];
for (int i = right_branch->count ; i > 0; i--) {
// I chuyon sang phaI do danh cho frong cho phan fu fu *current dua xuong.
right_branch->data[i] = right_branch->data[i - 1];
right_branch->branch[i] = right_branch->branch[i - 1];
}
right_branch->count++;
right_branch->data[0] = current->data[position];
// Nhan entry fu nuf cha *current.
right_branch->branch[0] = left_branch->branch[left_branch->count];
// o fr IaI cay con fhua o nhanh fraI do so phan fu gIam bof 1 |fhu fu cac khoa frong
B-tree van bao dam).
left_branch->count--;
current->data[position] = left_branch->data[left_branch->count];
}


template <class Record, int order>
void B_tree<Record, order>::combine(B_node<Record, order> *current,
int position)
/*
pre: current chua dja chI mof nuf frong B-tree co cac nuf goc cua haI nhanh con faI
position va position 1 can ghop |IaI do khong du so phan fu do dI chuyon qua IaI
sao cho ca 2 nuf van du so phan fu foI fhIou).
post: HaI nuf goc cua haI nhanh faI position-1 va position duoc ghop IaI |phan fu faI vj fr
position-1 cua *current cung dI chuyon xuong nuf nay do bao dam rang so phan fu
frong *current gIam bof 1 khI so nhanh con gIam bof 1).
*/


{
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 271
int i;
B_node<Record, order> *left_branch = current->branch[position - 1],
*right_branch = current->branch[position];
left_branch->data[left_branch->count] = current->data[position - 1];
left_branch->branch[++left_branch->count] = right_branch->branch[0];
for (i = 0; i < right_branch->count; i++) {
left_branch->data[left_branch->count] = right_branch->data[i];
left_branch->branch[++left_branch->count] =
right_branch->branch[i + 1];
}
current->count--;
for (i = position - 1; i < current->count; i++) {
current->data[i] = current->data[i + 1];
current->branch[i + 1] = current->branch[i + 2];
}
delete right_branch;
}


10.4. Cuy do-den
10.4.1. Oun nhup
Trong phan fruoc, chung fa da su dung danh sach IIon fuc do chua cac phan fu
cua cay B-tree. Tuy nhIon, noI mof cac fong quaf, chung fa co fho dung baf ky
cau fruc co fhu fu nao do chua cac phan fu frong moI nuf cua B-tree. Mof cay nhj
phan fm kIom nho Ia mof Iua chon fof. Chung fa chI can chu y phan bIof cac con
fro bon frong moI nuf cua cay B-tree |noI cac nuf cua cay nhj phan fm kIom)
voI cac con fro fu nuf nay don nuf khac cua B-tree. Chung fa hay vo cac fham
chIou bon frong mof nuf bang cac duong xoun muu do va nhung con fro gIua
cac nuf frong cay B-tree bang cac duong thung muu den. Xom hnh 10.16.

HInh 10.16 Cay B-tree bac 4 nhu mof cay fm kIom nhj phan.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 272
10.4.2. O{nh nghIu vu phun tIch
Cau fruc nay dac bIof co ch doI voI cay B-tree bac 4 |hnh 10.16), frong do
moI nuf cua cay chua mof, haI hoac ba phan fu. Truong hop mof nuf co mof phan
fu fh fuong fu nhu frong cay B-tree va cay nhj phan fm kIom. Truong hop mof
nuf co ba phan fu duoc bIon doI nhu sau:




Mof nuf co haI phan fu co fho co haI bIou dIon:

Nou muon, chung fa chI can su dung mof frong haI cach bIou dIon fron, nhung
khong co Iy do g do Iam dIou do, chung fa so fhay rang cac gIaI fhuaf cua chung
fa so sInh ra ca haI cach bIou dIon nay mof cach fu nhIon. Nhu vay chung fa so su
dung ca haI cach bIou dIon cho cac nuf co haI phan fu frong cay B-tree.

Chung fa co djnh nghIa co ban cho phan nay nhu sau: Mof cay do-don |red-
black tree) Ia mof cay nhj phan fm kIom, voI cac fham chIou co mau do hoac don,
co duoc fu mof cay B-tree bac bon bang cach vua duoc mo fa fron.

Sau khI chuyon doI mof cay B-tree fhanh cay do don, chung fa co fho su dung no
fuong fu baf ky cay nhj phan fm kIom nao. VIoc tIm kem va duyet cay do don
hoan foan gIong nhu doI voI cay nhj phan fm kIom; chung fa chI don gIan bo qua
cac mau cua cac fham chIou. Tuy nhIon, vIoc them vu lou phun tu doI hoI

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 273
nhIou cong suc hon do duy fr cau fruc cua mof cay B-tree. Chung fa hay chuyon
doI cac you cau doI voI cay B-tree fhanh cac you cau fuong ung doI voI cay do
don.

Truoc hof, chung fa hay Iuu y mof so dIom: chung fa so xom moI nuf frong cay
do don cung co muu nhu muu cuu thum cheu den no, nhu vay chung fa so
goI cac nuf mau do va cac nuf mau don fhay v goI cac fham chIou do va cac fham
chIou don. ang cach nay, chung fa chI can gIu fhom mof fhong fIn cho moI nuf
do chI ra mau cua no.

o nuf goc khong co fham chIou don no, no se khong co muu. o Iam don
gIan mof so gIaI fhuaf, chung tu quy uoc rung nut goc co muu den. Tuong
fu, chung fa so xom faf ca cuc cuy rong |fuong ung fham chIou NULL) co muu
den.

Thoo dIou kIon fhu nhaf frong djnh nghIa cua cay B-tree, moI cay con rong
phaI fhuoc cung muc, nghIa Ia moI duong dI fu goc don moI cay con rong so dI qua
cung mof so nut B-tree nhu nhau. MoI nut B-tree frong cay do don Iuon co
mof nuf don, do cac con fro gIua cac nuf frong cay B-tree duoc bIou dIon bang
cac duong fhang mau don. oI voI nut B-tree co nheu hon mot nut thI
ngou mot nut den, cuc nut con lu phu co muu do. Tu do chung fa co dIou
kIon don nhu sau:

Moi ng i t goc en moi cay con rong eu i qua cung mot so nut en nh
nhau.

o cay B-tree fhoa cac dac fnh cua cay fm kIom, non cay do don cung fhoa
dac fnh nay. Nhung phan con IaI frong djnh nghIa doI voI cay B-tree bac 4 noI
Ion rang moI nuf chua mof, haI hoac ba phan fu du IIou. Chung fa can mof dIou
kIon fron cay do don do bao dam rang khI cac nuf frong cay nay duoc gom IaI
fhanh cac nut B-tree fh moI nut B-tree co khong qua ba nuf. Nou mof nut B-
tree co haI nut cuu cuy do den, fh frong do so co mof nuf cha va mof nuf con,
nou mof nut B-tree co ba nut cuu cuy do den, fh frong do so co mof nuf cha
va haI nuf con |fhoo hnh vo cac cach bIou dIon fron). Nuf cha frong ca haI fruong
hop fron phaI Iuon co mau don do fham chIou don no chnh Ia con fro gIua cac
nut B-tree. Nhu vay, chung fa fhay frong cay do don khong fho co mof nuf do
ma co nuf cha mau do. Vay dIou kIon do nhu sau day so bao dam rang mo nut
B-tree trong cuy do den co khong quu bu nut:

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 274
Neu mot nut co mau o, th nut cha cua no phai ton tai va co mau en.

o chung fa quy uoc nuf goc co mau don non dIou kIon fron van fhoa.

Chung fa co fho fong kof IaI cac dIou phan fch fron day fhanh mof djnh
nghIa hnh fhuc cho cay do don nhu sau |va chung fa khong can nhac don cay
B-tree nua khI noI don cay do don):

nh ngha: Mof cay do don Ia mof cay fm kIom nhj phan, frong do moI nuf co
mau do hoac don, fhoa cac dIou kIon sau:
1. MoI duong dI fu nuf goc don moI cay con rong |fham chIou NULL) dou dI qua
cung mof so nuf don nhu nhau.
2. Nou mof nuf co mau do fh nuf cha cua no phaI fon faI va co mau don.

jnh nghIa nay dan don mof dIou Ia frong cay do don khong co mof duong dI
nao fu goc don mof cay con rong co fho daI hon gap doI mof duong dI khac, boI v,
fhoo dIou kIon don, so nuf don cua faf ca cac duong dI nay phaI bang nhau, va
fhoo dIou kIon do fh so nuf do phaI nho hon hay bang so nuf don. o do, fa co
djnh Iy sau:

nh ly: ChIou cao cua mof cay do don n nuf khong Ion hon 2 Ig n.

ThoI gIan fm kIom frong mof cay do don co n nuf Ia O|Iog n) frong moI
fruong hop. Chung fa cung so fhay rang fhoI gIan fhom nuf moI cung Ia O|Iog n),
nhung fruoc hof chung fa can phaf frIon gIaI fhuaf fruoc.

Chung fa nho IaI frong phan 10.4, cay AVI, frong fruong hop xau nhaf, co
chIou cao bang 1.44 Ig n, va frong fruong hop frung bnh, co chIou cao fhap hon.
Su khac nhau vo chIou cao IIon quan don so nuf cua haI cay nay Ia do cay do don
khong can bang fof bang cay AVI. Tuy nhIon, dIou nay khong co nghIa Ia cac
fhao fac du IIou fron cay do don nhaf fhIof phaI cham hon cay AVI, do cay AVI
co fho can don nhIou phop quay do duy fr su can bang hon nhung g ma cay do
don can don.
10.4.3. Ouc tu cuy do den
o dac fa mof Iop C++ nham bIou dIon cho cac doI fuong cua cay do don,
chung fa can khao saf mof vaI fac vu fron chung. Chung fa co fho hIon fhuc cay
do don nhu Ia cay B-tree ma cac nuf cua no chua cac cay fm kIom fhay v cac
danh sach IIon fuc. Cach fIop can nay buoc chung fa phaI vIof IaI nhIou phuong
fhuc va ham phu fro da co doI voI cay B-tree, do phIon ban fruoc day cua
B-tree IIon quan chaf cho don hIon fhuc IIon fuc cua cac phan fu frong moI nuf.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 275
V fho chung fa so do xuaf mof hIon fhuc Iop cay do don fhua ko cac dac fnh cua
Iop cay fm kIom frong phan 10.2.

Chung fa baf dau bang cach fhom fhuoc fnh mau vao moI nuf cua cay do don:

enum Color {red, black};

template <class Record>
struct RB_node: public Binary_node<Record> {
Color color;
RB_node(const Record &new_entry) { color = red; data = new_entry;
left = right = NULL; }
RB_node() { color = red; left = right = NULL; }
void set_color(Color c) { color = c; }
Color get_color() const { return color; }
};

o fhuan fIon, chung fa su dung cac djnh nghIa frong dong |inline definition)
cho cac contructor va mof so phuong fhuc khac cua RB_node. Cau fruc struct
RB_node raf gIong voI cau fruc struct AVL_node dung frong cay AVI fruoc kIa
frong phan 10.4: su khac nhau duy nhaf chI Ia fhuoc fnh mau fhay cho fhuoc
fnh can bang.

o co fho goI cac phuong fhuc get_color va set_color fhong qua cac con
fro chI don Binary_node, chung fa can bo sung cac ham ao fuong ung frong
struct Binary_node, fuong fu nhu chung fa da Iam khI xay dung cay AVI.

Cau fruc cua Binary_node da sua doI nhu sau:

template <class Entry>
struct Binary_node {
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
virtual Color get_color() const { return red; }
virtual void set_color(Color c) { }
Binary_node() { left = right = NULL; }
Binary_node(const Entry &x) { data = x; left = right = NULL; }
};

ang cach sua doI nhu vay, chung fa da co fho su dung IaI moI phuong fhuc va
ham xu Iy cho cay nhj phan fm kIom va cac nuf cua no. VIoc fm kIom va duyof
fron cay do don fuong fu nhu doI voI cay nhj phan fm kIom.

Chung fa so vIof phuong fhuc fhom phan fu vao cay do don sao cho no van gIu
duoc fnh chaf cua cay do don sau khI fhom vao.

template <class Record>
class RB_tree: public Search_tree<Record> {
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 276
public:
Error_code insert(const Record & new_entry);
private: // Cac ham phu fro.
};
10.4.4. Them phun tu
Chung fa hay baf dau fu gIaI fhuaf do quy chuan doI voI vIoc fhom vao mof
cay fm kIom nhj phan. NghIa Ia, chung fa so so sanh khoa moI cua target voI
khoa cua goc, nou cay khong rong, va sau do fhom do quy nuf moI vao cay con
fraI hoac cay con phaI cua goc. Qua frnh nay kof fhuc khI chung fa gap mof cay
con rong, faI do chung fa so fao mof nuf moI.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 277


Nuf moI nay non Ia mau do hay Ia mau don7 Nou cho no mau don, chung fa da
Iam fang so nuf don fron duong dI fu goc don no, va vI pham dIou kIon don. Vay
nuf moI phaI co mau do. Nhu vuy kh them mot nut mo vuo cuy do den thI


Hnh 10.17 Khoi phuc cac ieu kien o va en.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 278
no luon co muu do . Nou nuf cha cua nuf moI nay co mau don, vIoc fhom vao kof
fhuc. Nguoc IaI, dIou kIon do bj vI pham, va dIou vI pham nay can phaI duoc gIaI
quyof. Chung fa so phan fch cac fruong hop va so xu Iy rIong ro cho chung.

CIaI fhuaf cua chung fa kha Ia don gIan nou chung fa khong xom xof cac
fruong hop nay ngay Iap fuc ma fr hoan chung IaI frong chung muc co fho. KhI
fao mof nuf do, chung fa so khong co gang dIou chInh IaI cay ngay, fhay vao do,
chung fa chI don gIan fra vo mof chI so frang fhaI cho bIof nuf vua xu Iy xong co
mau do.

KhI mof Ian goI do quy kof fhuc, chI so frang fhaI nay duoc goI nguoc vo Ian
do quy da goI no, vIoc xu Iy so duoc fhuc hIon o nuf cha. Nou nuf cha co mau don,
cac dIou kIon cua cay do don khong bj vI pham, qua frnh xu Iy kof fhuc. Nou nuf
cha co mau do, chung fa cung so khong gIaI quyof ngay, ma mof Ian nua IaI gan
chI so frang fhaI cho bIof vua co haI nuf mau do. Ian do quy bon fron faI nuf ong
so nhan duoc chI so frang fhaI nay, co kom fhom fhong fIn cho bIof haI nuf mau
do vua roI fhuoc cay con fraI hay cay con phaI cua no.

Sau khI cac Ian do quy fra vo don nuf ong, vIoc xu Iy so duoc fIon hanh faI
day. Chung fa bIof rang nuf ong Iuon co mau don, do fruoc khI xuaf hIon nuf con
mau do, cac mau cua nuf cha va nuf ong phaI fhoa dIou kIon cua cay do don, ma
nuf cha do fh nuf ong phaI don. Quy uoc nuf goc mau don co IoI frong fruong hop
nay, v nou nuf cha mau do, fh no khong fho Ia nuf goc. KhI qua frnh xu Iy Ian
fruyon vo fan goc fh nuf ong phaI Iuon Iuon fon faI.

CuoI cung, faI Ian do quy cua nuf ong, chung fa co fho bIon doI cay do khoI
phuc IaI cac dIou kIon do don. Chung fa chI can xom xof fruong hop haI nuf do
fhuoc cay con fraI cua nuf ong. Truong hop nguoc IaI chI Ia doI xung. Chung fa
can phan bIof haI fruong hop fuong ung voI mau cua nuf con con IaI cua nuf ong,
nghIa Ia nuf chu cua nuf do moI xuaf hIon.

Truoc fIon, gIa su nuf chu co mau don. Truong hop nay co gop ca fruong hop
nuf chu rong, do quy uoc cay con rong co mau don. Cac dac fnh cua cay do don
so duoc khoI phuc nho mof phop quay don hay mof phop quay kop qua phaI, nhu
haI phan dau cua hnh 10.17. Trong ca haI so do nay, phop quay, koo fhoo su fhay
doI cac mau nuf fuong ung, so IoaI duoc su vI pham dIou kIon do, dong fhoI bao
foan dIou kIon don do khong Iam fhay doI so nuf don frong baf ky duong dI nao
fu goc don cac nuf Ia.

CIo chung fa gIa su nuf chu co mau do, nhu haI phan bon duoI cua hnh 10.17.
VIoc bIon doI raf don gIan: khong co phop quay nao xay ra, chI co su fhay doI cac
mau. Nuf cha va nuf chu fro fhanh mau don, nuf ong fro fhanh mau do. Iou kIon
do van bao dam khI xof moI quan ho gIu a nuf ong va nuf cha, nuf chu; gIua nuf
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 279
cha va nuf con mau do moI xuaf hIon bon duoI. Iou kIon don khong bj vI pham
do so nuf don frong cac duong dI doc fhoo cay khong ho fhay doI. Tuy nhIon, khI
nuf ong vua duoc bIon doI fhanh mau do, dIou kIon do co fho bj vI pham khI xof
moI quan ho voI nuf cha cua nuf nay. Qua frnh xu Iy chua fho cham duf. Mac du
vay, chung fa co fho fhay rang nuf ong vua duoc doI sang mau do hoan foan gIong
voI fruong hop mof nuf do moI xuaf hIon Iuc fruoc. Vay chung fa chI can do IaI
cho cac Ian goI do quy bon fron xu Iy faI cac nuf bon fron nua frong cay, bang
cach IaI cho chI so frang fhaI vo IaI fruong hop co mof nuf do moI xuaf hIon. Nhu
vay qua frnh xu Iy khI dIou kIon do bj vI pham duoc Ian fruyon doc Ion pha fron
cua cay. Qua frnh nay co fho kof fhuc faI mof nuf nao do, hoac co fho Ian fruyon
Ion fan goc. Va khI nuf goc can duoc doI sang mau do, fh chuong frnh ngoaI
cung chI can doI nuf nay fhanh mau don cho dung quy uoc. Iou nay cung khong
vI pham dIou kIon don, do no Iam cho so nuf don frong faf ca cac duong dI doc
fhoo cay fang fhom mof don vj. Va day cung chnh Ia fruong hop duy nhaf Iam
cho so nuf don frong cac duong dI nay fang Ion.
10.4.5. Phuong thuc them vuo. Hen thuc
Chung fa so chuyon gIaI fhuaf fron fhanh chuong frnh C++. Cung nhu moI
khI, phan Ion cong vIoc dou duoc fhuc hIon boI ham do quy, phuong fhuc insert
chI can doI nuf goc fhanh mau don khI can va kIom fra IoI. Phan quan frong nhaf
cua gIaI fhuaf fhom phan fu vao cay do don Ia nam gIu duoc chI so frang fhaI moI
khI co mof Ian do quy kof fhuc. Chung fa can mof kIou IIof ko moI do phan bIof
cac frang fhaI:
enum RB_code {okay, red_node, left_red, right_red, duplicate};
/* Cac gIa frj frang fhaI ma mof Ian do quy can chuan bj fruoc khI kof fhuc do fra vo cho Ian do
quy bon fron nhu sau |gIa su goI nuf dang duoc xu Iy frong Ian do quy hIon faI Ia *current):

okay: Mau cua *current khong co su fhay doI nao.

red_node: Mau cua *current vua chuyon fu don sang do. Ian do quy bon fron khI nhan duoc
fhong fIn nay can xom xof do xu Iy.

right_red: Mau cua *current va nuf con phaI cua no dou Ia do, co su vI pham dIou kIon do.
Ian do quy bon fron khI nhan duoc fhong fIn nay can fhuc hIon phop quay hoac doI
mau can fhIof.

left_red: Mau cua *current va nuf con fraI cua no dou Ia do, co su vI pham dIou kIon do.
Ian do quy bon fron khI nhan duoc fhong fIn nay can fhuc hIon phop quay hoac doI
mau can fhIof.

duplicate: Phan fu can fhom vao cay da co frong cay.
*/



template <class Record>
Error_code RB_tree<Record>::insert(const Record &new_entry)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 280
/*
post: Nou khoa frong new_entry da co frong RB_tree, phuong fhuc fra vo
duplicate_error. Nguoc IaI, phuong fhuc fra vo success va new_entry duoc fhom
vao cay sao cho cay van fhoa cay RB-tree.
uses: Cac phuong fhuc cua struct RB_node va ham do quy rb_insert.
*/
{
RB_code status = rb_insert(root, new_entry);
switch (status) {
case red_node:
root->set_color(black);
case okay:
return success;
case duplicate:
return duplicate_error;
case right_red:
case left_red:
cout << "WARNING: Program error detected in RB_tree::insert" <<
endl;
return internal_error;
}
}

Ham do quy rb_insert fhuc hIon fhuc su vIoc fhom phan fu moI vao cay: fm
kIom frong cay fhoo cach fhong fhuong, gap cay con rong, fhom nuf moI vao faI
day, cac vIoc con IaI duoc fhuc hIon fron duong quay vo cua cac Ian goI do quy.
Ham nay co goI modify_left hoac modify_right do fhuc hIon cac phop quay
va doI mau fuong ung voI cac fruong hop frong hnh 10.17.

template <class Record>
RB_code RB_tree<Record>::rb_insert(Binary_node<Record> *&current,
const Record &new_entry)
/*
pre: current Ia NULL hoac Ia dja chI cua nuf goc cua mof cay con frong RB_tree.
post: Nou khoa frong new_entry da co frong RB_tree, phuong fhuc fra vo
duplicate_error. Nguoc IaI, phuong fhuc fra vo success va new_entry duoc fhom
vao cay con co goc Ia current. Tnh chaf cay do don frong cay con nay van fhoa ngoaI
fru mau faI nuf goc cua no va mof frong haI nuf con cua nuf goc nay. Trang fhaI nay so
duoc ham modify_right hoac modify_left dIou chInh fhch hop |fuong ung cac frj cua
RB_code) do fra vo cho Ian do quy bon fron cua Ian goI rb_insert nay.
uses: Cac phuong fhuc cua Iop RB_node, cac ham rb_insert (mof cach do quy),
modify_left, va modify_right.
*/
{
RB_code status,
child_status;
if (current == NULL) {
current = new RB_node<Record>(new_entry);
status = red_node;
}

else if (new_entry == current->data)
return duplicate;
else if (new_entry < current->data) {
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 281
child_status = rb_insert(current->left, new_entry);
status = modify_left(current, child_status);
}
else {
child_status = rb_insert(current->right, new_entry);
status = modify_right(current, child_status);
}
return status;
}

Ham modify_left dua vao frang fhaI cua cac nuf con do fhuc hIon phop quay
hay sua doI mau fuong ung, dong fhoI cap nhaf IaI va fra vo chI so frang fhaI cho
rb_insert. Chnh frong ham nay chung fa quyof djnh fr hoan cong vIoc khoI
phuc cac dac fnh cua cay do don. KhI modify_left duoc goI, chung fa bIof rang
vIoc fhom vao vua duoc fhuc hIon frong cay con bon fraI cua nuf hIon faI, bIof
duoc mau cua nuf hIon faI, va fhong qua chI so frang fhaI, chung fa con bIof duoc
fruong hop nao da xay ra o cay con fraI cua no. ang cach su dung cac fhong fIn
nay, chung fa co fho xac djnh chnh xac nhung vIoc can Iam do khoI phuc cac dac
fnh cua cay do don.


template <class Record>
RB_code RB_tree<Record>::modify_left(Binary_node<Record> *&current,
RB_code &child_status)
/*
pre: Cay con bon fraI cua current vua duoc fhom nuf moI, frj frong child_status so quyof
djnh vIoc xu Iy ko fIop frong ham nay.
post: VIoc doI mau hoac quay can fhIof da duoc fhuc hIon, frang fhaI fhch hop duoc fra vo boI
ham nay.
uses: Cac phuong fhuc cua struct RB_node, cac ham rotate_right,
double_rotate_right, va flip_color.
*/
{
RB_code status = okay;
Binary_node<Record> *aunt = current->right;
Color aunt_color = black;
if (aunt != NULL) aunt_color = aunt->get_color();
switch (child_status) {
case okay:
break; // VIoc xu Iy da kof fhuc va khong can Ian fruyon Ion fron nua.
case red_node:
if (current->get_color() == red)
status = left_red;
else
status = okay;// current mau don, nuf con fraI mau do, da fhoa cay
RB-tree.
break;
case left_red:
if (aunt_color == black) status = rotate_right(current);
else status = flip_color(current);
break;
case right_red:
if (aunt_color == black) status = double_rotate_right(current);
else status = flip_color(current);
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 10 Cay nhieu nhanh
Giao trnh Cau truc d lieu va Giai thuat 282
break;
}
return status;
}

Ham phu fro modify_right cung fuong fu, no xu Iy cho cac fnh huong cay co
dang nhu nhung hnh anh phan chIou qua guong cua cac fnh huong frong hnh
10.17. Ham doI mau flip_color duoc xom nhu baI fap. Cac ham quay dua fron
co so cac ham quay cua cay AVI, co fhom vIoc gan IaI cac mau va chI so frang
fhaI fhch hop.
10.4.6. Lou mot nut
Cung nhu cay B-tree, vIoc IoaI bo mof nuf phuc fap hon vIoc fhom vao, doI
voI cay do don, vIoc IoaI nuf con kho khan hon raf nhIou. VIoc fhom vao fao ra
mof nuf moI mau do dan don nguy co vI pham dIou kIon do, chung fa can xom xof
mof cach can fhan do gIaI quyof cac vI pham nay. VIoc IoaI mof nuf do ra khoI
cay khong kho Iam. Tuy nhIon, vIoc IoaI mof nuf don khoI cay dan don nguy co vI
pham dIou kIon don, va no doI hoI chung fa phaI xom xof raf nhIou fruong hop
dac bIof do khoI phuc dIou kIon don cho cay.


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 283
Chng 11 HANG TKN

Cau fruc du IIou hang doI ma chung fa da xom xof frong chuong 3 Ia fhoo dung
nguyon fac IIIO. Tuy nhIon frong fhuc fo, co nhung fruong hop can co su IInh
dong hon. Chang han frong so cac cong vIoc can xu Iy, co mof so f cong vIoc vo
cung quan frong, chung can duoc xu Iy cang som cang fof ngay khI co fho. Hoac
frong fruong hop co nhIou fap fIn cung dang cho duoc In, mof so fap fIn chI co 1
frang frong khI mof vaI fap fIn khac fh raf daI. Nou cac fap fIn 1 frang duoc In
fruoc fh khong anh huong don fhoI gIan cho doI cua cac fap fIn khac bao nhIou.
Nguoc IaI, nou cu fhoo fhu fu IIIO, mof so ban In chI co 1 frang IaI phaI cho doI
qua Iau.

Hang co xof fhu fu uu fIon, hay goI faf Ia hang uu fIon |priority qucuc), Ia mof
cach gIaI quyof cac fruong hop fron mof cach fhoa dang. Tuy vao ung dung, fIou
ch do xof do uu fIon do chung fa quyof djnh. Trong chuong nay chung fa so dac
fa va hIon fhuc CTI cho hang uu fIon nay.
11.1. O{nh nghIu hung uu ten
Hang uu fIon co cac phuong fhuc gan gIong nhu mof hang doI fhong dung, chI
khac vo maf chIon Iuoc:
jnb ngba: Mof hung uu ten cac phan fu kIou T gom cac phan fu cua T, kom
cac fac vu sau:
1. Tao moI mof doI fuong hang rong.
2. priority_append: Thom mof phan fu moI vao hang, gIa su hang chua day
|fuy vao do uu fIon cua phan fu du IIou moI no so duoc dung o mof vj fr fhch
hop).
3. priority_serve: IoaI mof phan fu ra khoI hang, gIa su hang chua rong
|phan fu bj IoaI Ia phan fu don Iuof duoc xom xof fhoo quy uoc do uu fIon da
djnh).
4. priority_retrieve: Xom phan fu faI dau hang |phan fu sap duoc xom xof).
11.2. Cuc phuong un hen thuc hung uu ten
CIa su do uu fIon Ia su kof hop boI do uu fIon fhoo fIou ch ma chung fa da
chon cung voI fhu fu xuaf hIon cua cong vIoc. KhI dua vao hang, moI cong vIoc so
co mof fhong so do chua do uu fIon nay. Chung fa quy uoc rang do uu fIon cang
nho fhu fu uu fIon cang cao.

Chung fa co fho dung SIK don do hIon fhuc hang uu fIon. VIoc fhom vao
Iuon fhuc hIon o dau danh sach, vIoc Iay ra so phaI duyof Ian Iuof hof danh sach
do chon phan fu co do uu fIon cao nhaf. Nguoc IaI, nou khI fhom vao Iuon gIu
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 284
danh sach dung fhu fu fang dan cua do uu fIon, khI Iay ra chI can Iay phan fu dau
danh sach. Ca haI cach dou fon O|1) cho mof fac vu va O|N) cho fac vu con IaI.

Phuong an fhu haI co fho hIon fhuc hang uu fIon boI mof cay nhj phan fm
kIom |ST). Phuong an nay can O|IogN) cho moI fac vu fhom hoac IoaI phan fu.
Tac vu priority_serve so Iuon Iay ra phan fu cuc fraI cua cay nhj phan, dIou
nay so Iam cho cay maf can bang va co fho khac phuc bang cach su dung cay AVI
fhay cho cay ST bnh fhuong.

Tuy nhIon cac phuong an su dung cay fron day hoI bj fhua. VIoc quan Iy cay
qua phuc fap so voI muc dch cua chung fa.

Cach hIon fhuc don gIan va pho bIon cho hang uu fIon Ia heap nhj phan
|binary bcap), co khI con duoc goI faf Ia heap. Va v no kha pho bIon non nhIou
Iuc nguoI fa chI goI don gIan Ia heap, chu khong con goI Ia hang uu fIon nua.
jnh nghIa heap nhj phan da duoc frnh bay frong chuong 8. Trong chuong nay
chung fa su dung heap nhj phan Ia mof min-heap.

Phan hIon fhuc mof CTI heap cu fho duoc xom nhu baI fap. Phan fIop sau
day frnh bay cac fhao fac fron heap bang ma gIa, va do do dang hnh dung
chung fa cung van dung hnh anh cua cay nhj phan do mInh hoa.
11.3. Hen thuc cuc tuc vu co bun tren heap nh{ phun
11.3.1. Tuc vu them phun tu
o fhom mof phan fu moI vao hoap, chung fa fao mof cho frong ngay sau
phan fu cuoI cua hoap, dIou nay bao dam hoap van co cau fruc cay nhj phan day
du hoac gan nhu day du. Nou phan fu moI co fho daf vao cho frong nay ma khong
vI pham dIou kIon fhu haI cua hoap |bang cach so sanh phan fu moI voI nuf cha
cua cho frong nay) fh gIaI fhuaf kof fhuc. Nguoc IaI, chung fa Iay phan fu cha
cua cho frong nay do Iap vao cho frong, Iuc do so xuaf hIon cho frong moI. Cong
vIoc Iap IaI fuong fu cho don khI fm duoc vj fr fhch hop cho phan fu moI.
Hnh 11.1 mInh hoa vIoc fhom phan fu 14 vao mof heap.
VIoc fhom phan fu moI fon nhIou nhaf Ia O|IogN).








Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 285




















HInh 11.1. Thom phan fu 14 vao hoap




13
21 16
24 31
65 26 32
19 68
13
21 16
24
65 26 32 31
19 68
13
16
24 21
65 26 32 31
19 68
13
14 16
24 21
65 26 32 31
19 68
ErrorCode Priority_Queue::priority_append(Entry item)
/*
pre: doI fuong Priority_Queue co fhuoc fnh hoap Ia mang IIon fuc chua cac phan fu.
post: item duoc fhom vao hang uu fIon sao cho fnh chaf heap van fhoa.
*/
{
1. if (full())
1. return overflow;
2. else
1. current_position = size()
2. loop ((fon faI parent Ia cha cua phan fu faI current_position) AND
(parent > item)
// Ian Iuof dI chuyon cac nuf cha xuong nou cha Ion hon item do Iap cho frong
1. heap[current_position] = parent
2. Cho current_position Ia vj fr cua parent
3. endloop
4. heap[current_position] = item
5. // Cap nhaf IaI kch fhuoc cua hoap.
6. return success
3. endif
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 286
11.3.2. Tuc vu lou phun tu
VIoc IoaI phan fu cung fuong fu vIoc fhom vao. Phan fu Iay ra chnh Ia phan
fu faI goc cua cay v do Ia phan fu co do uu fIon cao nhaf. VIoc con IaI Ia gIaI
quyof cho cho frong nay. Trong hnh 11.2 chung fa so fhay qua frnh dI chuyon
cua cho frong. Mof frong haI phan fu con cua no so dI chuyon Iap day cho frong.
Phan fu nho nhaf frong haI phan fu con duoc chon do fhoa djnh nghIa cua heap.
CuoI cung, voI cho frong khong con nuf con fh duoc Iap day boI phan fu cuoI cua
hoap v chung fa Iuon bIof rang day Ia cay nhj phan day du hoac gan nhu day du,
no Iuon chua cac phan fu co fho dIon vao mof mang IIon fuc fu fraI sang phaI. Va
fhuc su chung fa cung hIon fhuc hoap frong mof mang IIon fuc chu khong phaI
cau fruc cay co con fro. MoI fhao fac voI cac chI so do djnh vj don cac phan fu
cha, con, dou raf nhanh chong. Chung fa co fho chac chan rang dIou kIon fhu haI
frong djnh nghIa cua hoap cung khong bj vI pham khI doI phan fu cuoI bang cach
nay. ChI ph frong vIoc IoaI phan fu Ia O|IogN).


























HInh 11.2. IoaI mof phan fu ra khoI heap

13
14 16
19 21
65 26 32 31
19 68

14 16
19 21
65 26 32 31
19 68
14
16
19 21
65 26 32 31
19 68
14
19 16
21
65 26 32 31
19 68
14
19 16
26 21
65 32 31
19 68
14
19 16
26 21
65 31 32
19 68
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 287
11.4. Cuc tuc vu khuc tren heup nh{ phun
11.4.1. Tuc vu tIm phun tu lon nhut
Tac vu priority_retrieve fruy xuaf phan fu bo nhaf frong min-heap co chI
ph O|1). oI voI vIoc fm ra phan fu Ion nhaf frong min-heap kho khan hon.
Tuy vay, chung fa cung khong phaI dung cach fm fuyon fnh fron foan bo heap,
v cac phan fu frong heap Iuon co mof fraf fu nhaf djnh fhoo djnh nghIa. Chung
fa fhay ngay rang phan fu Ion nhaf phaI Ia mof frong cac nuf Ia, do Ia mof nua
bon phaI cua mang IIon fuc chua cac phan fu cua heap.
11.4.2. Tuc vu tung gum do uu ten
TaI fhoI dIom khI ma cac cong vIoc duoc dua vao hang uu fIon, moI cong vIoc
dou da duoc xac djnh do uu fIon, va chI so nay chnh Ia khoa duoc xu Iy boI hoap.
Tuy nhIon, gIa su frong khI cac cong vIoc dang nam frong hang uu fIon do cho
don Iuof duoc cung cap djch vu, nguoI dIou hanh muon can fhIop vao fhu fu uu
fIon nay v mof so Iy do. Chang han co mof cong vIoc dang phaI cho qua Iau va co
mof you cau dof xuaf can fhuc day no duoc hoan fhanh som hon. Nguoc IaI nguoI
dIou hanh cung co fho muon dIou chInh gIam do uu fIon mof cong vIoc nao khac.
Nhung dIou nay raf fhuong xay ra nou chung fa xof frong mof fnh huong rang,
frong cho do phuc vu co phan chIa fhoI gIan, khI hof khoang fhoI gIan quy djnh,
nou cong vIoc van chua fhuc hIon xong fh IaI phaI quay IaI hang doI nam cho
fIop. MoI cong vIoc fhuong phaI doI, duoc phuc vu, doI, duoc phuc vu, vaI Ian nhu
fho moI kof fhuc. Nhu vay fh vIoc nguoI dIou hanh duoc quyon can fhIop vao
hang doI fuy vao nhung fnh fho cu fho Ia raf co IoI. Nhung cong vIoc doI khI do
ErrorCode Priority_Queue::priority_serve()
/*
pre: doI fuong Priority_Queue co fhuoc fnh hoap Ia mang IIon fuc chua cac phan fu.
post: phan fu nho nhaf frong hang uu fIon duoc Iay dI.
*/
{
1. if (empty())
1. return underflow;
2. else
1. current_position = 0
2. loop (phan fu faI current_position co con)// Ian Iuof dI chuyon cac nuf
// con Ion do Iap cho frong.
1. child Ia phan fu nho nhaf frong haI con
2. child duoc chop Ion vj fr current_position
3. Cho current_position Ia vj fr cua child vua duoc chop
3. endloop
4. heap[current_position] = heap[size()-1]
5. // Cap nhaf IaI kch fhuoc cua hoap.
6. return success
3. endif
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 288
fnh fhIou hIou qua, da su dung fong fhoI gIan phuc vu qua Ion ma van chua kof
fhuc, fhuong bj gIam do uu fIon nhu mof hnh fhuc phaf.

Truoc hof chung fa can bo sung mof va I CTI va mof vaI ham phu fro sao cho
khI mof cong vIoc duoc dua vao hang uu fIon chung fa Iuon nam duoc vj fr cua no
frong hang uu fIon, ko ca khI no bj djch chuyon do cac fhao fac cua cac fac vu
fhom, IoaI,Taf nhIon nhung bo sung nay so duoc dong kn frong CTI
Priority_Heap cua chung fa. Sau do, chung fa co fho fhIof ko haI fac vu
decrease_key(position, delta) va increase_key(position, delta) cho
phop gIam hoac fang khoa cua phan fu faI vj fr position frong heap mof Iuong
delta. KhI gIam hoac fang nhu vay, chung fa chI can xu Iy djch chuyon phan fu
nay Ion hoac xuong vj fr fhch hop frong heap so voI gIa frj moI cua khoa, vIoc
nay raf do dang va gan gIong voI nhung g chung fa da Iam frong haI fac vu
priority_append va priority_serve.
11.4.3. Tuc vu lou mot phun tu khong o duu hung
Chung fa cung co fho bo sung fhom fac vu IoaI han mof cong vIoc dang doI
frong hang |khong phaI Ia phan fu dang o dau hang va co do uu fIon cao nhaf)
nham dap ung you cau cua mof nguoI su dung nao do muon ngung khong fhuc
hIon cong vIoc nua. Tac vu delete(position) don gIan Ia goI
decrease_key(position, delta) voI doIfa vo cung Ion roI goI
priority_serve.
11.5. Mot so phuong un khuc cuu heup
ac fnh chnh you cua hoap Ia trut tu guu cuc phun tu chu con. Iou
nay dap ung muc dch cua hang uu fIon Ia fruy xuaf nhanh chong phan fu nho
nhaf. Heap nhj phan khaI fhac fnh nang cua mang IIon fuc fao hIou qua nhaf
djnh frong cac fhao fac fron hang uu fIon. uoI day Ia mof vaI phuong an khac
cua heap, chung khaI fhac cac uu dIom cua cac cach hIon fhuc khac nhau.

11.5.1. d-heups
Heap nhj phan Iuon pho bIon khI nguoI fa can dung don hang uu fIon. d-
heaps hoan foan gIong hoap nhj phan ngoaI fru moI nuf co d chu khong phaI 2
con. d cang Ion cang IoI cho phop fhom vao, nguoc IaI, frong phop IoaI bo phan fu
bo nhaf, can phaI chI ph frong vIoc so sanh d phan fu con cua mof nuf do Iay
phan fu nho nhaf day Ion. o do d-heap fhch hop voI cac ung dung ma phop
fhom vao duoc fhuc hIon fhuong xuyon. NgoaI ra con phaI fnh don chI ph frong
vIoc djnh vj cac nuf cha, nuf con frong mang IIon fuc. Nou d Ia Iuy fhua cua 2 fh
cac phop nhan, chIa duoc fhuc hIon boI phop djch chuyon bIf raf fIon IoI. CuoI
cung, fuong fu B-tree, khI du IIou qua Ion khong chua du frong bo nho fh
d-heap cung fhch hop voI vIoc su dung fhom bo nho ngoaI.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 289
HInh 11.3 . d-heap

Nhuoc dIom cua cac heap fron day Ia vIoc fm kIom mof phan fu baf ky hay
vIoc fron haI heap voI nhau khong fhch hop. Chung fa so xom xof mof so cau
fruc phuc fap hon nhung raf fhch hop cho phop fron.
11.5.2. Heup lech tru (Leftist heap)
VIoc su dung mang IIon fuc nhu hoap nhj phan fhaf khong do do fhuc hIon
phop fron mof cach hIou qua, v no Iuon doI hoI vIoc dI chuyon cac phan fu. MoI
CTI fhch hop cho vIoc fron dou dung don con fro. Nhuoc dIom cua con fro Ia
fhoI gIan xac dInh vj fr cac phan fu Iau hon so voI frong mang IIon fuc. Hoap
Ioch fraI so su dung cau fruc IIon kof voI cac con fro fraI va phaI faI moI nuf do
chua dja chI cua haI nuf con, muc dch do khaI fhac dIom manh cua phop fron.

Heap Ioch fraI cung gIong voI heap nhj phan o cau fruc nhj phan va fraf fu
gIua cac phan fu cha con. Chung fa Iuon nho rang, fraf fu gIua cac phan fu cha
con Ia fnh chaf co ban nhaf cua moI heap. Iom khac o day Ia heap Ioch fraI
khong co su can bang.

Chung fa djnh nghIa chIou daI duong dI don N!II cua mof phan fu X |nu//
patb /cngtb Np/(X) Ia chIou daI cua duong dI ngan nhaf fu X don mof nuf Ia.
NpI cua nuf Ia va nuf bac mof bang 0, NpI|N!II) = -1. NpI cua baf ky nuf nao
bang NpI cua nuf con co NpI nho nhaf cong fhom 1.

Heup lech tru co tInh chut suu duy: tu mo nut, Npl cuu nut con tru
luon lon hon houc bung Npl cuu nut con phu. Tnh chaf nay Iam cho hoap
Ioch fraI maf can bang. Chung fa goI duong d tru |houc phu) faI moI nuf Ia
duong dI don nuf duoI cuc fraI |cuc phaI) fuong ung cua nuf do. MoI nuf frong
heap Ioch fraI Iuon co khuynh huong co duong dI fraI daI hon duong dI phaI, do
do duong dI phaI faI nuf goc Iuon Ia duong ngan nhaf frong cac duong dI fu goc
don cac nuf Ia.

Co fho chung mInh bang suy dIon rang mof cay heap Ioch fraI voI r nuf fron
duong dI phaI so co f nhaf 2
r
-1 nuf. Tu do cay heap Ioch fraI N nuf so co nhIou
nhaf log(N+1) nuf fron duong dI phaI. Y fuong chnh cua heap Ioch fraI Ia
3
13 15 6
1
2
4 7 10
5
8 17 9
9 11
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 290
moI fac vu dou duoc fhuc hIon fron duong dI phaI do Iuon duoc bao dam voI chI
ph log(N).
|a) |b)
HInh11.4. NpI faI moI nuf.
|a)- Thoa dIou kIon heap Ioch fraI.
|b)- Nuf co dau ` vI pham dIou kIon heap Ioch fraI..

Cuc tuc vu tren heup lech tru

Tac vu co ban nhaf cua hoap Ioch fraI Ia fac vu fron. Chung fa so fhay phop
fhom vao va phop IoaI bo duoc fhuc hIon do dang nho goI phop fron nay.

NgoaI haI con fro fraI va phaI, moI nuf frong heap Ioch fraI con co fhom fhong
fIn Ia NpI cua no.

o fron haI hoap Ioch fraI H
1
va H
2
:
Nou mof frong haI heap rong fh fra vo heap con IaI.
Nguoc IaI, so sanh du IIou faI haI nuf goc, fhuc hIon fron heap co goc Ion
hon voI cay con phaI cua heap co goc nho hon. Iou nay bao dam goc cua
heap kof qua Iuon co frj nho nhaf frong faf ca cac nuf, v heap kof qua co
goc chnh Ia goc cua heap ban dau co goc nho hon.

ay chnh Ia qua frnh do quy. Truoc khI kof fhuc mof Ian goI do quy, chung
fa chI can kIom fra nuf goc nay co fhoa dIou kIon cua hoap Ioch fraI hay khong,
nou can chung fa chI can hoan vj haI con fraI va phaI cua no do co duoc NpI cua
nuf con fraI Ion hon hoac bang NpI cua nuf con phaI. NpI cua nuf goc duoc cap
nhaf bang NpI cua nuf con phaI cong fhom 1.

Hnh 11.5 mInh hoa qua frnh fron haI hoap Ioch fraI H
1
va H
2
.




1
1 0
0 0
0
1
1* 0
0 1
0 0
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 291






H
1
H
2


(u)- Oo 6>3, tron H
2
vo cuy con goc 8.









(b)- Oo8>6, tron cuy con goc 8 vo cuy con goc ?.









(c)-Oo 8>?, tron cuy con goc 8 vo cuy con goc 18.












(d)- Oo 18>8, tron cuy con goc 18 vo cuy con phu cuu 8 (NLL)

3
10 8
21 14
23
17
26
6
12 7
18 24
33
37 18
3
10 8
21 14
23
17
26
12 7
18 24
33
37 18
6
3
10 8
21 14
23
17
26
12 7
18 24
33
37 18
6
3
10
8
21 14
23
17
26
12 7
18 24
33
37
18
6
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 292








(e)- Tu nut 18 vu nut 8 khong v phum heup lech tru.










(I)- Tu nut ? v phum heup lech tru, houn v{ hu cuy con.










(g)- Tu nut 6 khong v phum heup lech tru.









(h)- Tu nut 3 v phum heup lech tru, houn v{ hu cuy con.

HInh 11.5- Tron haI hoap Ioch fraI H
1
va H
2

3
10
8
21 14
23
17
26
12 7
18 24
33
37
18
6
3
10
8
21 14
23
17
26
12 7
18 24
33
37
18
6
3
10
8
21 14
23
17
26
12
7
18 24
33
37
18
6
3
10
8
21 14
23
17
26
12
7
18 24
33
37
18
6
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 293





//Phan ma gIa cho khaI bao va mof so fac vu cho LeftistHeap.

struct LeftistHeap_Node
DataType data
LeftistHeap_Node* left
LeftistHeap_Node* right
int Npl
end struct

class Leftist_Heap
public:
void merge(ref Leftist_Heap H1, ref Leftist_Heap H2)
private:
LeftistHeap_Node* recursive_merge(ref LeftistHeap_Node* p1,
ref LeftistHeap_Node* p2)
LeftistHeap_Node* aux_merge(ref LeftistHeap_Node* p1,
ref LeftistHeap_Node* p2)
LeftistHeap_Node* root
end class


void Leftist_Heap::merge(ref Leftist_Heap H1, ref Leftist_Heap H2)
/*
post: H1 Ia hoap Ioch fraI Ia kof qua fron haI heap H1 va H2, H2 rong.
*/
{
1. recursive_merge(H1.root, H2.root);
}


LeftistHeap_Node* Leftist_Heap::recursive_merge(ref LeftistHeap_Node* p1,
ref LeftistHeap_Node* p2)
/*
pre: p1 va p2 Ia dIa chI nuf goc cua haI heap Ioch fraI.
post: Tra vo dja chI nuf goc cua heap Ioch fraI Ia kof qua fron haI hoap ban dau, p1 va p2 Ia
NULL.
uses: Su dung ham aux_merge.
*/
{
LeftistHeap_Node* p;
1. if (p1 == NULL)
1. p = p2;
2. if (p2 = NULL)
1. p = p1;
3. if (p1->data < p2->data)
1. p = aux_merge(p1, p2);
4. else
1. p = aux_merge(p2, p1);
5. p1 = NULL;
6. p2 = NULL;
7. return p;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 294

ThoI gIan fron haI heap Ioch fraI fI Io voI chIou daI cua duong dI phaI, va do
Ia O(logN). CIaI fhuaf do quy fron co fho duoc khu do quy nhu sau. uoc fhu
nhaf fhuc hIon fron duong dI phaI cua haI hoap, duong dI phaI cua hoap kof qua
chnh Ia fhu fu fang dan cua cac nuf fron duong dI phaI cua haI hoap ban dau |3,
6, 7, 8, 18). Kof qua cho fhay o hnh 11.6. uoc fhu haI dI Ian nguoc fron duong dI
phaI cua cay kof qua do hoan vj cac con fraI va con phaI khI can fhIof. Truong
hop chung fa vIoc hoan vj can fhuc hIon faI nuf 7 va nuf 3.










HInh 11.6. Kof qua sau buoc fhu nhaf cua gIaI fhuaf fron khong do quy.

Phop fhom mof phan fu moI chnh Ia phop fron heap Ioch fraI da co voI mof
heap Ioch fraI chI co duy nhaf nuf can fhom vao. Phop IoaI phan fu nho nhaf cua
heap Ioch fraI Ia phop Iay dI phan fu faI goc va fron haI cay con cua no voI nhau.
Nhu vay faf ca cac fac vu fron hoap Ioch fraI dou co chI ph O(logN).

3
10
8
21 14
23
17
26
12 7
18 24
33
37
18
6
LeftistHeap_Node* Leftist_Heap::aux_merge(ref LeftistHeap_Node* p1,
ref LeftistHeap_Node* p2)
/*
pre: p1 va p2 Ia dja chI nuf goc cua haI heap Ioch fraI.
post: Heap p2 duoc fron voI cay con phaI cua heap p1, p2 gan vo NULL.
uses: 8u Jung bam SwapChildren va recursive_merge.
*/
{
1. if (p1->left == NULL) // Truong hop nay p1_>right da Ia NULL do dIou kIon
1. p1->left = p2; // cua heap Ioch fraI.
2. else
1. p1->right = recursive_merge(p1->right, p2);
2. if(p1->left->Npl < p1->right->Npl)
1. SwapChildren(p1); // Trao 2 cay con cua p1.
3. p1->Npl = p1->right->Npl + 1;
3. return p1; // p2 da duoc gan NULL trong recursive_merge.
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 295
11.5.3. Skew heup
Skew heap gIong nhu heap Ioch fraI nhung khong chua fhong fIn vo NpI va
khong co rang buoc g vo chIou daI duong dI phaI. Nhu vay frong fruong hop xau
nhaf cac fac vu chI ph don O(N), khI cay nhj phan suy bIon fhanh chuoI mac
xch N nuf vo bon phaI.

Tac vu chnh cua skew heap cung Ia phop fron, frong do vIoc hoan vj haI
nhanh con Iuon duoc Iam. Tac vu nay co fho duoc hIon fhuc do quy hoac khong do
quy. Kof qua vIoc hoan vj faI faf ca cac nuf so Ia duong dI fraI cua heap cuoI cung
so chua faf ca cac nuf fron haI duong dI phaI cua haI heap ban dau fhoo dung fhu
fu fang dan gIua chung.












HInh 11.?. Kof qua fron H1 va H2 fhoo cach cua skew heap, hoan vj haI con fraI va phaI faI
moI nuf
Nhu vay fuy fruong hop xau nhaf cua skew heap Ia O(log N), nhung skew
heap co uu dIom Ia khong phaI chI ph do quan Iy NpI faI moI nuf va cung khong
phaI so sanh NpI do qyof djnh co hoan vj haI nuf con faI moI nuf hay khong.
11.5.4. Hung nh{ thuc (Binomial Queue)
Hang nhj fhuc Ia mof phuong an hIon fhuc cua hang uu fIon. Heap Ioch fraI va
skew heap fhuc hIon O(log N) moI fac vu doI voI vIoc fron, fhom va IoaI phan
fu nho nhaf. Heap nhj phan fhuc hIon moI fac vu fhom vao voI fhoI gIan frung
bnh Ia hang so. Hang nhj fhuc frong fruong hop xau nhaf fhuc hIon O(logN)
cho moI fac vu, nhung vIoc fhom vao cung co fhoI gIan frung bnh Ia hang so.

Khac voI moI hIon fhuc cua hang uu fIon ma chung fa da xom xof, hang nhj
fhuc khong phaI Ia mof cay co fraf fu cua heap, ma Ia mof rung cac cay co fraf fu
cua hoap, frong do khong duoc phop co haI cay co cung chIou cao. Thoo quy uoc,
cay co chIou cao 0 Ia cay co 1 nuf; cay co chIou cao k co duoc bang cach noI mof
cay chIou cao k-1 vao nuf goc cua mof cay chIou cao k-1 khac. Hnh 11.8 bIou dIon
cac cay co chIou cao Ian Iuof Ia 0, 1, 2, 3, 4. Tu hnh vo chung fa fhay, cay
k
bao
gom mof nuf goc va cac cay con
0
,
1
,,
k-1
. Cay
k
co chnh xac Ia 2
k
nuf, do do
3
10
8
21 14
23
17
26
12
7
18 24
33
37
18
6
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 296
fu day chung fa so goI cac cay nay Ia cuy nh{ thuc. So nuf o muc d frong cay nhj
fhuc Ia C
d
k
. Nou moI cay nhj fhuc frong hang nhj fhuc dou co fraf fu cua hoap va
khong cho phop co nhIou hon mof cay nhj fhuc co cung chIou cao fh hang uu fIon
voI kch fhuoc baf ky dou co fho duoc bIou dIon boI mof hang nhj fhuc nhu fho
nay. Chang han hang uu fIon co 13 nuf so gom cac cay nhj fhuc
3
,
2
, va
0
.
Iou dIon nhj phan cua 13 chnh Ia 1101, dIou nay hoan foan fuong ung voI su co
maf cua
3
,
2
, va
0
, ma khong co maf cua
1
.


0

1

2

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(log 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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(log N) cay nhj fhuc frong moI
hang nhj fhuc, vIoc fron haI hang nhj fhuc cung fon O(log 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(log 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Binomial_Node
DataType data
Binomial_Node* leftChild
Binomial_Node* nextSibling
end struct

struct Binomial_Tree
Binomial_Tree combineTrees(ref Binomial_Tree T1, ref Binomial_Tree T2)
Binomial_Node* root
int notEmpty() // Tra vo 1 nou cay khong rong, nguoc IaI fra vo 0.
end struct

class Binomial_Queue
public:
Binomial_Queue(Binomial_Node* p, int k)// k Ia so nuf frong hang nhj fhuc.
int empty
Binomial_Queue merge(ref Binomial_Queue H1, ref Binomial_Queue H2)
protected:
int count // Tong so nuf frong faf ca cac cay nhj fhuc.
Binomial_Tree Trees[MAX]
end class

Binomial_Tree Binomial_Tree::CombineTrees(ref Binomial_Tree T1,
ref Binomial_Tree 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. if (T1.root->data > T2.root->data)
1. Trao T1 va T2 cho nhau
2. T2.root->nextSibling = T1.root->leftChild // Chon cay T2 vao dau danh
// sach cac cay con cua goc cua T1
3. T1.root->leftChild = T2.root // Cap nhaf nuf con fraI cho nuf goc cua T1
4. T2.root = NULL
5. return T1
}
14
16 26
18
12
24 21
65
12
24 21
65
14
16 26
18
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 302



































Binomial_Queue Binomial_Queue::merge(ref Binomial_Queue H1,
ref Binomial_Queue H2)
/*
post: H1 chua kof qua fron haI hang nhj fhuc H1 va H2, H2 rong. Tra vo hang H1.
uscs: ham Binomial_Tree::notEmpty() fra vo 1 nou cay khong rong, nguoc IaI fra vo 0.
*/
{
Binomial_Tree T1, T2, carry
int i = 0
1. H1.count = H1.count + H2.count
2. loop (H2 chua rong hoac carry khong rong)
1. T1 = H1.Trees[i]
2. T2 = H2.Trees[i]
3. case (T1.notEmpty() + 2*T2.notEmpty() + 4*carry.notEmpty())
1. case 0: // Khong co cay nao
2. case 1: // ChI co cay T1
1. break
3. case 2: // ChI co cay T2
1. H1.Trees[i] = T2
2. H2.Trees[i].root = NULL
3. break
4. case 4: // ChI co cay carry
1. H1.Trees[i] = carry
2. carry.root = NULL
3. break
5. case 3: // Co cay T1 va T2
1. carry = combineTrees(T1, T2)
2. H1.Trees[i].root = NULL
3. H2.Trees[i].root = NULL
4. break
6. case 5: // Co cay T1 va carry
1. carry = combineTrees(T1, carry)
2. H1.Trees[i].root = NULL
3. break
7. case 6:// Co cay T2 va carry
1. carry = combineTrees(T2, carry)
2. H2.Trees[i].root = NULL
3. break
8. case 7:// Co ca 3 cay T1, T2, va carry
1. H1.Trees[i] = carry
2. carry = combineTrees(T1, T2)
3. H2.Trees[i].root = NULL
4. break
4. endcase
5. i = i + 1
3. endloop
4. return H1
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 du ng 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.
Binomial_Queue::Binomial_Queue(Binomial_Node* p, int 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. Trees[k] = p
2. p = p->nextSibling
3. Trees[k]->nextSibling = 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
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Cbuong 11 Hang uu ticn
Giao trnb Cau truc Ju /icu oa Giai tbuat 304


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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:

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 ca ch. 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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:

double array[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 item. KIou co so so Ia kIou item va 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_size, moI khoa so duoc
anh xa vao mof chI so frong khoang 0, hash_size-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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_size do Iay phan du, v nhu vay chung fa so co cac chI so fhuoc 0,
hash_size -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_size = 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 ASCII 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_size Ion, ham so khong phan bo cac khoa fof. Iay v du
voI hash_size =10007 |mof so nguyon fo). CIa su cac khoa co chIou daI 8 ky fu
hoac f hon. MoI ky fu co ma ASCII <=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).

index Hash(const char *Key, int hash_size)
{
unsigned int HashVal = 0;
while (*Key != \0)
{
HashVal += *Key;
Key++;
}
return HashVal % hash_size;
}
index Hash(const char *Key, int hash_size)
{
return (Key[0] + 27*Key[1] + 27*27*Key[2]) %hash_size;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
KeySize-1
Key[KeySize-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.

index Hash(const char *Key, int hash_size)
{
unsigned int HashVal = 0;
while (*Key != \0)
{
HashVal = (HashVal << 5 ) + *Key);
Key++;
}
return HashVal % hash_size;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_size 1.

Chung fa co mof Iop Key voI cac phuong fhuc nhu sau:

class Key: public String{
public:
char key_letter(int position) const;
void make_blank();
// Cac constructor 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.

int hash(const Key &target)
/*
post: Ham bam fron target fra vo frj frong mIon 0 .. hash_size-1.
uses: Cac phuong fhuc cua Iop Key.
*/
{
int value = 0;
for (int position = 0; position < 8; position++)
value = 4 * value + target.key_letter(position);
return value % hash_size;
}

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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_size, ham i
2
so fhu mof so fuong doI f cac vj fr frong bang. Iay v du,
khI hash_size Ia mof boI so Ion cua 2, chI khoang mof phan sau so cac vj fr
frong bang bam Ia duoc fhu. KhI hash_size 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_size 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_size. NoI cach khac,

h + i
2
h + (i + j)
2
(mod hash_size)

Ion doI bIou fhuc fron fa co:

j
2
+ 2ij = j(j + 2i) 0 (mod hash_size).

Iou fhuc nay co nghIa Ia j(j + 2i) chIa hof cho hash_size. 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_size. Trong fruong hop fhu nhaf, chung fa da phaI fhu j=hash_size 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_size 2i,
hoac khI bIou fhuc fang fhom hash_size nou bIou fhuc nay am. o do fong so vj
fr khac nhau duoc fhu so Ia

(hash_size + 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


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 326
doI voI moI i1 , 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
Record 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
Record co phuong fhuc do Iay mof khoa cua mof phan fu.

ang bam cua chung fa so co khaI bao nhu sau:

const int hash_size = 997; // So nguyon fo
class Hash_table {
public:
Hash_table();
void clear();
Error_code insert(const Record &new_entry);
Error_code retrieve(const Key &target, Record &found) const;
private:
Record table[hash_size];
};

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_table:: Hash_table();
// post: ang bam duoc fao va duoc khoI fao Ia rong.

Phuong fhuc clear can do IoaI faf ca cac du IIou hIon co frong bang bam:

void Hash_table::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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_size+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:

Error_code Hash_table::insert(const Record &new_entry)
/*
post: Nou bang bam day, phuong fhuc fra vo overflow.
Nou bang bam da chua phan fu co khoa frung khoa frong new_entry fh ph7ong fhuc fra
vo duplicate_error. Nguoc IaI, phan fu new_entry duoc fhom vao bang bam va
phuong fhuc fra vo success.
uses: Cac phuong fhuc cua cac Iop Key va Record, ham hash.
*/
{
Error_code result = success;
int probe_count, // om so Ian fhu do phaf hIon bang day.
increment, // So gIa fang bo phop fhu bac haI.
probe; // Vj fr fhu hIon fhoI.
Key null; // CIa frj NULL cua khoa dung cho phop so sanh.
null.make_blank();

probe = hash(new_entry);
probe_count = 0;
increment = 1;

while (table[probe] != null // Vj fr fhu co frong hay khong7
&& table[probe] != new_entry // Khoa da co frong bang bam7
&& probe_count < (hash_size + 1) / 2) {// ang day hay chua7
probe_count++;
probe = (probe + increment) % hash_size;
increment += 2; // Tnh IaI do doI cho Ian fhu ko fIop.
}
if (table[probe]==null) table[probe]= new_entry;
else if (table[probe] == new_entry) result = duplicate_error;
else result = overflow;
return result;
}

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_present.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 kho ng 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 chIo m 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:

class Hash_table {
public:
// Specify methods here.
private:
List<Record> table[hash_size];
};

O day Iop List 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 List.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 List 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 target, 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_present.

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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_size) 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 |xa c suaf xuaf hIon bang nhau fron moI
x x
x x
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 (log 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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 12 Bang va truy xuat thong tin
Giao trnh Cau truc d lieu va Giai thuat 338

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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

cac canh co chua doI voI moI dInh frong do


fhj, hoac, mof cach fuong duong, fap A

gom faf ca cac dInh ko voI . Thaf vay,


chung fa co fho dung y fuong nay do dua ra mof djnh nghIa moI fuong duong cho
do fhj:

nh ngha: Mof do fhj co huong C bao gom fap V, goI Ia cac dInh cua C, va, doI
voI moI V, co mof fap con A

, goI Ia fap cac dInh ko cua .

Tu cac fap con A

chung fa co fho faI fao IaI cac canh nhu Ia cac cap co fhu fu
fhoo quy fac sau: cap |, v) Ia mof canh nou va chI nou v A

. Xu Iy cho fap cac


dInh do hon Ia fap cac canh. NgoaI ra, djnh nghIa moI nay fhch hop voI ca do fhj
co huong va do fhj vo huong. Mof do fhj Ia vo huong khI no fhoa fnh chaf doI
xung sau: v A

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)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 343
std::bitset<max_set>, hoac Iop co su dung template cho kch fhuoc fap hop
cua chung fa nhu sau:

template <int max_set>
struct Set {
bool is_element[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
template <int max_size>
class Digraph {
int count; // So dInh cua do fhj, nhIou nhaf Ia max_size
Set<max_size> neighbors[max_size];
};

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 neighbors[] 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 neighbors frong djnh nghIa cua Iop Graph 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
template <int max_size>
class Digraph {
int count; // So dInh cua do fhj, nhIou nhaf Ia max_size.
bool adjacency[max_size][max_size];
};
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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: adjacency[v][w] Ia
true nou va chI nou dInh v Ia dInh ko cua v. Nou Ia do fhj co huong,
adjacency[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 adjacency[v][w]=
adjacency[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).

typedef int Vertex;
template <int max_size>
class Digraph {
int count; // So dInh cua do fhj, nhIou nhaf Ia max_size.
List<Vertex> neighbors[max_size];
};


(u) (b) (c)
HInh 13.4 Tap cac dInh ko va bang ko.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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:

class Edge;
class Vertex {
Edge *first_edge; // ChI don phan fu dau cua SIK cac dInh ko.
Vertex *next_vertex; // ChI don phan fu ko frong SIK cac dInh co frong do fhj.
};

class Edge {
Vertex *end_point; // 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 346

class Digraph {
Vertex *first_vertex;// 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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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);
for (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, visited[v] so Ia true khI
v vua duoc duyof xong, va chung fa Iuon xof frj cua visited[w] fruoc khI xu Iy
cho v, nou frj nay da Ia true 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.

template <int max_size>
void Digraph<max_size>::depth_first(void (*visit)(Vertex &)) const
/*
post: Ham *visit duoc fhuc hIon faI moI dInh cua do fhj mof Ian, fhoo fhu fu duyof fhoo chIou
sau.
uses: Ham traverse fhuc hIon duyof fhoo chIou sau.
*/



HInh 13.6 - uyof do fhj
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 348
{
bool visited[max_size];
Vertex v;
for (all v in G) visited[v] = false;
for (all v in G) if (!visited[v])
traverse(v, visited, visit);
}

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
Digraph. NgoaI ra, do traverse Ia mof ham phu fro va chI duoc su dung frong
phuong fhuc depth_first, no non duoc khaI bao private bon frong Iop.

template <int max_size>
void Digraph<max_size>::traverse(Vertex &v, bool visited[],
void (*visit)(Vertex &)) const
/*
pre: v Ia mof dInh cua do fhj Digraph.
post: uyof fhoo chIou sau, ham *visit so duoc fhuc hIon faI v va faI faf ca cac dInh co fho
don duoc fu v.
uses: Ham traverse mof cach do quy.
*/
{ Vertex w;
visited[v] = true;
(*visit)(v);
for (all w adjacent to v)
if (!visited[w])
traverse(w, visited, visit);
}
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.

template <int max_size>
void Digraph<max_size>::breadth_first(void (*visit)(Vertex &)) const
/*
post: Ham *visit 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 visited[max_size];
Vertex v, w, x;
for (all v in G) visited[v] = false;

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 349
for (all v in G)
if (!visited[v]) {
q.append(v);
while (!q.empty()){
q.retrieve(w);
if (!visited[w]) {
visited[w] = true;
(*visit)(w);
for (all x adjacent to w)
q.append(x);
}
q.serve();
}
}
}
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 topo |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
topo, 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 topo 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 topo
cho cac do muc frong sach. HaI fhu fu topo 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 topo 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
Digraph su dung hIon fhuc dua fron co so Ia danh sach. Chung fa co dac fa Iop
nhu sau:
typedef int Vertex;

template <int graph_size>
class Digraph {
public:
Digraph();
void read();
void write();
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 350
// Cac phuong fhuc sap fhu fu topo.
void depth_sort(List<Vertex> &topological_order);
void breadth_sort(List<Vertex> &topological_order);

private:
int count;
List <Vertex> neighbors[graph_size];
void recursive_depth_sort(Vertex v, bool visited[],
List<Vertex> &topological_order);
};

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 topo fuong ung.
13.4.2. Gu thuut duyet theo cheu suu
Trong fhu fu topo, 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 topo
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 topo o cac vj fr cuoI mang. Tnh fu phaI sang fraI frong mang fhu
fu topo nay, khI cac dInh ko cua mof dInh da duoc duyof xong, fh chnh dInh do

HInh 13.? Cac fhu fu topo cua mof do fhj co huong
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 topo) chI duoc fhuc hIon sau
khI cac dInh ko cua no da duoc xu Iy.
template <int graph_size>
void Digraph<graph_size>::depth_sort(List<Vertex> &topological_order)
/*
post: Cac dInh cua mof do fhj co huong khong co chu frnh duoc xop fhoo fhu fu topo fuong ung
cach duyof do fhj fhoo chIou sau.
uses: Cac phuong fhuc cua Iop List, ham do quy recursive_depth_sort.
*/
{
bool visited[graph_size];
Vertex v;
for (v = 0; v < count; v++) visited[v] = false;
topological_order.clear();
for (v = 0; v < count; v++)
if (!visited[v]) // Thom cac dInh ko cua v va sau do Ia v vao mang fu fu topo fu
phaI sang
fraI.
recursive_depth_sort(v, visited, topological_order);
}

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 topo, sau do moI daf v vao.

template <int graph_size>
void Digraph<graph_size>::recursive_depth_sort(Vertex v, bool *visited,
List<Vertex> &topological_order)
/*
pre: Inh v chua co frong mang fhu fu topo.
post: Thom cac dInh ko cua v va sau do Ia v vao mang fu fu topo fu phaI sang fraI.
uses: Cac phuong fhuc cua Iop List va ham do quy recursive_depth_sort.
*/
{ visited[v] = true;
int degree = neighbors[v].size();
for (int i = 0; i < degree; i++) {
Vertex w;
neighbors[v].retrieve(i, w); // Mof dInh ko cua v.
if (!visited[w]) // uyof fIop xuong dInh v.
recursive_depth_sort(w, visited, topological_order);
}
topological_order.insert(0, v); // af v vao mang fhu fu topo.
}

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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 topo 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 topo 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 topo. CIaI fhuaf nay so Ian
Iuof daf cac dInh cua do fhj vao mang fhu fu topo 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 topo. 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 topo, 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.

template <int graph_size>
void Digraph<graph_size>::breadth_sort(List<Vertex> &topological_order)
/*
post: Cac dInh cua mof do fhj co huong khong co chu frnh duoc xop fhoo fhu fu topo fuong ung
cach duyof do fhj fhoo chIou rong.
uses: Cac phuong fhuc cua cac Iop List, Queue.
*/
{ topological_order.clear();
Vertex v, w;
int predecessor_count[graph_size];
for (v = 0; v < count; v++) predecessor_count[v] = 0;
for (v = 0; v < count; v++)
for (int i = 0; i < neighbors[v].size(); i++) { // Cap nhaf so dInh dung
fruoc cho moI dInh.
neighbors[v].retrieve(i, w);
predecessor_count[w]++;
}
Queue<Vertex> ready_to_process;
for (v = 0; v < count; v++)
if (predecessor_count[v] == 0)
ready_to_process.append(v);

while (!ready_to_process.empty()) {
ready_to_process.retrieve(v);
topological_order.insert(topological_order.size(), v);
for (int j = 0; j < neighbors[v].size(); j++) { // CIam so dInh dung fruoc
neighbors[v].retrieve(j, w); // cua moI dInh ko cua v dI 1
predecessor_count[w]--;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 353
if (predecessor_count[w] == 0)
ready_to_process.append(w);
}
ready_to_process.serve();
}
}

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
breadth_first 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 distance 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 distance[v] chua khoang cach
ngan nhaf don , va moI canh nam fron duong dI fuong ung dou co mau. Nou
khong fhuoc S, fh distance[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 distance duoc khoI fao bang
cach gan fung distance[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 distance sao cho chua co frong S. Chung fa can chung
mInh rang, doI voI dInh nay, khoang cach chua frong mang distance 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
distance[x] < distance[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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 distance 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 distance[w] bang distance[v] cong voI faI frong
cua canh noI fu don w.


HInh 12.10 - V du vo cac duong dI ngan nhaf
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 distance 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 distance[3]
duoc cap nhaf fhanh 6. o khoang cach don 1 va 2 ngang qua 4 Ion hon khoang
cach da chua frong mang distance, non cac khoang cach nay frong distance
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 template cho phop nguoI su dung chon Iua
kIou cua faI frong fhoo y muon. Iay v du, nguoI su dung khI dung Iop Digraph
do mo hnh hoa mang cac fuyon bay, ho co fho chua gIa vo Ia mof so nguyon hay
mof so fhuc.
template <class Weight, int graph_size>
class Digraph {
public:
// Thom constructor va cac phuong fhuc nhap va xuaf do fhj.
void set_distances(Vertex source, Weight distance[]) const;
protected:
int count;
Weight adjacency[graph_size][graph_size];
};
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 Weight da co cac fac vu so sanh. NgoaI ra, nguoI
su dung so phaI khaI bao frj Ion nhaf co fho co cua Weight, 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++<limits> voI djnh nghIa foan cuc nhu sau:

const Weight infinity = numeric_limits<int>::max();
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 distance 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 distance[].

template <class Weight, int graph_size>
void Digraph<Weight, graph_size>::set_distances(Vertex source,
Weight distance[]) const
/*
post: Mang distance chua duong dI co faI frong ngan nhaf fu dInh nguon don moI dInh frong
do fhj.
*/
{ Vertex v, w;
bool found[graph_size]; // Iou dIon cac dInh frong S.
for (v = 0; v < count; v++) {
found[v] = false;
distance[v] = adjacency[source][v];
}
found[source]=true;// KhoI fao bang cach bo dInh nguon vao S.
distance[source] = 0;
for(int i = 0; i < count; i++){ // MoI Ian Iap bo fhom mof dInh vao S.
Weight min = infinity;
for (w = 0; w < count; w++) if (!found[w])
if (distance[w] < min) {
v = w;
min = distance[w];
}
found[v] = true;
for (w = 0; w < count; w++) if (!found[w])
if (min + adjacency[v][w] < distance[w])
distance[w] = min + adjacency[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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 chu ng 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 distance so Ia infinity.
Mang neighbor duoc khoI fao bang cach gan neighbor[v] don dInh nguon
cho faf ca cac dInh , va distance duoc khoI fao bang cach gan distance[v]
boI faI frong cua canh noI fu dInh nguon don hoac infinity 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 distance 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
distance[w] hay khong, nou qua fhuc nhu vay fh distance[w] can duoc cap
nhaf IaI bang frj cua faI frong nay, va neighbor[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 neighbor[w| duoc chI boI cac muI fon
fu v. Trj cua distance[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 neighbor va distance 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 Network dan xuaf fu Iop
Digraph.

template <class Weight, int graph_size>
class Network: public Digraph<Weight, graph_size> {
public:
Network();
void read(); // jnh nghIa IaI do nhap fhong fIn vo mang.
void make_empty(int size = 0);
void add_edge(Vertex v, Vertex w, Weight x);
void minimal_spanning(Vertex source,
Network<Weight, graph_size> &tree) 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 Weight da co
day du cac foan fu so sanh. NgoaI ra, nguoI su dung can khaI bao frj Ion nhaf co
fho cua Weight 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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 13 o th
Giao trnh Cau truc d lieu va Giai thuat 362
template <class Weight, int graph_size>
void Network<Weight, graph_size>::minimal_spanning(Vertex source,
Network<Weight, graph_size> &tree) const
/*
post: Xac djnh cay phu foI fIou frong fhanh phan IIon fhong co chua dInh source cua mang.
*/
{
tree.make_empty(count);
bool component[graph_size]; // Cac dInh frong fap X.
Vertex neighbor[graph_size];// 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.
Weight distance[graph_size];// Cac khoang cach nho nhaf fuong ung voI fung phan fu
// frong mang neighbor fron.
Vertex w;

for (w = 0; w < count; w++) {
component[w] = false;
distance[w] = adjacency[source][w];
neighbor[w] = source;
}
component[source] = true; // Tap X chI co duy nhaf dInh nguon.
for (int i = 1; i < count; i++) {
Vertex v; // MoI Ian Iap bo sung fhom mof dInh vao fap X.
Weight min = infinity;
for (w = 0; w < count; w++) if (!component[w])
if (distance[w] < min) {
v = w;
min = distance[w];
}

if (min < infinity) {
component[v] = true;
tree.add_edge(v, neighbor[v], distance[v]);
for (w = 0; w < count; w++) if (!component[w])
if (adjacency[v][w] < distance[w]) {
distance[w] = adjacency[v][w];
neighbor[w] = v;
}
}
else break; // 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 ca c cau fruc foan hoc, chu khong nhu cac cau
fruc du IIou, do chung fa da su dung chu ng 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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 decNum sang 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 loop (decNum > 0)
1 digit = decNum % 2
2 xuaf (digit)
3 decNum = decNum / 2
2 endloop
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 |array frong
C++) do chua cac so digit 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 DecimalToBinary |val int decNum)
post: so nhj phan fuong duong voI so fhap phan decNum so duoc xuaf ra.
uses: su dung Iop Stack 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. loop |docNum > 0)
1. digit = decNum % 2
2. reverse.push(digit)
3. decNum = decNum / 2
3. endloop
4. loop (!reverse.empty())
1. reverse.top(digit)
2. reverse.pop()
3. xuaf(digit)
5 endloop
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 ...`/)

int main()
/*
post: Chuong frnh so bao cho nguoI su dung khI doan van ban can phan fch gap IoI.
uses: Iop Stack.
*/
{
Stack<char> openings;
char symbol;
bool is_matched = true;
while (is_matched && (symbol = cin.get()) != '\n') {
if (symbol == '{' || symbol == '(' || symbol == '[')
openings.push(symbol);
if (symbol == '}' || symbol == ')' || symbol == ']') {
if (openings.empty()) {
cout << "Unmatched closing bracket " << symbol
<< " detected." << endl;
is_matched = false;
}
else {
char match;
openings.top(match);
openings.pop();
is_matched = (symbol == '}' && match == '{')
|| (symbol == ')' && match == '(')
|| (symbol == ']' && match == '[');
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
368
if (!is_matched)
cout << "Bad match " << match << symbol << endl;
}
}
}
if (!openings.empty())
cout << "Unmatched opening bracket(s) detected." << 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 cctype.
int main()
/*
post: chuong frnh fhuc hIon fnh foan frj cua bIou fhuc so hoc dang posffIx do nguoI su dung
nhap vao.
uses: Iop Stack va cac ham introduction, instructions, do_command, get_command.
*/

{
Stack<double> stored_numbers;
introduction(); // CIoI fhIou vo chuong frnh.
instructions(); // Xuaf cac huong dan su dung chuong frnh.
while (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).
*/
{
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
370
char command;
bool waiting = true;
cout << "Select command and press <Enter>:";

while (waiting) {
cin >> command;
command = tolower(command);
if (command == '?' || command == '=' || command == '+' ||
command == '-' || command == '*' || command == '/' ||
command == 'q' ) waiting = false;
else {
cout << "Please enter a valid command:" << endl
<< "[?]push to stack [=]print top" << endl
<< "[+] [-] [*] [/] are arithmetic operations" << endl
<< "[Q]uit." << endl;
}
}
return command;
}

Ngan xop stored_numbers 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<double> &numbers)
/*
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 true, ngoaI fru fruong hop kof fhuc
vIoc fnh foan khI command Ia q.
uses: Iop Stack.
*/
{
double p, q;
switch (command) {
case '?':
cout << "Enter a real number: " << flush;
cin >> p;
if (numbers.push(p) == overflow)
cout << "Warning: Stack full, lost number" << endl;
break;

case '=':
if (numbers.top(p) == underflow)
cout << "Stack empty" << endl;
else
cout << p << endl;
break;

case '+':
if (numbers.top(p) == underflow)
cout << "Stack empty" << endl;
else {
numbers.pop();
if (numbers.top(q) == underflow) {
cout << "Stack has just one entry" << endl;
numbers.push(p);
}

else {
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 14 ng dung cua ngan xep
Giao trnh Cau truc d lieu va Giai thuat
371
numbers.pop();
if (numbers.push(q + p) == overflow)
cout << "Warning: Stack full, lost result" << endl;
}
}
break;

// Add options for further user commands.

case 'q':
cout << "Calculation finished.\n";
return false;
}
return true;
}

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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.


Start 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)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Algorithm seek_goal(val graph_type graph, val node_type start,
val node_type goal)
/*
pre: graph chua do fhj khong co chu frnh, frong do co mof nuf start va mof nuf goal.
post: nou duong dI fu start don goal duoc fm fhay so duoc In ra fhoo fhu fu fu goal nguoc
vo start
`/
{
1. Stack<node_type> nodes. // node_type Ia kIou du IIou fhch hop.
2. node_type current_node = start
3. boolean fail = FALSE
4. loop ((current_node chua Ia goal) AND (!fail))
1. nodes.push(current_node)
2. if (current_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. fail = TRUE
2. else
1. nodes.top(next_node)
2. nodes.pop()
3. endif
2. until ((fail) OR (next_node co B))
3. endif
4. endif
5. current_node = next_node
5. endloop
6. if (!fail)
1. print(The path to your goal is:)
2. print(current_node) // chnh Ia goaI
3. loop (!nodes.empty())
1. nodes.top(current_node)
2. nodes.pop()
3. if (current_node khong co ky fu B)
1. print(current_node)
4. endif
4. endloop
7. else
1. print(Path not found!)
8. endif
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 |Polynomial) do su dung frong chuong
frnh. VIoc hIon fhuc chuong frnh so fro non raf don gIan. Chuong frnh chnh
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.

int 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 Stack, Polynomial va cac ham introduction, instructions,
do_command, get_command.
*/
{
Stack<Polynomial> stored_polynomials;
introduction();
instructions();
while (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 Polynomial. Chang han chung fa can phuong fhuc equals_sum
do cong haI da fhuc. Cho p, q, r Ia cac doI fuong da fhuc, p.equals_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 equals_difference, equals_product, va equals_quotient do fhuc
hIon cac phop fnh so hoc khac fron da fhuc.

NgoaI ra, Iop Polynomial con haI phuong fhuc khong fhong so Ia print va
read 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<Polynomial> &stored_polynomials)
/*
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
true ngoaI fru fruong hop command='q' fh ham fra vo false.
uses: Cac Iop Stack va Polynomial.
*/

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 380
{
Polynomial p, q, r;
switch (command) {

case '?':
p.read();
if (stored_polynomials.push(p) == overflow)
cout << "Warning: Stack full, lost polynomial" << endl;
break;

case '=':
if (stored_polynomials.empty())
cout << "Stack empty" << endl;
else {
stored_polynomials.top(p);
p.print();
}
break;

case '+':
if (stored_polynomials.empty())
cout << "Stack empty" << endl;
else {
stored_polynomials.top(p);
stored_polynomials.pop();
if (stored_polynomials.empty()) {
cout << "Stack has just one polynomial" << endl;
stored_polynomials.push(p);
}
else {
stored_polynomials.top(q);
stored_polynomials.pop();
r.equals_sum(q, p);
if (stored_polynomials.push(r) == overflow)
cout << "Warning: Stack full, lost polynomial" << endl;
}
}
break;
// Can bo sung cac dong Ionh do fhuc hIon cac phop fnh con IaI.

case 'q':
cout << "Calculation finished." << endl;
return false;
}
return true;
}
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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Polynomial. 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 Polynomial, chung fa khaI bao so fhuc.

class Polynomial {
public:
void read();
void print();
void equals_sum(Polynomial p, Polynomial q);
void equals_difference(Polynomial p, Polynomial q);
void equals_product(Polynomial p, Polynomial q);
ErrorCode equals_quotient(Polynomial p, Polynomial q);
private:
double value; // mau fam dung do fhu chuong frnh.
};

Phuong fhuc equals_quotient can kIom fra phop chIa 0 non can fra vo
ErrorCode. Ham sau day Ia mof dIon hnh cho mau phuong fhuc dung do fhu
chuong frnh.

void Polynomial::equals_sum(Polynomial p, Polynomial q)
{
value = p.value + q.value; // 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
|term), 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 struct do
khaI bao so hang


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 382
struct Term {
int degree;
double coefficient;
Term (int exponent = 0, double scalar = 0);
};

Term::Term(int exponent, double scalar)
/*
post: Term duoc 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.
*/
{
degree = exponent;
coefficient = scalar;
}

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 Term. Nhu vay, cac phop fnh so hoc co fho xom da fhuc nhu Ia mof
Queue, hay chnh xac hon, nhu Ia Extended_queue, v chung fa fhuong xuyon
can don cac phuong fhuc clear va serve_and_retrieve.

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
Polynomial Ia Iop dan xuaf fu Iop Extended_Queue, chung fa chI vIoc bo sung
cac phuong fhuc rIong cua da fhuc.

o hIon fhuc cu fho cho Iop dan xuaf Polynomial, chung fa can daf cau hoI:
mof da fhuc co han Ia mof Extended_Queue hay khong7

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 383
Mof Extended_Queue cung cap cac phuong fhuc nhu serve chang han,
phuong fhuc nay khong nhaf fhIof va cung khong non Ia phuong fhuc cua
Polynomial. So Ia mof dIou khong hay khI chung fa cho phop nguoI su dung goI
phuong fhuc serve do IoaI dI mof phan fu cua Polynomial. a fhuc non Ia mof
doI fuong dong kn. V vay mof Polynomial khong han Ia mof Extended_Queue.
Mac du raf co IoI khI su dung IaI cac fhuoc fnh va cac phuong fhuc fu
Extended_Queue cho Polynomial, 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 public frong C++. Nou khaI bao fhua ko public 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 Polynomial fhua ko rIong fu Iop
Extended_Queue: cac fhuoc fnh va cac phuong fhuc cua Extended_Queue co fho duoc su dung
frong hIon fhuc cua Iop Polynomial, nhung chung khong duoc nhn fhay boI nguoI su dung.

class Polynomial: private Extended_queue<Term> { // Thua ko rIong.

public:
void read();
void print() const;
void equals_sum(Polynomial p, Polynomial q);
void equals_difference(Polynomial p, Polynomial q);
void equals_product(Polynomial p, Polynomial q);
Error_code equals_quotient(Polynomial p, Polynomial q);
int degree() const;
private:
void mult_term(Polynomial p, Term t);
};



HInh 15.1- Iou dIon da fhuc boI mof hang IIon kof cac so hang
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 degree fra vo bac cua da
fhuc va mult_term do nhan mof da fhuc voI mof term.
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
.

void Polynomial::print() const
/*
post: a fhuc duoc In ra cout.
*/
{
Node *print_node = front;
bool first_term = true;

while (print_node != NULL) {
Term &print_term = print_node->entry;
if (first_term) { // Khong in dau + a u a thc.
first_term = false;
if (print_term.coefficient < 0) cout << "- ";
}
else if (print_term.coefficient < 0) cout << " - ";
else cout << " + ";
double r = (print_term.coefficient >= 0)
? print_term.coefficient : -(print_term.coefficient);
if (r != 1) cout << r;
if (print_term.degree > 1) cout << " X^" << print_term.degree;
if (print_term.degree == 1) cout << " X";
if (r == 1 && print_term.degree == 0) cout << " 1";
print_node = print_node->next;
}
if (first_term)
cout << "0"; // Print 0 for an empty Polynomial.
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.

void Polynomial::read()
/*
post: a fhuc duoc doc fu cin.
*/

{
clear();
double coefficient;
int last_exponent, exponent;
bool first_term = true;

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 385
cout << "Enter the coefficients and exponents for the polynomial, "
<< "one pair per line. Exponents must be in descending order."
<< endl
<< "Enter a coefficient of 0 or an exponent of 0 to terminate." <<
endl;

do {
cout << "coefficient? " << flush;
cin >> coefficient;

if (coefficient != 0.0) {
cout << "exponent? " << flush;
cin >> exponent;
if ((!first_term && exponent >= last_exponent) || exponent < 0) {
exponent = 0;

cout << "Bad exponent: Polynomial terminates without its last
term."
<< endl;
}
else {
Term new_term(exponent, coefficient);
append(new_term);
first_term = false;
}
last_exponent = exponent;
}
} while (coefficient != 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.

void Polynomial::equals_sum(Polynomial p, Polynomial q)
/*
post: oI fuong da fhuc so co frj bang fong haI da fhuc nhan vao fu fhong so.
*/
{
clear();
while (!p.empty() || !q.empty()) {
Term p_term, q_term;
if (p.degree() > q.degree()) {
p.serve_and_retrieve(p_term);
append(p_term);
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 15 ng dung cua hang i
Giao trnh Cau truc d lieu va Giai thuat 386
else if (q.degree() > p.degree()) {
q.serve_and_retrieve(q_term);
append(q_term);
}
else {
p.serve_and_retrieve(p_term);
q.serve_and_retrieve(q_term);


if (p_term.coefficient + q_term.coefficient != 0) {
Term answer_term(p_term.degree,
p_term.coefficient + q_term.coefficient);
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 degree duoc goI do fra vo bac cua da
fhuc, nou da fhuc rong, degree 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.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 List va String. 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 Editor Ia mof
String. o do Iop Editor so duoc fhua ko fu Iop List cac String. Cac Ionh xu
Iy van ban duoc chIa Iam haI nhom: nhom cac fac vu cua List so xu Iy cho cac
dong van ban, va nhom cac fac vu cua String 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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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:

edit infile outfile

frong do infile va outfile 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 Editor goI Ia
buffer, Iap IaI vIoc chay phuong fhuc get_command cua Editor do doc cac Ionh
roI xu Iy cac Ionh nay.

int main(int argc, char *argv[]) // count, values of command-line arguments
/*
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 Editor.
*/
{
if (argc != 3) {
cout << "Usage:\n\t edit inputfile outputfile" << endl;
exit (1);
}
ifstream file_in(argv[1]); // KhaI bao va mo fap fIn doc.
if (file_in == 0) {
cout << "Can't open input file " << argv[1] << endl;
exit (1);
}
ofstream file_out(argv[2]); // KhaI bao va mo fap fIn ghI.
if (file_out == 0) {
cout << "Can't open output file " << argv[2] << endl;
exit (1);
}
Editor buffer(&file_in, &file_out);
while (buffer.get_command())
buffer.run_command();
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Editor can chua mof List cac doI fuong String, va cho phop cac fac vu
dI chuyon fhoo ca haI huong cua List 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
Editor 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 run_command
ma chuong frnh chnh so goI. NgoaI ra Iop Editor con can fhom fhuoc fnh do
chua Ionh fu nguoI su dung |user_command) va cac fham chIou don dong nhap va
xuaf |infile va outfile).

class Editor:public List<String> {
public:
Editor(ifstream *file_in, ofstream *file_out);
bool get_command();
void run_command();
private:
ifstream *infile;
ofstream *outfile;
char user_command;

// Cac ham phu fro
Error_code next_line();
Error_code previous_line();
Error_code goto_line();
Error_code insert_line();
Error_code substitute_line();
Error_code change_line();
void read_file();
void write_file();
void find_string();
};

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
Editor.

Editor::Editor(ifstream *file_in, ofstream *file_out)
/*
post: KhoI fao doI fuong Editor voI frj cho haI fhuoc fnh infile, outfile.
*/
{
infile = file_in;
outfile = file_out;
}

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
tolower chuyon ky fu hoa fhanh ky fu fhuong co frong fhu vIon <cctype>, 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 Editor::get_command()
/*
post: Can frj cho fhuoc fnh user_command; fra vo true fru khI nguoI su dung go q
uses: Ham tolower cua fhu vIon C..
*/
{
if (current != NULL)
cout << current_position << " : "
<< current->entry.c_str() << "\n??" << flush;
else
cout << "File is empty. \n??" << flush;

cin >> user_command;// o qua cac khoang frang va nhan Ionh cua nguoI su dung
user_command = tolower(user_command);
while (cin.get() != '\n'); // o qua phm enter
if (user_command == 'q')
return false;
else
return true;
}
16.2.4. Thuc hen lenh
Phuong fhuc run_command chua Ionh switch do chon cac ham khac nhau
fuong ung voI cac Ionh can fhuc hIon. Mof vaI Ionh frong so nay |fua nhu remove)
Ia cac phuong fhuc cua List. Nhung Ionh khac dua fron cac fac vu xu Iy cua List
nhung co bo sung xu Iy nhung you cau cua nguoI su dung.

void Editor::run_command()
/*
post: Ionh frong user_command duoc fhuc hIon.
uses: Cac phuong fhuc va cac ham phu fro cua cac Iop Editor,
String, va cac ham xu Iy chuoI ky fu.
*/
{
String temp_string;
switch (user_command) {
case 'b':
if (empty())
cout << " Warning: empty buffer " << endl;
else
while (previous_line() == success);
break;
case 'c':
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 391
if (empty())
cout << " Warning: Empty file" << endl;
else if (change_line() != success)
cout << " Error: Substitution failed " << endl;
break;

case 'd':
if (remove(current_position, temp_string) != success)
cout << " Error: Deletion failed " << endl;
break;

case 'e':
if (empty())
cout << " Warning: empty buffer " << endl;
else
while (next_line() == success)
;
break;

case 'f':
if (empty())
cout << " Warning: Empty file" << endl;
else
find_string();
break;

case 'g':
if (goto_line() != success)
cout << " Warning: No such line" << endl;
break;

case '?':
case 'h':
cout << "Valid commands are: b(egin) c(hange) d(el) e(nd)"
<< endl
<< "f(ind) g(o) h(elp) i(nsert) l(ength) n(ext) p(rior) "
<< endl
<< "q(uit) r(ead) s(ubstitute) v(iew) w(rite) " << endl;

case 'i':
if (insert_line() != success)
cout << " Error: Insertion failed " << endl;
break;

case 'l':
cout << "There are " << size() << " lines in the file." << endl;
if (!empty())
cout << "Current line length is "
<< strlen((current->entry).c_str()) << endl;
break;

case 'n':
if (next_line() != success)
cout << " Warning: at end of buffer" << endl;
break;
case 'p':
if (previous_line() != success)
cout << " Warning: at start of buffer" << endl;
break;


Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 16 ng dung x ly van ban
Giao trnh Cau truc d lieu va Giai thuat 392
case 'r':
read_file();
break;

case 's':
if (substitute_line() != success)
cout << " Error: Substitution failed " << endl;
break;

case 'v':
traverse(write);
break;

case 'w':
if (empty())
cout << " Warning: Empty file" << endl;
else
write_file();
break;

default :
cout << "Press h or ? for help or enter a valid 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.

void Editor::read_file()
/*
pre: Nou Editor khong rong fh nguoI su dung so fra IoI co chop do noI dung moI Ion hay
khong.
post: oc fap fIn doc vao Editor. NoI dung cu nou co frong Editor so bj chop do.
uses: Cac phuong fhuc va cac ham cua String va Editor.
*/

{
bool proceed = true;
if (!empty()) {
cout << "Buffer is not empty; the read will destroy it." << endl;
cout << " OK to proceed? " << endl;
if (proceed = user_says_yes()) clear();
}

int line_number = 0, terminal_char;
while (proceed) {
String in_string = read_in(*infile, terminal_char);
if (terminal_char == EOF) {
proceed = false;
if (strlen(in_string.c_str()) > 0)
insert(line_number , in_string);
}
else insert(line_number++, in_string);
}
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 read_in cua Iop String frong phan 5.3. Sau do chuoI ky fu duoc chon vao
List nho phuong fhuc Insorf cua List. Chung fa khong can kIom fra vung dom
da day hay chua do cac fac vu cua List da chju frach nhIom vo vIoc nay.
Error_code Editor::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 String va Editor.
*/
{
int line_number;
cout << " Insert what line number? " << flush;
cin >> line_number;
while (cin.get() != '\n');
cout << " What is the new line to insert? " << flush;
String to_insert = read_in(cin);
return insert(line_number, to_insert);
}
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 strstr cua String 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.
void Editor::find_string()
/*
pre: Editor 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 String va Editor.
*/
{
int index;
cout << "Enter string to search for:" << endl;
String search_string = read_in(cin);
while ((index = strstr(current->entry, search_string)) == -1)
if (next_line() != success) break;
if (index == -1) cout << "String was not found.";
else {
cout << (current->entry).c_str() << endl;
for (int i = 0; i < index; i++)
cout << " ";
for (int j = 0; j < strlen(search_string.c_str()); j++)
cout << "^";
}
cout << endl;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_line 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 String va C-
String duoc fhuc hIon do IoaI chuoI ky fu cu va fho chuoI ky fu moI vao.

Error_code Editor::change_line()
/*
pre: Editor 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 fail.
uses: Cac phuong fhuc va cac ham cua String va Editor.
*/
{
Error_code result = success;
cout << " What text segment do you want to replace? " << flush;
String old_text = read_in(cin);
cout << " What new text segment do you want to add in? " << flush;
String new_text = read_in(cin);

int index = strstr(current->entry, old_text);
if (index == -1) result = fail;
else {
String new_line;
strncpy(new_line, current->entry, index);
strcat(new_line, new_text);
const char *old_line = (current->entry).c_str();
strcat(new_line, (String)(old_line + index + +
strlen(old_text.c_str())));
current->entry = new_line;
}
return result;
}

Ionh strcat(new_line,
(String)(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 String va noI voI
new_line.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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:

void permute(int k,int 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.
*/
{
for // voI moI vj fr frong k vj fr co fho frong danh sach.
{
// Chon k vao vj fr nay.
if (k == n) process_permutation;
else 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 process_permutation.
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.



Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 397
void permute(int new_entry, int degree, List<int> &permutation)
/*
pre: permutation chua 1 hoan vj voI cac phan fu fu 1 don new_entry - 1.
post: MoI hoan vj cua degree phan fu duoc fao non fu hoan vj da co va so duoc xu Iy frong ham
process_permutation.
uses: ham permute mof cach do quy, ham process_permutation, va cac ham cua List.
*/
{
for (int current = 0; current < permutation.size() + 1; current++) {
permutation.insert(current, new_entry);
if (new_entry == degree)
process_permutation(permutation);
else
permute(new_entry + 1, degree, permutation);
permutation.remove(current, new_entry);
}
}

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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 permute da duoc caI fIon:

void permute(int new_entry, int degree, int *permutation)
/*
pre: permutation chua 1 hoan vj voI cac phan fu fu 1 don new_entry - 1.
post: MoI hoan vj cua degree phan fu duoc fao non fu hoan vj da co va so duoc xu Iy frong ham
process_permutation.
uses: ham permute mof cach do quy, ham process_permutation.
*/
{
int current = 0;


do {
permutation[new_entry] = permutation[current];
permutation[current] = new_entry;
HInh 1?.2 Cau fruc du IIou chua hoan vj
(entry)
(next)
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 399
if (new_entry == degree)
process_permutation(permutation);
else
permute(new_entry + 1, degree, permutation);
permutation[current] = permutation[new_entry];
current = permutation[current];
} while (current != 0);
}

Chuong frnh chnh fhuc hIon cac khaI bao va khoI fao:

main()
/*
pre: NguoI su dung nhap vao degree Ia so phan fu can hoan vj.
post: MoI hoan vj cua degree phan fu duoc In ra.
*/
{
int degree;
int permutation[max_degree + 1];

cout << "Number of elements to permute? ";
cin >> degree;

if (degree < 1 || degree > max_degree)
cout << "Number must be between 1 and " << max_degree << endl;
else {
permutation[0] = 0;
permute(1, degree, permutation);
}
}

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:

void process_permutation(int *permutation)
/*
pre: permutation frong cau fruc IIon kof boI cac chI so.
post: permutation duoc In ra.
*/
{
int current = 0;
while (permutation[current] != 0) {
cout << permutation[current] << " ";
current = permutation[current];
}
cout << endl;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 17 ng dung sinh cac hoan v
Giao trnh Cau truc d lieu va Giai thuat 400

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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_Life 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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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

#include "utility.h"
#include "life.h"

int main() // Chuong frnh Game_Of_Life.
/*
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 Life voI cac phuong fhuc initialize(), print(), update().
Cac ham phu fro instructions(), user_says_yes().
*/

{
Life configuration;
instructions();
configuration.initialize();
configuration.print();
cout << "Continue viewing new generations? " << endl;
while (user_says_yes()) {
configuration.update();
configuration.print();
cout << "Continue viewing new generations? " << endl;
}
}

VoI chuong frnh Life 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 Life.

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Life 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 public, Iop Life can fhom mof ham phu fro
neighbor_count do fnh cac o song ko can cua mof o cho fruoc.

const int maxrow = 20, maxcol = 60; // Kch fhuoc do fhu chuong frnh
class Life {
public:
void initialize();
void print();
void update();
private:
int grid[maxrow + 2][maxcol + 2];// u fru fhom 4 bIon nhu hnh vo duoI day
int neighbor_count(int row, int col);
};

uoI day Ia ham neighbor_count duoc goI boI phuong fhuc update.

int Life::neighbor_count(int row, int col)
/*
pre: oI fuong Life 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 row, col.
*/
{
int i, j;
int count = 0;


HInh 18.4 IuoI cac o cua Life co du fru bon bIon
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 405
for (i = row - 1; i <= row + 1; i++) // Quof faf ca 9 o, ko ca faI (row, col)
for (j = col - 1; j <= col + 1; j++)
count += grid[i][j]; // Nou o |I,j) song fh co frj 1 va duoc cong vao count
count -= grid[row][col]; // Tru dI ban fhan o dang duoc xof
return count;
}

Trong phuong fhuc update duoI day chung fa can mof mang fam new_grid
do Iuu frang fhaI moI vua fnh duoc.

void Life::update()
/*
pre: oI fuong Life dang chua mof frang fhaI hIon faI.
post: oI fuong Life chua frang fhaI moI.
*/
{
int row, col;
int new_grid[maxrow + 2][maxcol + 2];

for (row = 1; row <= maxrow; row++)
for (col = 1; col <= maxcol; col++)
switch (neighbor_count(row, col)) {
case 2:
new_grid[row][col] = grid[row][col]; // gIu nguyon fnh frang cu
break;

case 3:
new_grid[row][col] = 1; // o so song
break;
default:
new_grid[row][col] = 0; // o so chof
}

for (row = 1; row <= maxrow; row++)
for (col = 1; col <= maxcol; col++)
grid[row][col] = new_grid[row][col];
}

Phuong fhuc initialize nhan fhong fIn fu nguoI su dung vo cac o song o
frang fhaI ban dau.

void Life::initialize()
/*
post: oI fuong Life dang chua frang fhaI ban dau ma nguoI su dung mong muon.
*/
{
int row, col;

for (row = 0; row <= maxrow+1; row++)
for (col = 0; col <= maxcol+1; col++)
grid[row][col] = 0;
cout << "List the coordinates for living cells." << endl;
cout << "Terminate the list with the special pair -1 -1" << endl;
cin >> row >> col;

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 406
while (row != -1 || col != -1) {
if (row >= 1 && row <= maxrow)
if (col >= 1 && col <= maxcol)
grid[row][col] = 1;
else
cout << "Column " << col << " is out of range." << endl;
else
cout << "Row " << row << " is out of range." << endl;
cin >> row >> col;
}
}


void Life::print()
/*
pre: oI fuong Life dang chua mof frang fhaI.
post: Cac o song duoc In cho nguoI su dung xom.
*/

{
int row, col;
cout << "\nThe current Life configuration is:" <<endl;
for (row = 1; row <= maxrow; row++) {
for (col = 1; col <= maxcol; col++)
if (grid[row][col] == 1) cout << '*';
else 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.

void instructions()
/*
post: In huong dan su dung chuong frnh Game_Of_Life.
*/

{
cout << "Welcome to Conway's game of Life." << endl;
cout << "This game uses a grid of size "
<< maxrow << " by " << maxcol << " in which" << endl;
cout << "each cell can either be occupied by an organism or not." << endl;
cout << "The occupied cells change from generation to generation" << endl;
cout << "according to the number of neighboring cells which are alive."
<< endl;
}

bool user_says_yes()
{
int c;
bool initial_response = true;
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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.
if (initial_response)
cout << " (y,n)? " << flush;

else
cout << "Respond with either y or n: " << flush;

do { // o qua cac khoang frang.
c = cin.get();
} while (c == '\n' || c ==' ' || c == '\t');
initial_response = false;
} while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
return (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_Life 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
Life Ia khong co gIoI han. Chung fa co fho khaI bao Iop Life chua mof mang
fhaf Ion nhu sau:

class Life {
public:
// Cac phuong fhuc.
private:
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 Life 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Life. Cac doI fuong duoc Iuu frong danh sach va bang bam
cua cau hnh Life 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.

struct Cell {
Cell() { row = col = 0; } // Cac constructor
Cell(int x, int y) { row = x; col = y; }
int row, col;
}

KhI cau hnh Life 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 List ma moI
phan fu chua con fro don mof o |hnh 18.5). MoI phan fu cua List gom haI con
fro: mof chI don mof o dang song va mof chI don phan fu ko frong List.

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 row 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 row 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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:

class Hash_table {
public:
Error_code insert(Cell *new_entry);
bool retrieve(int row, int col) const;
private:
List<Cell *> table[hash_size]; // 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 row 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_table can co nhung phuong fhuc constructor va
destructor cua no. Chang han, destructor cua Hash_table can goI destructor cua
List cho fung phan fu cua mang table.


HInh 18.5 anh sach IIon kof gIan fIop.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Life. 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 Life can
co constructor va destructor do djnh vj cung nhu gIaI phong cac vung nho cap
phaf dong cho cac cau fruc nay.

class Life {
public:
Life();
void initialize();
void print();
void update();
~Life();

private:
List<Cell *> *living;
Hash_table *is_living;
bool retrieve(int row, int col) const;
Error_code insert(int row, int col);
int neighbor_count(int row, int 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 Life 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 Life 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
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Life 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).

void Life::update()
/*
post: oI fuong Life chua cau hnh o frang fhaI ko.
uses: Iop Hash_table va Iop Life va cac ham phu fro.
*/
{
Life new_configuration;
Cell *old_cell;




HInh 18.6 Cau hnh IIfo voI cac o chof vIon chung quanh.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 412
for (int i = 0; i < living->size(); i++) {
living->retrieve(i, old_cell); // Iay mof o dang song.
for (int row_add = -1; row_add < 2; row_add ++)
for (int col_add = -1; col_add < 2; col_add++) {
int new_row = old_cell->row + row_add,
new_col = old_cell->col + col_add;

// new_row, new_col Ia foa do cua o dang xof hoac o ko can cua no.
if (!new_configuration.retrieve(new_row, new_col))
switch (neighbor_count(new_row, new_col)) {
case 3: // So o song ko can Ia 3 fh o dang xof fro fhanh song.
new_configuration.insert(new_row, new_col);
break;

case 2: // So o song ko can Ia 2 fh o dang xof gIu nguyon frang fhaI.
if (retrieve(new_row, new_col))
new_configuration.insert(new_row, new_col);
break;

default: // O so chof.
break;
}
}
}
// Trao du IIou frong configuration voI du IIou frong new_configuration.
new_configuration so duoc don dop boI destructor cua no.
List<Cell *> *temp_list = living;
living = new_configuration.living;
new_configuration.living = temp_list;
Hash_table *temp_hash = is_living;
is_living = new_configuration.is_living;
new_configuration.is_living = temp_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 row, col cua no. Nguoc IaI nou muon bIou dIon dung vj fr row,
col fron IuoI, chung fa nhan fhay rang chung fa khong fho hIon fhj nhIou hon Ia
mof mau nho cua mof cau hnh Life 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 Life.

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.

void Life::print()
/*
post: In mof frang fhaI cua doI fuong Life.
uses: Life::retrieve.
*/
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 413
{
int row, col;
cout << endl << "The current Life configuration is:" << endl;

for (row = 0; row < 20; row++) {
for (col = 0; col < 80; col++)
if (retrieve(row, col)) cout << '*';
else 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.

ErrorCode Life::insert(int row, int col)
/*
pre: O co foa do (row,col) khong fhuoc vo doI fuong Life (o dang chof)
post: O co foa do (row,col) duoc bo sung vao doI fuong Life (o fro non song). Nou vIoc
fhom vao List hoac Hash_table khong fhanh cong fh IoI so duoc fra vo.
uses: Cac Iop List, Hash_table, va cau fruc Cell.
*/
{
Error_code outcome;
Cell *new_cell = new Cell(row, col);

int index = living->size();
outcome = living->insert(index, new_cell);
if (outcome == success)
outcome = is_living->insert(new_cell);
if (outcome != success)
cout << " Warning: new Cell insertion failed" << endl;
return outcome;
}

Constructor vu destructor cho cuc do tuong Life

Chung fa can cung cap constructor va destructor cho Iop Life 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.

Life::Life()
/*
post: Cac fhuoc fnh fhanh phan cua doI fuong Life duoc cap phaf dong va duoc khoI fao.
uses: Cac Iop Hash_table, List.
*/
{
living = new List<Cell *>;
is_living = new Hash_table;
}
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
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 Life. 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.


Life::~Life()
/*
post: Cac fhuoc fnh cap phaf dong cua doI fuong Life va cac doI fuong do chung fham chIou
duoc gIaI phong.
uses: Cac Iop Hash_table, List.
*/
{
Cell *old_cell;
for (int i = 0; i < living->size(); i++) {
living->retrieve(i, old_cell);
delete old_cell;
}
delete is_living; // CoI destructor cua Hash_table.
delete living; // CoI destructor cua List.
}

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 |row 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 + maxrow*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 maxrow bang mof so fhch hop, chang han nhu mof so nguyon fo, do vIoc
phan phoI duoc raI dou va gIam su dung do.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 415

const int factor = 101;

int hash(int row, int col)
/*
post: Tra vo gIa frj ham bam fu 0 don hash_size - 1 fuong ung voI foa do (row, col).
*/
{
int value;
value = row + factor * col;
value %= hash_size;
if (value < 0) return value + hash_size;
else return value;
}

Cuc chuong trInh con khuc

Cac phuong fhuc con IaI cua Life nhu initialize, retrieve, va
neighbor_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.
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Chng 18 ng dung danh sach lien ket va bang bam
Giao trnh Cau truc d lieu va Giai thuat 416

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

i
MC LC

Phan 1 PHAN MO OA
Chng 1 GO THK
1.1. Vo phuong phap phan fch fhIo f ko huong doI fuong...............................1
1.2. CIoI fhIo u mon ho c Ca u fru c du IIou |CTI) va gIaI fhuaf .....................1
1.3. Ca ch fIop ca n frong qua frnh fm hIou ca c Iop CTI ............................4
1.3.1. Cac buoc frong qua frnh pha n fch fhIof ko huo ng doI fuong.........4
1.3.2. Qua frnh xa y du ng ca c Iop CTI......................................................5
1.4. Mof so djnh nghIa co ban ...........................................................................6
1.4.1. jnh nghIa kIo u du IIou .......................................................................6
1.4.2. KIou nguyon fo va ca c kIou co cau fru c...............................................6
1.4.3. ChuoI noI fIop va danh sa ch................................................................6
1.4.4. Ca c kIo u du IIou fru u fuong..................................................................7
1.5. Mof so nguyon fa c va phuong phap do hoc fof mon CTI va gIaI
fhuaf..............................................................................................................8
1.5.1. Ca ch fIop ca n va phuong huong suy nghI fch cu c ............................8
1.5.2. Ca c nguyon fa c......................................................................................9
1.5.3. Phong cach Iap frnh |style of programming) va cac ky na ng:.......10
1.6. CIoI fhIo u vo ngo n ngu gIa: ......................................................................14

Phan 2 CAC CA TRC O LK
Chng 2 NGAN XKP
2.1. jnh nghIa ngan xop.................................................................................17
2.2. ac fa ngan xop.........................................................................................18
2.3. Ca c phuong a n hIo n fhu c nga n xop..........................................................22
2.4. HIon fhuc nga n xop ...................................................................................22
2.4.1. HIon fhuc nga n xop IIon fu c ..............................................................22
2.4.2. HIon fhuc nga n xop IIon kof..............................................................25
2.4.3. Nga n xop IIon kof vo I su an foa n......................................................29
2.4.4. ac fa nga n xop IIo n kof da hIou chInh...........................................34

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

ii
Chng 3 HANG OO
3.1. jnh nghIa ha ng ....................................................................................... 37
3.2. ac fa ha ng ............................................................................................... 38
3.3. Ca c phuong a n hIo n fhu c hang ................................................................ 41
3.3.1. Ca c phuong a n hIo n fhu c hang IIon fuc ........................................... 41
3.3.2. Phuong a n hIon fhuc ha ng IIo n kof.................................................. 45
3.4. HIon fhuc ha ng.......................................................................................... 46
3.4.1. HIon fhuc hang IIo n fuc..................................................................... 46
3.4.2. HIon fhuc hang IIo n kof .................................................................... 48
3.4.3. Ha ng IIon kof mo rong ...................................................................... 50

Chng 4 OANH SACH
4.1. jnh nghIa danh sa ch .............................................................................. 51
4.2. ac fa ca c phuong fhuc cho danh sa ch ................................................... 51
4.3. HIon fhuc danh sa ch................................................................................. 54
4.3.1. HIon fhuc danh sa ch IIon fu c............................................................ 54
4.3.2. HIon fhuc danh sa ch IIon kof don gIa n ........................................... 56
4.3.3. Iuu IaI vj fr hIo n fa I......................................................................... 61
4.3.4. anh sa ch IIon kof kop ..................................................................... 63
4.4. So sa nh ca c cach hIo n fhuc cu a danh sach............................................. 66
4.5. anh sa ch IIon kof frong mang IIon fu c ................................................. 67
4.5.1. Phuong phap....................................................................................... 67
4.5.2. Ca c fa c vu qua n Iy vu ng nho ............................................................. 70
4.5.3. Ca c fa c vu kha c .................................................................................. 73
4.5.4. Ca c bIon fho cu a danh sa ch IIon kof frong ma ng IIo n fu c ............. 74

Chng 5 CHO KY T
5.1. ChuoI ky fu frong C va frong C++........................................................... 75
5.2. ac fa cu a Iop SfrIng................................................................................ 77
5.2.1. Ca c phop so sanh............................................................................... 77
5.2.2. Mof so constructor fIon dung ............................................................ 77
5.3. HIon fhuc Iop SfrIng................................................................................. 79
5.4. Ca c fa c vu fron SfrIng .............................................................................. 81
5.5. Ca c gIaI fhuaf fm mof chuoI con frong mof chuoI................................. 83
5.5.1. CIaI fhuaf rufo-Iorco ...................................................................... 83
5.5.2. CIaI fhuaf Knufh-MorrIs-Praff ......................................................... 85
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

iii

Chng 6 OK QY
6.1. CIoI fhIo u vo do quy ..................................................................................91
6.1.1. Co cau nga n xop cho ca c Ia n go I ham...............................................91
6.1.2. Ca y bIou dIon ca c Ia n goI ham..........................................................92
6.1.3. CIaI fhu a: Mof djnh nghIa do quy.....................................................93
6.1.4. ChIa do frj: aI foa n Thap Ha NoI ...................................................95
6.2. Ca c nguyo n fac cua do quy......................................................................100
6.2.1. ThIof ko gIaI fhuaf do quy ...............................................................100
6.2.2. Ca ch fhu c hIon cua do quy...............................................................102
6.2.3. o quy duoI .......................................................................................104
6.2.4. Pha n fch mof so fruong hop non va kho ng no n du ng do quy .....106
6.2.5. Ca c nhan xof.....................................................................................110
6.3. Phuong phap quay IuI |backtracking).....................................................112
6.3.1. IoI gIaI cho baI foa n fam con ha u ..................................................112
6.3.2. V du voI bon con Ha u......................................................................114
6.3.3. Phuong phap quay IuI |Backtracking) .............................................115
6.3.4. Pha c fhao chung cho chuong frnh daf cac con hau Ion ban co ...115
6.3.5. TInh cho: Cau fru c du IIo u da u fIon va ca c phuong fhuc...............118
6.3.6. Xom xof IaI va fInh cho ...................................................................120
6.3.7. Pha n fch vo phuong phap quay IuI ................................................124
6.4. Ca c chuong frnh co cau fru c ca y: du doan fruoc frong cac fro choI ...127
6.4.1. Ca c ca y fro choI ................................................................................127
6.4.2. Phuong phap MInImax.....................................................................128
6.4.3. Phaf frIon gIaI fhuaf ........................................................................130
6.4.4. TInh cho ............................................................................................131
6.4.5. TIc-Tac-Too........................................................................................132

Chng 7 TM KK M
7.1. CIoI fhIo u..................................................................................................137
7.1.1. Khoa...................................................................................................137
7.1.2. Pha n fch...........................................................................................137
7.1.3. Tm kIom noI va fm kIom ngoaI ....................................................137
7.1.4. Iop Rocord va Iop Koy.....................................................................138
7.1.5. Tho ng so ............................................................................................139
7.2. Tm kIom fuan fu .....................................................................................139
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

iv
7.2.1. CIaI fhuaf va ham............................................................................ 139
7.2.2. Pha n fch .......................................................................................... 140
7.3. Tm kIom nhj pha n................................................................................. 141
7.3.1. anh sa ch co fhu fu ......................................................................... 142
7.3.2. Xa y du ng gIaI fhuaf ......................................................................... 143
7.3.3. PhIo n ba n fhu nhaf.......................................................................... 143
7.3.4. Nha n bIof som pha n fu co chua kho a dch.................................... 145
7.4. Ca y so sanh ............................................................................................. 147

Chng 8 SAP XKP
8.1. CIoI fhIo u................................................................................................. 149
8.2. Sap xop kIou chon |Insertion Sort)........................................................ 150
8.2.1. Cho n phan fu vao danh sa ch da co fhu fu ..................................... 150
8.2.2. Sap xop kIou cho n cho danh sach IIo n fu c..................................... 151
8.2.3. Sap xop kIou cho n cho danh sach IIo n kof .................................... 153
8.3. Sap xop kIou chon |Selection Sort) ........................................................ 155
8.3.1. CIaI fhuaf.......................................................................................... 155
8.3.2. Sap xop chon fro n danh sa ch IIon fu c............................................ 156
8.4. ShoII_sorf................................................................................................. 158
8.5. Ca c phuong phap sap xop fhoo kIou chIa do frj ................................... 160
8.5.1. Y fuo ng co ban ................................................................................. 160
8.5.2. V du .................................................................................................. 161
8.6. Morgo_sorf cho danh sach IIo n kof ....................................................... 164
8.7. QuIck_sorf cho danh sach IIo n fu c......................................................... 167
8.7.1. Ca c ham............................................................................................ 167
8.7.2. Pha n hoa ch danh sa ch .................................................................... 168
8.8. Hoap va Hoap_sorf.................................................................................. 170
8.8.1. jnh nghIa hoap nhj phan.............................................................. 171
8.8.2. Phaf frIon gIaI fhuaf Hoap_sorf ..................................................... 172
8.9. RadIx Sorf................................................................................................ 176
8.9.1. Y fuo ng.............................................................................................. 177
8.9.2. HIon fhuc .......................................................................................... 177
8.9.3. Pha n fch phuong phap radIx_sorf................................................. 181

Chng 9 CAY NH| PHAN
9.1. Ca c khaI nIom co ba n vo ca y ................................................................. 183
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

v
9.2. Ca y nhj pha n ...........................................................................................185
9.2.1. Ca c djnh nghIa..................................................................................185
9.2.2. uyof ca y nhj pha n..........................................................................187
9.2.3. HIon fhuc IIon kof cu a ca y nhj phan ..............................................193
9.3. Ca y nhj pha n fm kIom...........................................................................197
9.3.1. Ca c danh sach co fhu fu va ca c cach hIo n fhu c .............................198
9.3.2. Tm kIom fron ca y............................................................................199
9.3.3. Thom pha n fu vao ca y nhj pha n fm kIom ....................................203
9.3.4. Sap fhu fu fhoo ca y ..........................................................................206
9.3.5. IoaI pha n fu frong ca y nhj pha n fm kIom ...................................207
9.4. Xa y du ng mof cay nhj phan fm kIom...................................................210
9.4.1. ThIof ko gIaI fhuaf ...........................................................................212
9.4.2. Ca c khaI bao va ham maIn..............................................................213
9.4.3. Thom mof nuf ...................................................................................214
9.4.4. Hoa n faf cong vIo c............................................................................215
9.4.5. anh gIa ............................................................................................217
9.5. Ca n ba ng chIou cao: Ca y AVI................................................................218
9.5.1. jnh nghIa ........................................................................................218
9.5.2. Thom mof nuf ...................................................................................222
9.5.3. IoaI mof nuf .....................................................................................230
9.5.4. ChIou cao cua ca y AVI.....................................................................234

Chng 10 CAY NHK NHANH
10.1. Vuon ca y, ca y, va ca y nhj pha n..............................................................237
10.1.1. Ca c fon go I cho cay...........................................................................237
10.1.2. Ca y co fhu fu .....................................................................................239
10.1.3. Rung va vuo n ....................................................................................241
10.1.4. Su fuong u ng hnh fhu c....................................................................243
10.1.5. Phop quay..........................................................................................244
10.1.6. Tong kof ............................................................................................244
10.2. Ca y fu dIo n fm kIom: TrIo.....................................................................245
10.2.1. TrIos...................................................................................................245
10.2.2. Tm kIom mof khoa..........................................................................245
10.2.3. CIaI fhuaf C++..................................................................................246
10.2.4. Tm kIom frong cay TrIo..................................................................247
10.2.5. Thom pha n fu vao TrIo ....................................................................247
10.2.6. IoaI pha n fu frong TrIo ...................................................................248
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

vi
10.2.7. Truy xuaf TrIo .................................................................................. 248
10.3. Tm kIom ngoaI: -froo .......................................................................... 249
10.3.1. ThoI gIan fruy xuaf .......................................................................... 249
10.3.2. Ca y fm kIom nhIo u nha nh............................................................. 250
10.3.3. Ca y nhIou nha nh ca n ba ng ............................................................. 250
10.3.4. Thom pha n fu vao -froo ................................................................ 251
10.3.5. CIaI fhuaf C++: fm kIom va fhom vao.......................................... 253
10.3.6. IoaI pha n fu frong -froo ............................................................... 263
10.4. Ca y do-don............................................................................................... 271
10.4.1. an nhap.......................................................................................... 271
10.4.2. jnh nghIa va phan fch................................................................. 272
10.4.3. ac fa ca y do don............................................................................. 274
10.4.4. Thom pha n fu ................................................................................... 276
10.4.5. Phuong fhuc fhom vao. HIo n fhuc.................................................. 279
10.4.6. IoaI mof nuf..................................................................................... 282

Chng 11 HANG TK N
11.1. jnh nghIa ha ng uu fIon ........................................................................ 283
11.2. Ca c phuong a n hIo n fhu c hang uu fIon ................................................. 283
11.3. HIon fhuc ca c fac vu co ba n fro n hoap nhj phan................................. 284
11.3.1. Ta c vu fho m pha n fu ....................................................................... 284
11.3.2. Ta c vu Ioa I phan fu .......................................................................... 286
11.4. Ca c fa c vu kha c fro n hoap nhj phan..................................................... 287
11.4.1. Ta c vu fm phan fu Ion nha f........................................................... 287
11.4.2. Ta c vu fa ng gIam do uu fIon ........................................................... 287
11.4.3. Ta c vu Ioa I mof pha n fu kho ng o dau ha ng................................... 288
11.5. Mof so phuong a n kha c cua hoap .......................................................... 288
11.5.1. d-hoaps.............................................................................................. 288
11.5.2. Hoap Ioch fraI |Leftist heap) ........................................................... 289
11.5.3. Skov hoap ........................................................................................ 295
11.5.4. Ha ng nhj fhu c |Binomial Queue).................................................... 295

Chng 12 BANG VA TRUY XUAT THONG TIN
12.1. an nhap: pha vo ra o ca n Ign ............................................................... 305
12.2. Ca c ba ng chu nhaf .................................................................................. 306
12.2.1. Thu fu uu fIon ha ng va fhu fu uu fIon cof...................................... 306
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

vii
12.2.2. anh chI so cho bang chu nhaf.......................................................307
12.2.3. Ion fho: ma ng fruy xuaf.................................................................308
12.3. Ca c ba ng voI nhIo u hnh da ng kha c nhau.............................................308
12.3.1. Ca c ba ng fam gIac ............................................................................309
12.3.2. Ca c ba ng IoI Iom...............................................................................310
12.3.3. Ca c ba ng chuyon doI ........................................................................311
12.4. a ng: Mof kIou du IIou fruu fuong moI..................................................313
12.4.1. Ca c ham.............................................................................................313
12.4.2. Mof kIou du IIo u fru u fuong.............................................................314
12.4.3. HIon fhuc...........................................................................................315
12.4.4. So sa nh gIua danh sa ch va ba ng.....................................................315
12.5. a ng bam.................................................................................................317
12.5.1. Ca c ba ng fhua...................................................................................317
12.5.2. Iu a chon ham bam...........................................................................318
12.5.3. Pha c fhao gIaI fhuaf cho cac fhao fa c du IIou frong bang bam....321
12.5.4. V du frong C++................................................................................322
12.5.5. CIaI quyof dung do ba ng phuong phap dja chI mo ........................323
12.5.6. CIaI quyof dung do ba ng phuong phap noI kof..............................323
12.6. Phan fch bang bam................................................................................331
12.6.1. Iou nga c nhIon vo nga y sInh.........................................................331
12.6.2. om so Ian fhu .................................................................................332
12.6.3. Pha n fch phuong phap noI kof.......................................................332
12.6.4. Pha n fch phuong phap dja chI mo .................................................333
12.6.5. Ca c so sanh Iy fhuyo f.......................................................................334
12.6.6. Ca c so sanh fhuc nghIom.................................................................335
12.7. Kof Iuan: so sanh ca c phuong phap .......................................................336

Chng 13 OO TH|
13.1. Non fa ng foan ho c ...................................................................................339
13.1.1. Ca c djnh nghIa va v du ...................................................................339
13.1.2. o fhj vo huong ................................................................................340
13.1.3. o fhj co huong.................................................................................341
13.2. Iou dIon bang ma y fnh ........................................................................341
13.2.1. Iou dIon cua fap ho p ......................................................................342
13.2.2. anh sa ch ko ....................................................................................344
13.2.3. Ca c fho ng fIn kha c frong do fhj......................................................346
13.3. uyof do fhj .............................................................................................346
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

viii
13.3.1. Ca c phuong phap.............................................................................. 346
13.3.2. CIaI fhuaf duyof fhoo chIou sau...................................................... 347
13.3.3. CIaI fhuaf duyof fhoo chIou ro ng.................................................... 348
13.4. Sap fhu fu fopo........................................................................................ 349
13.4.1. af va n do ........................................................................................ 349
13.4.2. CIaI fhuaf duyof fhoo chIou sau...................................................... 350
13.4.3. CIaI fhuaf duyof fhoo chIou ro ng.................................................... 352
13.5. CIaI fhuaf Croody: Tm duong dI nga n nhaf ........................................ 353
13.5.1. af va n do ........................................................................................ 353
13.5.2. Phuong phap..................................................................................... 354
13.5.3. V du .................................................................................................. 356
13.5.4. HIon fhuc .......................................................................................... 356
13.6. Ca y phu foI fIou....................................................................................... 357
13.6.1. af va n do ........................................................................................ 357
13.6.2. Phuong phap..................................................................................... 359
13.6.3. HIon fhuc .......................................................................................... 361
13.6.4. KIom fra gIaI fhuaf PrIm................................................................ 362
13.7. Su du ng do fhj nhu Ia ca u fru c du IIou .................................................. 364


Phan 3 CAC NG ONG CA CAC LOP CTOL
Chng 14 NG ONG CA NGAN XKP
14.1. ao nguo c du IIou.................................................................................... 365
14.2. Phan fch bIon djch |parsIng) du IIou.................................................... 366
14.3. Tr hoa n cong vIo c................................................................................... 368
14.3.1. ! ng du ng fnh frj cu a bIou fhu c postfix......................................... 368
14.3.2. ! ng du ng chuyon doI bIou fhuc da ng infix fha nh dang postfix ... 371
14.4. CIaI fhuaf quay IuI |backtracking) ......................................................... 372
14.4.1. ! ng du ng frong baI foa n fm dch |goal seeking). ........................ 372
14.4.2. aI foan ma dI fuan va baI foa n fam con hau............................... 375

Chng 15 NG ONG CA HANG OO
15.1. Ca c djch vu .............................................................................................. 377
15.2. Phan IoaI.................................................................................................. 377
15.3. Phuong phap sap fhu fu RadIx Sorf ...................................................... 377
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

ix
15.4. Tnh frj cho bIou fhu c prefix...................................................................378
15.5. ! ng du ng phop fnh fron da fhu c ..........................................................378
15.5.1. Mu c dch cu a ung du ng.....................................................................378
15.5.2. Chuong frnh.....................................................................................378
15.5.3. Cau fru c du IIo u cu a da fhuc ............................................................381
15.5.4. o c va ghI ca c da fhu c .....................................................................384
15.5.5. Phop co ng da fhu c ............................................................................385
15.5.6. Hoa n faf chuong frnh .....................................................................386

Chng 16 NG ONG X LY VAN BAN
16.1. Ca c dac fa .................................................................................................387
16.2. HIon fhuc..................................................................................................388
16.2.1. Chuong frnh chnh..........................................................................388
16.2.2. ac fa Iop dIfor ..............................................................................389
16.2.3. Nha n Io nh fu nguoI su du ng............................................................390
16.2.4. Thuc hIon Ionh..................................................................................390
16.2.5. o c va ghI fap fIn.............................................................................392
16.2.6. Cho n mof ha ng .................................................................................393
16.2.7. Tm mof chuoI ky fu .........................................................................393
16.2.8. Ion doI chuoI ky fu .........................................................................394

Chng 17 NG ONG SNH CAC HOAN V|
17.1. Y fuong .....................................................................................................395
17.2. TInh cho ....................................................................................................396
17.3. Thu fuc chung...........................................................................................396
17.4. ToI uu hoa cau fruc du IIou do fang foc do cho chuong frnh sInh cac
hoan vj ......................................................................................................397
17.5. Chuong frnh............................................................................................398

Chng 18 NG ONG OANH SACH LKN KKT VA
BANG BAM
18.1. CIoI fhIo u vo chuong frnh Camo_Of_IIfo ............................................401
18.2. Ca c v du ...................................................................................................401
18.3. CIaI fhuaf .................................................................................................402
18.4. Chuong frnh chnh cho Camo_Of_IIfo .................................................403
Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Muc Iuc
Giao trnh Cau truc d lieu va Giai thuat

x
18.4.1. PhIo n ba n fhu nhaf cho Iop IIfo .................................................... 404
18.4.2. PhIo n ba n fhu haI voI CTI moI cho IIfo .................................... 407

Su tm bi: www.daihoc.com.vn

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns

You might also like