Professional Documents
Culture Documents
Cau Truc Du Lieu Va Giai Thuat1
Cau Truc Du Lieu Va Giai Thuat1
Ch¬ng 1.......................................................................1
Ch¬ng 2.....................................................................15
Danh s¸ch...................................................................15
2.1. Danh s¸ch tæng qu¸t.................................................................15
2.1.1. §Þnh nghÜa..........................................................................15
2.1.2. C¸c phÐp to¸n c¬ b¶n..........................................................16
2.1.3. C¸c ph¬ng ph¸p cµi ®Æt danh s¸ch....................................16
2.2. Ng¨n xÕp (stack)........................................................................22
2.2.1. Giíi thiÖu stack.....................................................................22
2.2.2. øng dông cña stack..............................................................23
2.2.3. Cµi ®Æt stack......................................................................25
2.3. Hµng ®îi (queue).......................................................................27
2.3.1. Giíi thiÖu..............................................................................27
2.3.2. øng dông hµng ®îi...............................................................28
2.3.3. Cµi ®Æt hµng ®îi................................................................28
Ch¬ng 3.....................................................................32
Ch¬ng 4.....................................................................56
C©u hái lý thuyÕt vµ thùc hµnh dµnh cho thi hÕt m«n..81
Lêi nãi ®Çu
Chóng t«i biªn so¹n tµi liÖu nµy nh»m hç trî c¸c b¹n trong qu¸ tr×nh «n
tËp m«n häc "CÊu tróc d÷ liÖu vµ gi¶i thuËt".
Cã thÓ nãi r»ng "cÊu tróc d÷ liÖu" lµ chuyªn ngµnh cña c«ng nghÖ
th«ng tin nghiªn cøu c¸ch tæ chøc d÷ liÖu (trong bé nhí trong hoÆc
trªn bé nhí ngoµi) mét c¸ch hîp lý trong viÖc thùc hiÖn c¸c bµi to¸n trªn
m¸y tÝnh. Tríc ®©y ngêi ta vÉn nghÜ r»ng viÕt ch¬ng tr×nh thùc chÊt lµ
cµi ®Æt c¸c thuËt to¸n trªn m¸y tÝnh, vµ ch¬ng tr×nh chÝnh lµ c¸c m·
lÖnh thÓ hiÖn thuËt to¸n. Víi mét sè bµi to¸n khoa häc kü thuËt, khi mµ
viÖc tæ chøc d÷ liÖu ®¬n gi¶n h¬n nhiÒu so víi thuËt to¸n th× quan
niÖm nµy tá ra hîp lý. Tuy nhiªn cµng ngµy ngêi ta cµng gÆp nhiÒu vÊn
®Ò mµ c¸ch tæ chøc d÷ liÖu ¶nh hëng rÊt ®¸ng kÓ ®Õn hiÖu qu¶ cña
øng dông. Trong nhiÒu dù ¸n tin häc, vÊn ®Ò khã cÇn gi¶i quyÕt kh«ng
chØ lµ thuËt to¸n, mµ cßn lµ c¸ch tæ chøc d÷ liÖu. Còng v× thÕ mµ ngµy
nay kh¸i niÖm ch¬ng tr×nh, nh nhµ to¸n häc vµ tin häc næi tiÕng thÕ giíi
ngêi Thôy sÜ Niklaus Wirth ®· ph¸t biÓu, ®îc coi lµ bao gåm cÊu tróc d÷
liÖu vµ thuËt to¸n (Data structures + Algorithms = Programme). C¸ch tæ
chøc d÷ liÖu ë ®©y ®îc hiÓu lµ c¸ch tæ chøc logic, v× vËy c¸c cÊu tróc
d÷ liÖu thêng ®îc g¾n víi c¸c thuËt to¸n cô thÓ t¹o ra vµ thao t¸c trªn
chóng. Còng dÔ hiÓu v× sao c¸c cÊu tróc d÷ liÖu quan träng l¹i ®îc tr×nh
bµy trong c¸c tµi liÖu nh "CÈm nang thuËt to¸n", "NghÖ thuËt lËp
tr×nh",...
Mét trong nh÷ng bµi to¸n quan träng cña "cÊu tróc d÷ liÖu" lµ cµi ®Æt
vµ thùc hiÖn c¸c thao t¸c víi c¸c môc d÷ liÖu. C¸c môc d÷ liÖu nµy cã thÓ
lµ th«ng tin vÒ nh©n sù cña mét c¬ quan, th«ng tin vÒ c¸c chuyÕn bay
cña mét h·ng hµng kh«ng, vÒ qu¶n lý kho, vÒ qu¶n trÞ m¹ng... Trong tin
häc ngêi ta thêng gäi c¸c môc d÷ liÖu lµ c¸c nót (node). C¸c thao t¸c cÇn
thùc hiÖn thêng lµ: thªm hoÆc xãa mét nót, t×m kiÕm hay s¾p xÕp theo
mét trêng nµo ®ã vÝ dô ngµy sinh, hä tªn, gi¸ c¶... Môc ®Ých cña "cÊu
tróc d÷ liÖu" lµ tæ chøc c¸c nót th«ng tin sao cho c¸c thao t¸c cËp nhËt,
s¾p xÕp vµ t×m kiÕm ®îc thùc hiÖn nhanh nhÊt.
MÆc dï nót th«ng tin cã thÓ chøa nhiÒu lo¹i d÷ liÖu kh¸c nhau, nhng
®Ó ®¬n gi¶n trong viÖc m« t¶ c¸c thuËt to¸n, thêng chóng ta chØ gi¶
thiÕt lµ c¸c nót chØ chøa mét trêng th«ng tin duy nhÊt vµ trêng nµy ®îc
sö dông ®Ó s¾p xÕp vµ t×m kiÕm. Ta sÏ gäi trêng nµy lµ khãa (key).
C¸ch gäi nµy cã kh¸c chót Ýt víi khãa trong c¬ së d÷ liÖu: trong csdl th×
ngêi ta thêng hiÓu khãa lµ trêng cã gi¸ trÞ duy nhÊt trong tËp b¶n ghi,
nghÜa lµ kh«ng cã 2 b¶n ghi nµo cã khãa trïng nhau. Nhng trong trêng
hîp chóng ta xÐt th× ®«i khi cho phÐp ®iÒu ®ã. Khãa ë ®©y ®¬n gi¶n
®îc hiÓu lµ ®¹i lîng chóng ta ®ang quan t©m ®Ó s¾p xÕp t×m kiÕm. §ã
cã thÓ lµ ngµy sinh, lµ hä tªn, ®Þa chØ... Th«ng thêng chóng ta xÐt c¸c
khãa lµ c¸c sè thùc hoÆc sè nguyªn. Trong trêng hîp cã thÓ nhÇm lÉn víi
kiÓu chØ sè, chóng ta sÏ xÐt khãa lµ c¸c sè thùc.
Trong tµi liÖu nµy chóng t«i cã cµi ®Æt mét sè cÊu tróc d÷ liÖu vµ
thuËt to¸n b»ng ng«n ng÷ C. Tuy nhiªn v× ng«n ng÷ sö dông thùc chÊt lµ
C++ nªn chóng t«i tËn dông lu«n nh÷ng tÝnh n¨ng ®¬n gi¶n cña C++
vÝ dô nh cã thÓ cµi ®Æt struct mµ kh«ng cÇn tõ khãa typedef, cã thÓ
khai b¸o biÕn ë bÊt cø ®©u trong ch¬ng tr×nh, cã thÓ truyÒn ®èi sè cho
hµm b»ng biÕn tham chiÕu, cã thÓ ®Þnh nghÜa chång hµm (hµm trïng
tªn nhng cã c¸c ®èi sè cã kiÓu kh¸c nhau), dïng lÖnh new vµ delete thay
cho malloc vµ free...
Chóng t«i chØ xem b¶n th¶o nµy lµ mét c«ng cô hç trî thªm bªn c¹nh
gi¸o tr×nh chÝnh thøc. Chóng t«i mong nhËn ®îc nh÷ng ý kiÕn gãp ý cña
c¸c ®ång nghiÖp vµ c¸c em sinh viªn ®Ó bµi gi¶ng ®îc hiÖu qu¶ h¬n.
(M1j lµ ma trËn con cÊp n-1 nhËn ®îc sau khi xãa hµng i vµ cét j tõ ma
trËn A vµ ®îc gäi lµ minor cña phÇn tö a1j)
Cã thÓ chøng minh r»ng nÕu tÝnh ®Þnh thøc dùa vµo c«ng thøc ®Ö quy
nµy th× cÇn thùc hiÖn n! phÐp nh©n. Mét con sè khæng lå víi n kh«ng lÊy
g× lµm lín. Ngay c¶ víi tèc ®é cña m¸y tÝnh lín hiÖn ®¹i, ®Ó tÝnh ®Þnh
thøc cña ma trËn cÊp n = 25 còng cÇn hµng triÖu n¨m. Hãa ra thuËt to¸n
trªn ®©y hoµn toµn chØ cã ý nghÜa lý thuyÕt!
Mét thuËt to¸n cæ ®iÓn kh¸c lµ thuËt to¸n Gauss - Jordan tÝnh ®Þnh thøc
cÊp n trong thêi gian n3 . §Ó tÝnh ®Þnh thøc cÊp 100 b»ng thuËt to¸n nµy
trªn m¸y tÝnh lín ngêi ta cÇn ®Õn 1 gi©y.
NÕu nh trong c¸c bµi to¸n kinh tÕ x· héi hay mét sè lÜnh vùc khoa häc kü
thuËt, mét thuËt to¸n ch¹y trong mét vµi giê hay l©u h¬n cã thÓ chÊp nhËn
®îc th× trong mét sè lÜnh vùc nh ®iÒu khiÓn tù ®éng, ®«i khi thuËt to¸n
cÇn ®Õn vµi gi©y tÝnh to¸n ®· lµ qu¸ chËm. ThËt vËy, ngµy nay nhiÒu
thiÕt bÞ ho¹t ®éng theo ch¬ng tr×nh ®iÒu khiÓn thêi gian thùc, nghÜa lµ
víi mét bé d÷ liÖu vµo nµo ®ã m¸y ph¶i xö lý vµ cho kÕt qu¶ tøc kh¾c ®Ó
®iÒu khiÓn qu¸ tr×nh. V× vËy ta còng dÔ hiÓu v× sao phÐp biÕn ®æi
Fourier rêi r¹c thêng ch¹y tèn Ýt thêi gian (tuyÕn tÝnh) nhng ngêi ta vÉn ¸p
dông nh÷ng thuËt to¸n nhanh ®Ó tÝnh to¸n (vµ gäi lµ phÐp biÕn ®æi
Fourier nhanh). §ã lµ v× phÐp biÕn ®æi Fourier ®îc dïng trong rÊt nhiÒu
lÜnh vùc kü thuËt. Râ rµng viÖc t×m ra thuËt to¸n hiÖu qu¶ vµ cã thÓ thùc
thi ®îc lu«n lu«n lµ bµi to¸n cÇn quan t©m.
§Þnh nghÜa: Cho 2 hµm f vµ g lµ c¸c hµm thùc kh«ng ©m cã miÒn x¸c
®Þnh trong tËp sè tù nhiªn. Ta nãi r»ng f(n) lµ ¤ lín cña g(n) vµ viÕt:
f(n)=O(g(n)) nÕu tån t¹i h»ng sè C>0 vµ sè tù nhiªn n 0 sao cho
f(n)<Cg(n), víi mäi n>n0 .
NÕu mét thuËt to¸n cã thêi gian thùc hiÖn T(n)=O(g(n)) ta nãi r»ng thuËt
to¸n cã thêi gian thùc hiÖn cÊp cao nhÊt lµ g(n), ®«i khi ta còng nãi ®¬n
gi¶n lµ thuËt to¸n cã thêi gian thùc hiÖn cÊp g(n) hay ®é phøc t¹p tÝnh
to¸n cña thuËt to¸n lµ g(n). Ngêi ta còng thêng nãi ®Õn ®é phøc t¹p tÝnh
to¸n cña thuËt to¸n trong trêng hîp xÊu nhÊt, trêng hîp tèt nhÊt, ®é phøc
t¹p trung b×nh.
b. C¸c quy t¾c ®Ó ®¸nh gi¸ thêi gian thùc hiÖn thuËt to¸n
NÕu T1(n) = O(f(n)), T2(n) = O(g(n)), khi ®ã
- Qui t¾c tæng: T1(n)+ T2(n) = O(Max(f(n),g(n))) (1)
- Quy t¾c nh©n: T1(n)T2(n) = O(f(n)g(n)) (2)
Tõ c¸c quy t¾c trªn ®©y ta cã thÓ suy ra r»ng:
Gi¶ sö thêi gian thùc hiÖn cña mét thuËt to¸n lµ T(n), vµ T(n) cã thÓ biÓu
diÔn thµnh mét biÓu thøc chøa tæng vµ tÝch c¸c thµnh phÇn kh¸c, lóc ®ã
khi biÕn ®æi T(n) ®Ó cã ®îc biÓu thøc g(n) mµ T(n)=O(g(n)) ta cã thÓ
thùc hiÖn theo c¸ch sau: trong c¸c thµnh phÇn cña tæng ta cã thÓ bá ®i
nh÷ng thµnh phÇn lu«n nhá h¬n nh÷ng thµnh phÇn kh¸c; víi mçi thµnh
phÇn ta cã thÓ nh©n chia víi mét h»ng kh¸c kh«ng; víi tÝch ta cã thÓ ®¸nh
gi¸ riªng tõng thõa sè råi nh©n kÕt qu¶ víi nhau.
VÝ dô 1. Gi¶ sö ta sè phÐp to¸n cÇn thùc hiÖn ®èi víi mét thuËt to¸n nµo
®ã lµ:
T(n) = 3nlog(n!) + (n3 + 3)logn
h·y ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n cña thuËt to¸n nµy díi d¹ng mét biÓu
thøc ®¬n gi¶n h¬n.
5
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Gi¶i: Theo ®Þnh nghÜa ®é phøc t¹p tÝnh to¸n th× b¶n th©n T(n) chÝnh lµ
®é phøc t¹p tÝnh to¸n cña chÝnh nã. Tuy nhiªn ta muèn biÕn ®æi vÒ d¹ng
quen thuéc ®¬n gi¶n h¬n.
Tríc hÕt ta ®¸nh gi¸ sè h¹ng thø nhÊt 3nlog(n!). §©y lµ mét tÝch vµ ta sÏ
®¸nh gi¸ riªng tõng thõa sè lµ 3n vµ log(n!). V× log(n!) ≤ log(nn) = nlogn, do
®ã log(n!) = O(nlogn). HiÓn nhiªn lµ 3n = O(n). Tõ ®©y ¸p dông (2), ta cã
3nlog(n!) = O(n2logn).
TiÕp theo, ta ®¸nh gi¸ (n3 + 3)logn. V× víi n≥2 th× n3 >3 do ®ã n3 + 3 =
O(n3). Theo (2) ta còng cã (n3 + 3)logn = O(n3logn). Theo (1) ta cã
3nlog(n!) + (n3 + 3)logn = O(max(n2logn, n3logn)) = O(n3logn)
Hay thuËt to¸n cÇn kh¶o s¸t cã ®é phøc t¹p tÝnh to¸n lµ O(n3logn).
VÝ dô 2. Gi¶ sö ta cÇn ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n cña c¸c c©u lÖnh
sau ®©y:
(a) for(i=0;i< n;i++)
{x=0;
for(j=0;j<n;j++) x++;
};
(b) for(i=0;i< n;i++) y++;
C©u lÖnh x++ ®îc ®¸nh gi¸ lµ O(1), do ®ã c©u lÖnh (a) cã thêi gian
thùc hiÖn lµ n(n+1). V× n+1 = O(max(n,1)) = n, do ®ã ®îc ®¸nh gi¸
n(n+1) = O(nxn) = O(n2); c©u lÖnh (b) ®îc ®¸nh gi¸ lµ O(n). Do ®ã thêi
gian thùc hiÖn c¶ 2 thuËt to¸n trªn ®îc ®¸nh gi¸ lµ:
n(n+1)+n = O(max(n2,n))=O(n2).
6
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
gi¶i quyÕt chóng mét c¸ch ®éc lËp vµ sau ®ã tæ hîp c¸c lêi gi¶i. Khi
N ®îc nh©n gÊp ®«i th× NlogN bÞ nh©n lªn nhiÒu h¬n gÊp ®«i nh-
ng kh«ng nhiÒu l¾m.
N 2
Thêi gian ch¹y lµ bËc 2. Thêng gÆp trong c¸c thuËt to¸n mµ ta cÇn xö
lý tõng cÆp phÇn tö d÷ liÖu (cã thÓ lµ 2 vßng lÆp lång nhau).
N 3
T¬ng tù, mét thuËt to¸n xö lý c¸c bé ba phÇn tö d÷ liÖu thÝ dô ba
vßng lÆp lång nhau.
2 N
Mét sè Ýt thuËt to¸n cã thêi gian ch¹y lòy thõa l¹i thÝch hîp trong mét
sè trêng hîp thùc tÕ, mÆc dï c¸c thuËt to¸n nh thÕ lµ “sù Ðp buéc
th« b¹o” ®Ó gi¶i c¸c bµi to¸n.
Thêi gian ch¹y cña mét ch¬ng tr×nh cô thÓ thêng lµ mét h»ng sè nh©n
víi c¸c sè h¹ng trªn ®©y (“sè h¹ng dÉn ®Çu”) céng thªm mét sè h¹ng nhá
h¬n. Gi¸ trÞ cña h»ng sè vµ c¸c sè h¹ng phô thuéc vµo kÕt qu¶ cña sù ph©n
tÝch vµ c¸c chi tiÕt cµi ®Æt. HÖ sè cña sè h¹ng dÉn ®Çu liªn quan tíi sè chØ
thÞ bªn trong vßng lÆp. Víi N lín th× c¸c sè h¹ng dÉn ®Çu ®ãng vai trß chñ
chèt. Víi N nhá th× c¸c sè h¹ng cïng ®ãng gãp vµ viÖc so s¸nh thuËt to¸n sÏ
khã kh¨n h¬n.
1.2.1. §Ö quy
a. Kh¸i niÖm ®Ö quy
Trong c¸c môc trªn ®©y chóng ta ®· nªu vÝ dô vÒ ph¬ng ph¸p ®Ö quy
nh tÝnh ®Þnh thøc, d·y sè Fibonacci.
T tëng gi¶i bµi to¸n b»ng ®Ö quy lµ ®a bµi to¸n hiÖn t¹i vÒ mét bµi to¸n
cïng lo¹i, cïng tÝnh chÊt nhng ë møc thÊp h¬n, vµ qu¸ tr×nh nµy tiÕp tôc
cho ®Õn lóc ®îc ®a vÒ møc thÊp nhÊt cã thÓ gi¶i ®îc. Tõ kÕt qu¶ ë møc
thÊp nhÊt nµy ta sÏ lÇn ngîc l¹i tõng bíc mét cho ®Õn khi nhËn ®îc kÕt qu¶ ë
møc mong muèn. ChØ qua c¸ch thøc thùc hiÖn ®Ö quy ta cã thÓ thÊy ngay
lµ ph¬ng ph¸p ®Ö quy nãi chung dµi h¬n c¸ch gi¶i trùc tiÕp. NÕu thùc hiÖn
trªn m¸y tÝnh th× kh«ng nh÷ng thêi gian tÝnh to¸n mµ kh«ng gian lu tr÷
còng nhiÒu h¬n. ThËt vËy, ®Ó qu¸ tr×nh lÇn ngîc cã thÓ thùc hiÖn ®îc,
trong qu¸ tr×nh ®i tõ møc cao ®Õn møc thÊp nhÊt ta ph¶i lu tr÷ l¹i tÊt c¶
c¸c bíc trung gian. VËy th× v× sao ph¶i sö dông ®Õn ®Ö quy, trong khi ph-
¬ng ph¸p nµy tá ra kÐm hiÖu qu¶ vÒ kh«ng gian vµ thêi gian so víi ph¬ng
ph¸p trùc tiÕp?
Cã mét sè vÊn ®Ò khi ta cè g¾ng tr×nh bµy mét c¸ch trùc tiÕp th× rÊt
dµi dßng vµ khã hiÓu, nhng nÕu ta dïng ®Ö qui th× chØ cÇn tr×nh bµy
ng¾n gän trong mét vµi dßng mµ vÉn chÆt chÏ vµ s¸ng sña. ThÝ dô ®Ó
®Þnh nghÜa n!, nÕu ®Þnh nghÜa trùc tiÕp th× ta cã thÓ diÔn ®¹t nh sau:
n!= 1 nÕu n=0 hoÆc 1
n! = n*(n-1)*...*2*1 nÕu n>1
Nhng nÕu dïng ®Ö quy ta cã
0!=1
n!=n*(n-1)!
§Þnh nghÜa b»ng ®Ö quy tho¹t ®Çu cho ta c¶m gi¸c thiÕu chÝnh x¸c.
Theo t duy logic th«ng thêng th× kh«ng thÓ ®Þnh nghÜa mét kh¸i niÖm
th«ng qua chÝnh nã. VËy mµ c¸ch lµm nµy l¹i cho ta c¸ch h×nh dung rÊt râ
8
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
rµng. H·y xem ®Þnh nghÜa th môc trong tin häc:
Th môc (directory) lµ mét vïng trªn thiÕt bÞ nhí ®îc ®Æt tªn ®Ó lu tr÷
c¸c tËp tin vµ c¸c th môc kh¸c.
§Þnh nghÜa trªn cã tÝnh ®Ö quy, vµ thËt khã mµ thay thÕ ®Þnh nghÜa
nµy b»ng mét ®Þnh nghÜa kh¸c dÔ hiÓu h¬n mµ kh«ng qu¸ dµi dßng.
Tõ ®Þnh nghÜa trªn ta suy ra r»ng lo¹i th môc ®¬n gi¶n nhÊt lµ n¬i lu tr÷
c¸c tËp tin hoÆc kh«ng chøa g× c¶. Trong trêng hîp nµy kh¸i niÖm th môc lµ
râ rµng. Nh÷ng trêng hîp kh¸c ®îc suy ra dùa vµo trêng hîp c¬ b¶n nµy vµ
®Þnh nghÜa nãi trªn.
§Ö quy thêng cã 2 thµnh phÇn:
- Thµnh phÇn dõng: kh«ng chøa kh¸i niÖm ®ang ®Þnh nghÜa.
- Thµnh phÇn ®Ö quy: cã chøa kh¸i niÖm ®ang ®Þnh nghÜa.
Do tÇm quan träng cña ®Ö quy, hÇu hÕt c¸c ng«n ng÷ lËp tr×nh ®Òu
trang bÞ c¬ chÕ gäi hµm ®Ö quy, tøc lµ trong th©n mét hµm cã thÓ cã c©u
lÖnh gäi ®Õn chÝnh nã. ChÝnh ®iÒu thuËn lîi nµy ®· lµm cho c¸c øng dông
®Ö quy trë nªn dÔ dµng h¬n. Ngêi sö dông chØ cÇn viÕt c¸c dßng lÖnh t-
¬ng øng víi thuËt to¸n ®Ö quy, cßn mäi sù phøc t¹p bªn trong, nh qu¸ tr×nh
chuyÓn tõ møc cao xuèng møc thÊp nhÊt råi lÇn ngîc trë l¹i ®Ó tÝnh trêng
hîp tæng qu¸t lµ do m¸y tÝnh ®¶m nhiÖm. Bµi to¸n th¸p Hµ néi lµ bµi to¸n
khã nÕu kh«ng dïng ®Ö quy. NÕu sö dông ph¬ng tiÖn nµy th× nh chóng ta
®· thÊy, ch¬ng tr×nh chØ cã vµi ba dßng mµ th«i.
VÝ dô 2. D·y fibonacci lµ d·y c¸c sè nguyªn kh«ng ©m ®îc ®Þnh nghÜa bëi
c«ng thøc:
n n = 0,1
fn =
f n −1 + f n −2 n >1
Ta cã thÓ viÕt ch¬ng tr×nh ®Ö quy tÝnh sè Fibonacci t¹i n nh sau:
long fibo(int n) {if(n<=1) return 1; return (fibo(n-1)+fibo(n-2));}
Ta thÊy r»ng trong th©n hµm cã 2 lêi gäi ®Ö quy. Ta gäi d¹ng ®Ö quy mµ
cã Ýt nhÊt 2 lêi gäi ®Õn chÝnh nã trong th©n hµm lµ ®Ö quy nh¸nh. §Ö
quy nh¸nh cã cÊu tróc c©y kh¸ phøc t¹p.
Cã thÓ tÝnh ®îc chÝnh x¸c sè lÇn gäi hµm Fibo khi cÇn tÝnh to¸n f n : ta gäi
sè lÇn gäi cÇn thiÕt ®Ó tÝnh fn lµ qn .Ta thÊy r»ng sè lÇn gäi hµm ®Ó tÝnh fn
b»ng sè lÇn gäi ®Ó tÝnh fn-1 céng víi sè lÇn gäi tÝnh fn-2 trõ khi n=0 hay
n=1 th× chØ cÇn mét lÇn gäi. VËy ta cã
1 n = 0,1
qn =
q n −1 + q n −2 n >1
Tõ ®©y ta cã qn = fn+1 .Tøc lµ d·y qn còng lµ d·y cã kiÓu Fibonacci.
Ta ®· biÕt fn ~ an trong ®ã a ~ 1.61803... lµ “tû sè vµng”. VËy gi¶ sö
mçi lÇn gäi cÇn kho¶ng C phÐp tÝnh th× ta cÇn sè phÐp tÝnh ®Ó tÝnh f n
lµ Can . ThËt sù ®¸ng sî khi ch¬ng tr×nh ®¬n gi¶n trªn ®©y lµ mét thuËt
to¸n thêi gian lòy thõa mµ chØ ®Ó tÝnh c¸c sè Fibonacci! Ch¬ng tr×nh ®Ö
quy trªn cã thÓ thay b»ng mét ch¬ng tr×nh lÆp ®¬n gi¶n sau víi ®é phøc
t¹p tuyÕn tÝnh:
long fibonacci2(int N) {int i;long x,y,z; x=0;y=1; for(i=1;i<n;i++){z=x+y;
x= y; y=z;}
return (y);}
§Ó b¹n ®äc dÔ h×nh dung h¬n vÒ sù kh¸c biÖt thêi gian tÝnh to¸n cña 2
thuËt to¸n trªn ®©y, chóng t«i xin nªu mét vµi trêng hîp cô thÓ sau:
Víi n=50, thuËt to¸n lÆp tÝnh sè Fibonacci cÇn 1 micro gi©y, thuËt to¸n
®Ö quy cÇn kho¶ng 20 ngµy. Víi n=100, thuËt to¸n lÆp cÇn kho¶ng 1.5
micro gi©y, cßn thuËt to¸n ®Ö quy cÇn 10 tû n¨m! TÊt nhiªn lµ ta ®· gi¶
thiÕt r»ng c¸c m¸y tÝnh ch¹y thuËt to¸n ®Ö quy trªn ®©y ®îc trang bÞ
stack víi dung lîng nhí khæng lå cã thÓ lu tr÷ tÊt c¶ c¸c khung kÝch ho¹t
cÇn thiÕt!
Mét lÇn n÷a vÝ dô nµy cho ta thÊy r»ng ®Ö quy kh«ng nªn dïng mét c¸ch
tïy tiÖn ®Ó ®«i khi kh«ng lêng tríc ®îc hËu qu¶.
Tuy nhiªn ®Ö quy vÉn cã vai trß xøng ®¸ng cña nã. Bµi to¸n th¸p Hµ néi
cho ta mét thÝ dô lý thó vÒ viÖc sö dông ®Ö quy. §Ö quy cßn ®îc dïng trong
10
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
®Þnh nghÜa v¨n ph¹m, ®Þnh nghÜa có ph¸p ng«n ng÷, ®Þnh nghÜa mét
sè cÊu tróc d÷ liÖu ... Khi ta thay c¸c gi¶i thuËt ®Ö quy b»ng c¸c gi¶i thuËt
kh«ng tù gäi chóng, nh gi¶i thuËt lÆp nªu trªn, ta gäi lµ khö ®Ö quy.
11
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Gi¶ sö ngêi ta cÇn ®¸nh gi¸ mét l« hµng gåm c¸c kiÖn hµng chøa c¸c gãi
t«m ®«ng l¹nh. Bµi to¸n ®Æt ra lµ ph¶i kiÓm tra l« hµng nµy vµ ®¸nh gi¸
bao nhiªu phÇn tr¨m ®¹t tiªu chuÈn quèc tÕ. NÕu tû lÖ ®ã lµ gÇn 100% th×
hµng míi ®îc phÐp xuÊt khÈu. Gi¶ sö r»ng nÕu mét gãi t«m bÞ bãc ra ®Ó
kiÓm tra th× chØ ®Ó tiªu thô trong níc. Râ rµng ta kh«ng thÓ kiÓm tra tÊt
c¶ c¸c gãi t«m ®îc, mµ nÕu chØ chän mét sè gãi nµo ®ã th× cã thÓ c¸c gãi
nµy kh«ng mang tÝnh ®¹i diÖn. Ngêi ta ®· dïng ph¬ng ph¸p chän ngÉu
nhiªn. Trong sè mÉu lÊy ra mét c¸ch ngÉu nhiªn ngêi ta kiÓm tra vµ ®a ra
kÕt luËn. Râ rµng c¸ch lµm nµy vi ph¹m c¸c ®Æc trng x¸c ®Þnh vµ hiÖu qu¶
cña thuËt to¸n. KÕt qu¶ cña tõng bíc kh«ng ®îc x¸c ®Þnh râ rµng, kÕt qu¶
còng kh«ng duy nhÊt vµ cha ch¾c ®· ®óng. Cïng mét l« hµng nÕu kiÓm tra
nhiÒu lÇn cã thÓ cã c¸c kÕt luËn kh¸c nhau. Tuy nhiªn cã thÓ thÊy lµ khã cã
c¸ch nµo kh¸c, vµ do vËy ngêi ta còng kh«ng hy väng cã ®îc kÕt qu¶ chÝnh
x¸c tuyÖt ®èi mµ chØ ®óng víi x¸c suÊt nµo ®ã. DÜ nhiªn c¸c kÕt luËn vÒ
l©u dµi ph¶i ®¹t ®îc ®é chÝnh x¸c cao thÝ dô 99 hay 99.5% ch¼ng h¹n.
Nãi tãm l¹i trong thùc tÕ cµng ngµy chóng ta gÆp cµng nhiÒu nh÷ng vÊn
®Ò sau:
NÕu ta ®ßi hái mét lêi gi¶i chÝnh x¸c th× chóng ta kh«ng thÓ lµm ®îc,
nghÜa lµ chóng ta kh«ng ®îc g×. Ngîc l¹i nÕu chóng ta chÊp nhËn mét gi¶i
ph¸p kÐm chÆt chÏ vÒ mÆt to¸n häc th× ta gi¶i quyÕt ®îc c«ng viÖc cña
chóng ta ë mét møc ®é nµo ®ã. Râ rµng cã mét c¸i g× ®ã dï cha hoµn
chØnh vÉn h¬n lµ kh«ng cã g×. VËy viÖc më réng kh¸i niÖm thuËt to¸n lµ
mét yªu cÇu cña thùc tÕ. Chóng ta sÏ gäi c¸ch gi¶i chÊp nhËn ®îc nhng
kh«ng hoµn toµn tu©n theo c¸c tiªu chuÈn cña thuËt to¸n lµ thuËt
gi¶i. Trong c¸c tµi liÖu níc ngoµi, ngoµi thuËt ng÷ “Algorithm” ngêi ta cßn
dïng c¸c thuËt nh÷ “Procedure”, “Method”; thÝ dô Recursive procedure,
Monte - Carlo Method... Kh¸i niÖm më réng nµy cña thuËt to¸n ®· më réng
cöa cho chóng ta trong viÖc t×m kiÕm ph¬ng ph¸p ®Ó gi¶i quyÕt c¸c bµi
to¸n ®îc ®Æt ra.
1.3.2. C¸c bíc gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh
Qu¸ tr×nh gi¶i quyÕt mét bµi to¸n trªn m¸y tÝnh ®«i khi rÊt ®¬n gi¶n, ®¬n
thuÇn lµ c«ng viÖc lËp tr×nh, nhng nãi chung lµ mét qu¸ tr×nh phøc t¹p
gåm nhiÒu bíc:
1) X¸c ®Þnh bµi to¸n.
13
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Ph©n tÝch hÖ thèng, ph¸t biÓu chÝnh x¸c bµi to¸n, ph©n tÝch mèi liªn
hÖ gi÷a c¸c d÷ kiÖn, x©y dùng m« h×nh, xÐt tÝnh kh¶ thi.
2) Lùa chän ph¬ng ph¸p gi¶i.
Nªu nh÷ng ph¬ng ¸n cã thÓ, ph©n tÝch lùa chän ph¬ng ph¸p thÝch hîp.
3) X©y dùng thuËt gi¶i.
X©y dùng m« h×nh chÆt chÏ, chÝnh x¸c h¬n vÒ ph¬ng ph¸p ®· lùa
chän. X¸c ®Þnh d÷ liÖu vµo ra, thiÕt kÕ cÊu tróc d÷ liÖu, c¸c bíc c¬
b¶n ®Ó thùc hiÖn thuËt gi¶i. Nªn ¸p dông ph¬ng ph¸p thiÕt kÕ cã cÊu
tróc, tõ thiÕt kÕ tæng thÓ råi tiÕn hµnh lµm mÞn dÇn tõng bíc.
4) Cµi ®Æt ch¬ng tr×nh.
ViÕt ch¬ng tr×nh. C¸c ch¬ng tr×nh ph¶i ®îc cµi ®Æt sao cho
chóng cã thÓ ®îc thay ®æi dÔ dµng, ®îc ®äc vµ hiÓu nhanh
chãng bëi c¸c lËp tr×nh viªn kh¸c, vµ giao tiÕp tèt víi c¸c phÇn
kh¸c cña hÖ thèng.
5) HiÖu chØnh ch¬ng tr×nh.
Cµi ®Æt ch¬ng tr×nh lªn m¸y tÝnh vµ cho ch¹y thö. Cè g¾ng thö víi
cµng nhiÒu bé d÷ liÖu cµng tèt. Ph¸t hiÖn vµ söa c¸c lçi có ph¸p
(Syntax) vµ ng÷ nghÜa (Semantic).
6) Thùc hiÖn ch¬ng tr×nh.
§a ch¬ng tr×nh vµo ¸p dông thùc tÕ vµ trong qu¸ tr×nh ®ã ph¸t hiÖn vµ
söa c¸c sai sãt n¶y sinh.
14
Ch¬ng 2
Danh s¸ch
Danh s¸ch trªn ®©y gåm nhiÒu môc, mçi môc gåm 2 ®¹i lîng ®Æc tr-
ng: sè lîng vµ m« t¶. §iÒu nµy nãi chung còng ®óng víi c¸c danh s¸ch
kh¸c. Tïy tõng trêng hîp cô thÓ, mçi môc cã khi chØ chøa mét th«ng tin
duy nhÊt vÝ dô danh s¸ch c¸c cÇu thñ bãng ®¸ tríc giê thi ®Êu, lóc nµy
danh s¸ch chØ gåm tªn c¸c cÇu thñ; còng cã khi chøa kh¸ nhiÒu lo¹i th«ng
tin, vÝ dô danh s¸ch c¸c vËn ®éng viªn muèn tham gia ®éi tuyÓn quèc
gia. Lóc nµy ngoµi hä tªn ph¶i cã thªm nhiÒu th«ng tin kh¸c nh quª qu¸n,
ngµy sinh, thµnh tÝch thi ®Êu...TÊt c¶ c¸c môc ph¶i chøa mét sè lo¹i
th«ng tin cã kiÓu nh nhau vµ ®îc gäi lµ c¸c trêng (fields). Mçi môc cña
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
danh s¸ch thêng ®îc gäi b»ng nhiÒu thuËt ng÷ kh¸c nhau: nót (node),
b¶n ghi (record), thùc thÓ (entity), h¹t (bead), kho¶n môc (item), phÇn tö
(element). §Ó ®¬n gi¶n chóng t«i sÏ gäi c¸c môc lµ c¸c nót. C¸ch gäi nh
vËy cã thÓ dïng cho c©y vµ ®å thÞ vµ cho ta mét h×nh ¶nh trùc quan
h¬n. Trong ch¬ng nµy còng nh c¸c ch¬ng sau chóng t«i sÏ chØ h¹n chÕ sè
trêng tèi thiÓu cho mçi môc, vÝ dô mçi môc chØ chøa mét sè thùc. Chóng
t«i nghÜ r»ng nh vËy c¸c ch¬ng tr×nh minh häa sÏ ng¾n gän, dÔ ®äc ®Ó
b¹n ®äc cã thÓ nhanh chãng nhËn ra b¶n chÊt khoa häc cña vÊn ®Ò. C¸c
b¹n cã thÓ thùc hµnh víi nh÷ng sè liÖu phøc t¹p h¬n sau khi ®· n¾m ®îc
kiÕn thøc, nh vËy c¸c b¹n cã thÓ hiÓu s©u h¬n vµ lµm quen dÇn víi c¸c
øng dông thùc tÕ.
16
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
s¸ch liªn kÕt ®¬n. Víi danh s¸ch nµy th× dÔ thÊy r»ng chØ cÇn mét con
trá chØ ®Õn nót ®Çu tiªn trong danh s¸ch lµ ®ñ. Tuy nhiªn ®Ó tiÖn cho
viÖc thªm phÇn tö ë cuèi danh s¸ch, ngêi ta thªm con trá plast chØ vµo
nót cuèi danh s¸ch.
D¹ng nµy rÊt gièng mét m¶ng c¸c phÇn tö cµi ®Æt b»ng ng«n ng÷ lËp
tr×nh. ThËt vËy, víi lÖnh float a[20]; trong C++, ta cã mét m¶ng gåm
20 sè thùc trong bé nhí vµ ®îc ®¸nh chØ sè lµ:
a[0], a[1], ..., a[19]
§iÒu kh¸c biÖt ë ®©y lµ sè phÇn tö cña danh s¸ch th× cã thÓ thay ®æi,
cßn cì cña m¶ng trong bé nhí l¹i lµ mét sè cè ®Þnh. Ta cã thÓ kh¾c phôc
®iÒu nµy b»ng c¸ch dù ®o¸n tríc kho¶ng thay ®æi cña sè c¸c phÇn tö
trong danh s¸ch, råi khai b¸o mét m¶ng cã cì lµ chÆn trªn cña sè c¸c phÇn
tö. §Ó cã thÓ thay ®æi kÝch thíc cña m¶ng mét c¸ch dÔ dµng vµ chØ cÇn
thay ®æi ë vÞ trÝ ®Çu ch¬ng tr×nh, ta cã thÓ dïng lÖnh #define, vÝ dô:
#define nmax 100
ch¼ng h¹n.
Thêng th× mçi nót th«ng tin lµ mét cÊu tróc phøc hîp gåm nhiÒu thµnh
phÇn, vÝ dô nÕu danh s¸ch gåm c¸c sinh viªn th× cã thÓ cã d¹ng:
struct SinhVien {char HoTen[30]; float DiemTB;};
Râ rµng danh s¸ch ®îc ®Æc trng bëi mét m¶ng vµ sè phÇn tö. Ta cã thÓ
khai b¸o m¶ng vµ biÕn chØ sè phÇn tö mét c¸ch toµn côc, vÝ dô:
SinhVien a[nmax]; int count;
hoÆc nhãm vµo trong mét cÊu tróc, vÝ dô:
struct DanhSach {SinhVien a[nmax];int count;};
M¶ng mµ kÝch cì ®îc x¸c ®Þnh ngay khi khai b¸o ®îc gäi lµ m¶ng tÜnh.
M¶ng tÜnh cã nhîc ®iÓm lµ kÝch cì cña m¶ng ph¶i x¸c ®Þnh tríc khi ch-
¬ng tr×nh ®îc biªn dÞch. Trong thùc tÕ rÊt khã ®Þnh tríc lµ cì cña m¶ng
lµ bao nhiÒu th× võa. H¬n n÷a kÝch thíc bé nhí dµnh cho tÊt c¶ c¸c biÕn
tÜnh chØ lµ 64Kb (1 segment bé nhí). Ta cã thÓ kh¾c phôc t×nh tr¹ng
nµy b»ng c¸ch dïng m¶ng ®éng. VÝ dô víi danh s¸ch sinh viªn nãi trªn,
nÕu dïng m¶ng ®éng th× c¸c lÖnh ®îc viÕt l¹i lµ:
SinhVien *a; int nmax,count;
hoÆc
struct DanhSach {SinhVien *a;int nmax,count;};
Lóc nµy nmax kh«ng cÇn lµ h»ng sè mµ cã thÓ g¸n gi¸ trÞ khi ch¹y ch¬ng
tr×nh. Ta ph¶i cã hµm khëi t¹o ®Ó cÊp ph¸t bé nhí cho a. VÝ dô víi trêng
hîp thø hai, hµm khëi t¹o cã thÓ cã d¹ng:
17
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
void KhoiTao(DanhSach &d, int size=20)
{d.nmax = size; d.a=new SinhVien[nmax];count=0;};
Dïng m¶ng ®éng ®· cã nhiÒu u ®iÓm, vÝ dô chØ cÇn x¸c ®Þnh cì cña
danh s¸ch khi ch¹y ch¬ng tr×nh hoÆc cã thÓ gi¶i phãng bé nhí khi cÇn
thiÕt. Tuy nhiªn nã còng cÇn mét vïng nhí liªn tôc, vµ vÉn cßn h¹n chÕ lµ
ph¶i cÊp ph¸t mét lÇn khi khëi t¹o, vµ nh vËy vÉn ph¶i dù ®o¸n tríc vÒ cì
cña m¶ng. VÒ mÆt sö dông bé nhí th× ph¬ng ph¸p cµi ®Æt danh s¸ch
b»ng ph¬ng ph¸p liªn kÕt mµ chóng ta sÏ xem xÐt trong môc sau lµ gi¶i
ph¸p hîp lý h¬n c¶. C¸c nót chøa th«ng tin vÒ c¸c phÇn tö sÏ cã thªm mét
thµnh phÇn lµ biÕn con trá chØ ®Õn phÇn tö tiÕp theo cña danh s¸ch.
Nhê sù liªn kÕt nµy mµ c¸c nót cã thÓ n»m r¶i r¸c trong bé nhí, kh«ng cÇn
ë mét vïng liÒn kÒ nhau nh trêng hîp dïng m¶ng.
(B¹n ®äc quan t©m cã thÓ xem ch¬ng tr×nh 21A-DSKE.CPP cµi ®Æt
danh s¸ch b»ng m¶ng tÜnh, 21B-DSKE.CPP cµi ®Æt danh s¸ch b»ng m¶ng
®éng).
b. Cµi ®Æt danh s¸ch b»ng ph¬ng ph¸p liªn kÕt ®¬n
Chóng ta cã thÓ thÊy r»ng trong thùc tÕ cã nhiÒu m« h×nh cã d¹ng
danh s¸ch liªn kÕt. Thùc vËy, mét ch¬ng tr×nh ng«n ng÷ m¸y gåm c¸c
dßng lÖnh cã d¹ng
Râ rµng c¸c dßng lÖnh nµy t¹o nªn danh s¸ch liªn kÕt.
B¶ng FAT cña DOS còng cã d¹ng mét danh s¸ch liªn kÕt. Trªn c¸c ®Ò
môc cña b¶ng FAT cã ghi ®Þa chØ vïng nhí trªn ®Üa lu trò phÇn phÇn
tiÕp theo cña tÖp. Nhê vËy mÆc dï sè liÖu mét tÖp cã thÓ lu tr÷ ë c¸c
vïng kh«ng liªn tôc trªn ®Üa, nhng DOS vÉn cã thÓ truy cËp ®îc nhê
th«ng tin tõ b¶ng FAT.
Trong c¸ch cµi ®Æt dïng danh s¸ch liªn kÕt ®¬n, mçi phÇn tö cña danh
s¸ch sÏ gåm hai phÇn: mét phÇn chøa th«ng tin vÒ ®èi tîng trong thùc tÕ,
phÇn kia lµ biÕn con trá next chØ ®Õn phÇn tö tiÕp theo trong danh
s¸ch. V× phÇn tö cuèi cïng cña danh s¸ch kh«ng cã phÇn tö tiÕp theo nªn
con trá next cña nã sÏ ®îc ®Æt b»ng NULL. Cã mét sè c¸ch cµi ®Æt danh
s¸ch liªn kÕt:
(1)Dïng mét con trá phead ®Ó trá vµo nót ®Çu tiªn.
(2)Dïng mét con trá pfirst ®Ó trá vµo nót ®Çu tiªn vµ mét con trá plast
chØ ®Õn nót cuèi cïng.
Ngoµi ra chóng ta cã thÓ cµi ®Æt danh s¸ch cã 2 mèi liªn kÕt. Tuy nhiªn
c¸ch cµi ®Æt nµy chØ dïng trong trêng hîp ®Æc biÖt, v× võa tèn bé nhí
võa ph¶i thªm phÐp tÝnh.
Râ rµng trong hai c¸ch trªn ®©y th× c¸ch (1) tiÕt kiÖm bé nhí h¬n v×
kh«ng dïng biÕn con trá plast. DÔ thÊy r»ng víi danh s¸ch liªn kÕt th×
chØ cÇn biÕt ®Þa chØ nót ®Çu tiªn lµ suy ra ®îc tÊt c¶ c¸c nót cßn l¹i (tõ
nót 1 suy ®îc nót 2, råi nót 3,...). Tuy nhiªn nÕu thªm vµo con trá plast sÏ
lµm cho mét sã thao t¸c ®¬n gi¶n h¬n. Ch¬ng tr×nh 22A-DSLK.CPP cµi
®Æt danh s¸ch liªn kÕt theo (1), cßn ch¬ng tr×nh 22B-DSLK.CPP cµi ®Æt
theo (2). Sau ®©y lµ c¸c t¸c vô chÝnh cña ch¬ng tr×nh 22B-DSLK.CPP.
pfirs plast
18
info info info ... info
next next next next • NULL
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
H×nh 2.1 Danh s¸ch cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt
®¬n
• Khai b¸o cÊu tróc danh s¸ch
CÊu tróc cña mét phÇn tö trong danh s¸ch gåm hai phÇn: biÕn info chøa
th«ng tin cña phÇn tö, biÕn next lµ biÕn con trá chØ ®Õn phÇn tö tiÕp
theo trong danh s¸ch hoÆc nhËn gi¸ trÞ NULL nÕu ®ã lµ phÇn tö cuèi cïng
cña danh s¸ch. BiÕn info thêng lµ mét biÕn cã cÊu tróc, chøa nhiÒu thµnh
phÇn vÝ dô nh cÊu tróc NhanSu ®îc khai b¸o nh sau:
struct NhanSu {char HoTen[30]; int Luong, Thuong, ThuNhap;};
Tuy nhiªn víi môc ®Ých lµm næi bËt b¶n chÊt cña thuËt to¸n, chóng t«i
chØ xÐt trêng hîp ®¬n gi¶n: info lµ mét biÕn sè thùc. VËy cÊu tróc mét
phÇn tö cña danh s¸ch ®îc khai b¸o lµ:
Mét danh s¸ch sÏ ®îc x¸c ®Þnh bëi hai biÕn con trá kiÓu node lµ pfirst
chøa ®Þa chØ cña phÇn tö ®Çu tiªn, vµ plast chøa ®Þa chØ phÇn tö cuèi
cïng cña danh s¸ch. §Ó tiªn thao t¸c, ta gép hai biÕn con trá nµy vµo trong
mét cÊu tróc vµ ®Æt tªn lµ DanhSach:
H×nh 2.2 LÇn lît gi¶i phãng c¸c nót trªn danh s¸ch
20
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
if(p!=NULL) {printf("\nKhoa %4d da co, khong chen
duoc!",x);return;}
pp = new node;
pp->info=x;pp->next=NULL;
if(d.pfirst==NULL) {d.pfirst=pp;d.plast=pp;return;}
d.plast->next = pp;
d.plast=pp;//pp bay gio la nut cuoi cung
};
• Xãa nót cã khãa x trªn danh s¸ch
NÕu x cã trªn danh s¸ch vµ ë ngay trªn nót ®Çu tiªn (lÖnh if(d.pfirst-
>info==x)) th× ta chuyÓn pfirst ®Õn nót tiÕp theo sau ®ã xãa nót ®Çu
tiªn (c¸c lÖnh p=d.pfirst;d.pfirst=d.pfirst->next;delete p;). Sau khi xãa
xong ta cßn ph¶i xem, nÕu danh s¸ch rçng th× ®Æt l¹i plast=NULL vµ kÕt
thóc.
Trong trêng hîp cßn l¹i x chØ cã thÓ xuÊt hiÖn ë c¸c nót sau nót ®Çu tiªn.
Ta xuÊt ph¸t tõ nót ®Çu tiªn vµ trong qu¸ tr×nh cho p ch¹y qua c¸c nót
®Ó t×m kiÕm nót cã phÇn th«ng tin b»ng x, ta dïng con trá p1 ®Ó ghi
nhËn ®Þa chØ nót ®øng tríc p (c¸c lÖnh p1=p;p=p->next;). NÕu t×m
thÊy x th× ta ghi nhËn vÞ trÝ p b»ng con trá q (q=p;) råi ®Æt mèi liªn
kÕt tõ p1 tíi nót phÝa sau p (lÖnh p1->next=p->next;) sau ®ã xãa p
(chÝnh lµ lÖnh delete q) nh trªn h×nh 2.3. sau:
p1 p p-
>next
• S¾p xÕp danh s¸ch liªn kÕt b»ng ph¬ng ph¸p lùa chän trùc tiÕp
C¸ch s¾p xÕp nµy ®îc thùc hiÖn gièng nh khi s¾p xÕp mét m¶ng: tríc
hÕt ta t×m phÇn tö cã khãa nhá nhÊt råi chuyÓn vÒ vÞ trÝ ®Çu tiªn trong
danh s¸ch, tiÕp theo trong c¸c phÇn tö cßn l¹i t×m phÇn tö cã khãa nhá
nhÊt råi ®æi vÞ trÝ cho phÇn tö thø hai, ... cø nh thÕ cho ®Õn phÇn tö
cuèi cïng trong danh s¸ch. Víi danh s¸ch liªn kÕt, viÖc ®æi hai nót sÏ lµm
thay ®æi sù liªn kÕt, do ®ã ta dïng gi¶i ph¸p lµ chØ ®æi phÇn th«ng tin,
cßn mèi liªn kÕt th× gi÷ nguyªn. Ta dïng con trá p1 ®Ó ghi nhËn nót thø
nhÊt, nót thø hai, ... trong qu¸ tr×nh gi÷ nguyªn p1 th× ta dïng con trá p2
®Ó duyÖt qua c¸c nót ®øng phÝa sau p1. Khëi ®Çu p1 trá vµo nót ®Çu
tiªn (p1=d.pfirst;), sau ®ã sÏ lÇn lît ®i qua c¸c nót phÝa sau (lÖnh p1=p1-
>next;) cho ®Õn khi qua nót cuèi cïng (lÖnh while(p1!=NULL). Khi cè
®Þnh p1 th× ta dïng con trá p2 ®Ó duyÖt qua c¸c nót phÝa sau p1. Nh
vËy khëi ®Çu lµ lÖnh p2=p1->next;, sau ®ã lµ lÖnh p2=p2->next; ®îc
lÆp l¹i cho ®Õn khi p2 qua nót cuèi cïng (while(p2!=NULL)). Con trá p sÏ
ghi nhËn vÞ trÝ cã khãa nhá nhÊt tõ p1 cho ®Õn cuèi danh s¸ch. Ban ®Çu
dÜ nhiªn lµ p ®îc g¸n b»ng p1 (lÖnh p=p1;) sau ®ã trong qu¸ tr×nh p2
dÞch chuyÓn th× mçi lÇn ph¸t hiÖn ra phÇn tö cã khãa nhá h¬n th× p laÞ
chØ ®Õn vÞ trÝ nµy (lÖnh if(p2->info<p->info) p=p2;). Sau khi p2 ®· ®i
®Õn nót cuèi cïng th× p chÝnh lµ vÞ trÝ chøa khãa nhá nhÊt (tõ p1 ®Õn
cuèi). RÊt cã thÓ vÞ trÝ nµy vÉn lµ p1, nghÜa lµ p1 lµ vÞ trÝ nhá nhÊt
trong c¸c vÞ trÝ tõ p1 cho ®Õn cuèi danh s¸ch. ChØ khi p trá vµo vÞ trÝ
kh¸c (lÖnh if(p!=p1)) ta míi cÇn ph¶i ®æi th«ng tin cña nót p1 cho nót p.
24
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
2.2.3. Cµi ®Æt stack
Stack cã thÓ cµi ®Æt theo kiÓu kÕ tiÕp dïng m¶ng ®éng hoÆc liªn
kÕt.
Hai t¸c vô chÝnh cña stack lµ push() - thªm mét nót vµ pop() - lÊy ®i
mét nót ë ®Ønh. H×nh 2.1 sau ®©y m« t¶ sù thay ®æi cña stack qua
mét lo¹t thao t¸c push vµ pop.
H×nh 2.5 Stack cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt ®¬n
• Khai b¸o cÊu tróc ng¨n xÕp
Còng nh danh s¸ch tæng qu¸t, mçi nót trªn stack lµ mét cÊu tróc gåm hai
thµnh phÇn: thµnh phÇn chøa th«ng tin cã tªn lµ info vµ mét thµnh phÇn
lµ biÕn con trá next dïng ®Ó lu ®Þa chØ cña nót tiÕp theo trong stack
hoÆc trá ®Õn NULL nÕu lµ nót cuèi cïng. BiÕn info cã thÓ lµ mét cÊu tróc
phøc t¹p chøa nhiÒu thµnh phÇn. Tuy nhiªn víi môc ®Ých lµm næi bËt b¶n
25
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
chÊt cña thuËt to¸n, chóng t«i chØ xÐt trêng hîp ®¬n gi¶n: info lµ mét
biÕn sè nguyªn. VËy cÊu tróc mét phÇn tö cña stack ®îc khai b¸o lµ:
Kh¸c víi danh s¸ch tæng qu¸t, ë ®©y info ®îc khai b¸o lµ biÕn nguyªn chø
kh«ng ph¶i biÕn thùc, v× chóng t«i muèn thö l¹i stack b»ng c¸ch dïng nã
®Ó chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng sè nhÞ ph©n.
ChØ cÇn con trá phead chØ vµo ®Ønh stack lµ cã thÓ suy ra c¸c phÇn tö
cßn l¹i. VËy stack sÏ ®îc ®Æc trng bëi mét biÕn con trá phead. Tuy nhiªn
®Ó khái nhÇm l·n víi c¸c cÊu tróc kh¸c, chóng t«i vÉn dïng cÊu tróc
NganXep ®Ó chøa biÕn con trá nµy:
Víi stack th× chØ cã mét sè thao t¸c thêng sö dông lµ: khëi t¹o stack, xãa
stack, kiÓm tra xem stack cã rçng kh«ng, ®a mét phÇn tö vµo ®Ønh
stack, lÊy mét phÇn tö tõ ®Ønh stack, xem gi¸ trÞ phÇn tö ë ®Ønh stack.
C¸c thao t¸c kh¸c t¬ng tù hoÆc kh¸ ®¬n gi¶n, do ®ã sau ®©y chóng t«i
chØ gi¶i thÝch hai thao t¸c ®a phÇn tö vµo ®Ønh stack push(), lÊy mét
phÇn tö tõ ®Ønh stack pop().
26
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
• Thö l¹i ng¨n xÕp
Cã thÓ thö l¹i xem ng¨n xÕp ho¹t ®éng cã tèt kh«ng b»ng c¸ch dïng nã
®Ó chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng sè c¬ sè 2.
ThuËt to¸n chuyÓn mét sè nguyªn k sang d¹ng nhÞ ph©n: LÊy k chia liªn
tiÕp cho 2 cho ®Õn khi th¬ng sè b»ng 0, phÐp chia thø i cã sè d bi,
i=0,1,2,...,n , khi ®ã bn bn-1 bn-2... b0 lµ phÇn nguyªn cña sè b trong hÖ c¬
sè 2.
VÝ dô. ChuyÓn ®æi sè 11 sang d¹ng nhÞ ph©n
Chia D
2
11 1
5 1
2 0
1 1
0
KÕt qu¶ lµ 1011. Ta thÊy qu¸ tr×nh lÊy c¸c sè d ®Ó viÕt thµnh sè nhÞ
ph©n ngîc víi qu¸ tr×nh t¹o ra nã. C¸ch lµm nµy gièng víi thao t¸c ®a
phÇn tö vµo stack vµ lÊy phÇn tö ra khái stack. Hµm sau ®©y m« t¶ l¹i
c¸c thao t¸c chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng nhÞ ph©n:
void ChuyenNP(int n=11)
{NganXep s;
init(s);
int m,t;m=n;
while(m>0)
{t=m%2;
push(s,t);
m=m/2;
}
printf("\n%d chuyen sang so nhi phan la: ",n);
while(!empty(s))
{t=pop(s);
printf("%d",t);
}
clear(s);
}
Ta thÊy vÞ trÝ cña phÇn tö ®Çu vµ phÇn tö cuèi kh«ng bao giê gi¶m.
Do ®ã ngay c¶ nÕu chØ cã trung b×nh 2 môc trong queue th× ta còng
cÇn mét d·y v« h¹n c¸c phÇn tö ®Ó duy tr× queue ho¹t ®éng. DÜ nhiªn
c¸ch cµi ®Æt nµy lµ kh«ng phï hîp víi thùc tÕ. Chóng ta sÏ gi¶i quyÕt vÊn
®Ò nµy b»ng c¸ch nèi ®Çu hµng vµ cuèi hµng l¹i víi nhau. Ta gäi queue
cµi ®Æt theo kiÓu nµy lµ queue vßng. Chóng t«i ®Ó l¹i vÊn ®Ò nµy ®Ó
c¸c b¹n tù t×m hiÓu. Sau ®©y chóng ta sÏ cµi ®Æt queue b»ng danh s¸ch
liªn kÕt ®¬n.
pfirs plast
H×nh 2.6. Queue cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt ®¬n
• Khai b¸o cÊu tróc hµng ®îi
Còng nh danh s¸ch tæng qu¸t, mçi nót trªn Queue lµ mét cÊu tróc gåm hai
thµnh phÇn: thµnh phÇn chøa th«ng tin cã tªn lµ info vµ mét thµnh phÇn
lµ biÕn con trá next dïng ®Ó lu ®Þa chØ cña nót tiÕp theo trong queue
hoÆc trá ®Õn NULL nÕu lµ nót cuèi cïng. BiÕn info cã thÓ lµ mét cÊu tróc
phøc t¹p chøa nhiÒu thµnh phÇn. Tuy nhiªn víi môc ®Ých lµm næi bËt b¶n
chÊt cña thuËt to¸n, chóng t«i chØ xÐt trêng hîp ®¬n gi¶n: info lµ mét
biÕn sè nguyªn. VËy cÊu tróc mét phÇn tö cña queue ®îc khai b¸o lµ:
Kh¸c víi danh s¸ch tæng qu¸t, ë ®©y info ®îc khai b¸o lµ biÕn nguyªn chø
kh«ng ph¶i biÕn thùc, v× chóng t«i muèn thö l¹i queue b»ng c¸ch dïng nã
®Ó chuyÓn ®æi mét sè thËp ph©n chØ cã phÇn lÎ sang d¹ng sè nhÞ
ph©n.
Queue sÏ ®îc ®Æc trng bëi hai biÕn con trá pfirst vµ plast:
Víi queue th× chØ cã mét sè thao t¸c thêng sö dông lµ: khëi t¹o queue,
xãa queue, kiÓm tra xem queue cã rçng kh«ng, ®a mét phÇn tö vµo cuèi
queue, lÊy mét phÇn tö tõ ®Çu queue, xem gi¸ trÞ phÇn tö ë ®Çu queue
(hµm ViewFront()). C¸c thao t¸c kh¸c t¬ng tù hoÆc kh¸ ®¬n gi¶n, do ®ã
sau ®©y chóng t«i chØ gi¶i thÝch hai thao t¸c ®a phÇn tö vµo cuèi put(),
lÊy mét phÇn tö tõ ®Çu queue get().
29
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
• §a mét phÇn tö cã khãa x vµo cuèi hµng ®îi
Tríc hÕt ta t¹o mét nót míi, g¸n phÇn info cña nã b»ng x vµ next=NULL.
NÕu queue rçng (lÖnh if(q.pfirst==NULL)) th× ta ®Æt con trá pfirst vµ
plast chØ vµo nót míi t¹o ra vµ kÕt thóc. NÕu kh«ng th× ta nèi nót cuèi
cïng víi nót míi t¹o ra (lÖnh q.plast->next=pp;), sau ®ã chuuyÓn plast vÒ
nót nµy vµ kÕt thóc (q.plast=pp;).
30
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
VÝ dô: 1. Cho sè thËp ph©n v = 0.125 t×m sè nhÞ ph©n t¬ng øng.
0.12 Nh©n PhÇn nguyªn
5 2
0.25 0
0.5 0
1.0 1
KÕt qu¶ lµ 0.001. Ta thÊy qu¸ tr×nh lÊy c¸c sè d ®Ó viÕt thµnh sè nhÞ
ph©n gièng víi qu¸ tr×nh t¹o ra nã. C¸ch lµm nµy phï hîp víi c¬ chÕ hµng
®îi. Hµm sau ®©y m« t¶ l¹i c¸c thao t¸c sö dông queue chuyÓn ®æi mét
sè thËp ph©n chØ cã phÇn lÎ sang d¹ng nhÞ ph©n:
Theo ®óng tr×nh tù cña phÐp chuyÓn ®æi, ta nh©n phÇn ph©n cho 2
vµ lu phÇn nguyªn cña kÕt qu¶ vµo queue. Khi phÇn ph©n b»ng 0 hoÆc
®· ®¹t ®îc ®é chÝnh x¸c cÇn thiÕt th× ta b¾t ®Çu lÊy c¸c gi¸ trÞ trong
queue ra vµ cho hiÖn trªn mµn h×nh.
31
Ch¬ng 3
C©y nhÞ ph©n
3.1. Më ®Çu
Trong ch¬ng tríc chóng ta ®· nghiªn cøu cÊu tróc danh s¸ch vµ c¸ch cµi
®Æt chóng. C¶ hai c¸ch cµi ®Æt kÒ hay liªn kÕt ®Òu béc lé nh÷ng nhîc
®iÓm khã kh¾c phôc. Cµi ®Æt theo kiÓu liªn kÕt tuy ®¬n gi¶n trong c¸c
thao t¸c chÌn xãa nhng l¹i kh«ng thùc hiÖn ®îc ph¬ng ph¸p t×m kiÕm nhÞ
ph©n. Cµi ®Æt b»ng m¶ng tuy thùc hiÖn ®îc thao t¸c t×m kiÕm nhÞ
ph©n nhng mÊt nhiÒu thêi gian cho thao t¸c chÌn. §©y lµ 2 thao t¸c rÊt
khã dung hßa. NÕu danh s¸ch kh«ng cÇn s¾p thø tù th× viÖc chÌn phÇn
tö míi ®¬n gi¶n, nhng viÖc t×m kiÕm mÊt nhiÒu thêi gian v× trong trêng
hîp xÊu nhÊt ph¶i ®i qua toµn bé danh s¸ch. Ngîc l¹i nÕu danh s¸ch cã
s¾p thø tù th× viÖc t×m kiÕm thùc hiÖn nhanh, nhng viÖc chÌn vµo rÊt
mÊt c«ng, v× ph¶i duyÖt danh s¸ch ®Ó t×m vÞ trÝ chÌn. Trong thùc tÕ
nÕu chóng ta gÆp nh÷ng bµi to¸n mµ thao t¸c chÌn vµo Ýt dïng ®Õn thÝ
dô qu¶n lý nh©n sù mét c¬ quan mµ sè c¸n bé gÇn nh æn ®Þnh th× cµi
®Æt danh s¸ch cã thø tù lµ thÝch hîp. §èi víi ®a sè c¸c bµi to¸n qu¶n lý
kh¸c thÝ dô qu¶n lý c«ng v¨n ®Õn c«ng v¨n ®i, qu¶n lý viÖc xuÊt nhËp
vËt t,... th× thao t¸c chÌn vµ t×m kiÕm gÇn nh ®îc thùc hiÖn thêng xuyªn,
khã cã thÓ nãi thao t¸c nµo dïng nhiÒu h¬n. CÊu tróc lý tëng trong t×nh
huèng nµy lµ ®¹t tèc ®é t×m kiÕm trªn danh s¸ch kÒ ®îc s¾p xÕp vµ tèc
®é chÌn cña danh s¸ch liªn kÕt.
Chóng ta h·y xem l¹i qu¸ tr×nh t×m kiÕm nhÞ ph©n trªn danh s¸ch cã
thø tù. T¹i mçi bíc t×m kiÕm chóng ta tr¶ lêi c©u hái "Nöa nµo cña danh
s¸ch vÉn cßn chøa phÇn tö cÇn t×m?", vµ ta lo¹i bá nöa kh«ng chøa phÇn
tö ®ã. Chóng ta muèn t¹o ra mét cÊu tróc d÷ liÖu sao cho khi chÌn thªm
d÷ liÖu míi chóng ta nªu c©u hái "phÇn tö míi nªn chÌn vµo nöa nµo cña
cÊu tróc?" DÜ nhiªn lµ cÊu tróc nµy kh«ng thÓ lµ danh s¸ch v× kh¸c víi
thao t¸c t×m kiÕm, thao t¸c chÌn kh«ng thÓ thùc hiÖn ®éc lËp trªn tõng
nöa sè liÖu. Khi chÌn sè liÖu vµo nöa díi ta vÉn ph¶i dÞch chuyÓn toµn bé
nöa phÝa trªn.
CÊu tróc c©y nhÞ ph©n cã thÓ tiÕp cËn ý tëng nµy. C©y nhÞ ph©n lµ
cÊu tróc d÷ liÖu cã kh¶ n¨ng t×m kiÕm nhÞ ph©n tù ®éng, do c¸ch tæ
chøc cña c¸c nót sè liÖu. C©y nhÞ ph©n ®îc cÊu tróc nh trong h×nh 3.1
sau:
B
A D
C E
CÊu tróc c©y nhÞ ph©n cã thÓ ®Þnh nghÜa mét c¸ch ®Ö quy nh sau:
C©y nhÞ ph©n (binary tree) hoÆc rçng (kh«ng cã nót nµo) hoÆc gåm
mét nót gèc vµ hai c©y con tr¸i vµ ph¶i, trong ®ã c¸c c©y con tr¸i vµ
ph¶i còng lµ c©y nhÞ ph©n.
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
C¸c nót trªn c©y nhÞ ph©n ®îc ph©n lo¹i nh sau:
• Nót gèc (root node): lµ nót ®Çu tiªn cña c©y nhÞ ph©n nh ®Þnh
nghÜa trªn ®©y. Nh vËy nót gèc kh«ng ph¶i lµ con cña bÊt cø nót
nµo kh¸c.
• Nót cha (father node): lµ nót cã nót con kh¸c rçng.
• Nót l¸ (leaf node): lµ nót kh«ng cã nót con kh¸c rçng.
• Nót trung gian (internal node): lµ nót cã c¶ nót cha vµ nót con kh¸c
rçng.
• Nót tríc (ancestor): nót x gäi lµ nót tríc cña nót y nÕu c©y con gèc x
cã chøa y.
• Nót sau bªn tr¸i (left descendant): nót y gäi lµ nót sau bªn tr¸i cña nót
x nÕu nót x cã c©y con tr¸i cã chøa y. T¬ng tù ta cã thÓ ®Þnh nghÜa
nót sau ph¶i.
• Nót anh em (brothers): hai nót gäi lµ anh em nÕu cã cïng mét cha.
• BËc cña nót (degree of node): lµ sè nót con kh¸c rçng cña nót ®ã. C¸c
nót cña c©y nhÞ ph©n cã bËc cao nhÊt lµ 2. Trªn h×nh 3.1 nót A cã
bËc 0, nót D cã bËc 2.
• BËc cña c©y (degree of tree): lµ bËc cao nhÊt cña c¸c nót trªn c©y.
• Møc cña nót (level of node): møc cña nót ®îc ®Þnh nghÜa ®Ö quy
nh sau:
- Nót gèc cã møc lµ 0
- Møc cña cha lµ i th× møc cña nót con lµ: i + 1.
Trªn h×nh 3.1 nót A vµ nót D cã møc lµ 1, c¸c nót C, E cã møc 2.
Møc cao nhÊt cña nót trong c©y lµ chiÒu cao cña c©y. VËy c©y ë
h×nh 3.1 cã chiÒu cao lµ 2. (Còng cã t¸c gi¶ ®Þnh nghÜa nót gèc
cã møc 1)
• §êng ®i (path) gi÷a 2 nót x, y trong ®ã x lµ nót tríc, y lµ nót sau, lµ d·y
c¸c ®Ønh x=x0, x1, x2,..., xn= y, trong ®ã xi lµ cha cña xi+1 (i =
0,1,...,n-1). ChiÒu dµi ®êng ®i gi÷a x vµ y lµ sè c¸c c¹nh trong ®êng
®i ®ã. Nh vËy chiÒu dµi tõ nót gèc ®Õn mét nót nµo ®ã b»ng møc
cña nót ®ã.
A
B
C 33
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
D
E
Trong trêng hîp nµy mÆc dï danh s¸ch cã s¾p thø tù nhng viÖc t×m
kiÕm hoÆc chÌn ®Òu cÇn thêi gian cã bËc tuyÕn tÝnh. C©y ®îc tæ chøc
kÐm nh vËy ®îc gäi lµ kh«ng c©n b»ng (unbalanced). §iÒu kiÖn hiÓn
nhiªn ®Ó c©y nhÞ ph©n ®îc c©n b»ng hoµn h¶o lµ c©y cã sè nót tèi ®a
t¹i mçi møc. ThÝ dô c©y trong h×nh 3.3 lµ c©y nhÞ ph©n hoµn h¶o (cßn
gäi lµ c©y nhÞ ph©n ®Çy ®ñ - complete binary tree):
B C
D E F G
C©y nhÞ ph©n ®Çy ®ñ lu«n lu«n cã sè nót lµ 2 d+1 -1, trong ®ã d lµ
sè møc cña c©y. VËy ®Ó t¹o cÊu tróc c©y nhÞ ph©n ®Çy ®ñ th× tríc hÕt
d÷ liÖu ta kh¶o s¸t ph¶i cã ®óng 2 d+1 -1 phÇn tö, trong ®ã d lµ sè tù
nhiªn. Râ rµng ®iÒu kiÖn nh vËy lµ qu¸ chÆt trong thùc tÕ. Tuy nhiªn
chóng ta cã thÓ thÊy r»ng c©y kh«ng cÇn ph¶i c©n b»ng ®Õn møc hoµn
h¶o nh vËy; cã nh÷ng d¹ng c©n b»ng níi láng h¬n vÉn cho ta cÊu tróc d÷
liÖu h÷u Ých vµ gÇn víi thùc tÕ. Tríc hÕt chóng ta sÏ ®Þnh nghÜa mét sè
d¹ng ®Æc biÖt cña c©y nhÞ ph©n nh sau:
• C©y nhÞ ph©n ®óng (strict binary tree): lµ c©y nhÞ ph©n mµ nót gèc
vµ c¸c nót trung gian ®Òu cã 2 nót con.
B C
F G
A
34
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
B C
F G H
• C©y nhÞ ph©n c©n b»ng chiÒu cao (height-balanced) lµ c©y mµ t¹i
tÊt c¶ c¸c nót, chiÒu cao c©y con tr¸i vµ c©y con ph¶i chªnh lÖch
nhau kh«ng qu¸ 1.
• C©y nhÞ ph©n t×m kiÕm vµ c©n b»ng chiÒu cao ®îc gäi lµ c©y
AVL . (Do hai nhµ to¸n häc Nga G.M.Adelson Velsky vµ E.M.Landis ®a
ra vµ n¨m 1962)
Chóng ta sÏ thÊy r»ng lu«n lu«n t¹o ®îc mét c©y AVL øng víi mét tËp
d÷ liÖu bÊt kú. PhÐp t×m kiÕm vµ xen vµo trªn c©y AVL lu«n ®îc
thùc hiÖn trong thêi gian O(logn), ngay c¶ trong trêng hîp xÊu nhÊt.
ViÖc chÌn phÇn tö vµo c©y cã thÓ ph¸ vì tÝnh c©n b»ng cña c©y.
Trong trêng hîp nµy chóng ta cã thÓ thùc hiÖn phÐp biÕn ®æi ®Ó c©y
trë l¹i c©n b»ng.
35
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
VÝ dô biÓu thøc sè häc x+y*(z-t)+u/v ®îc biÓu diÔn bëi c©y nhÞ ph©n
sau:
+ /
x * u v
y -
z t
Tuy nhiªn nh chóng t«i ®· nãi ®Õn trong phÇn më ®Çu, cÊu tróc c©y
®îc t¹o ra kh«ng chØ ®Ó gi¶i quyÕt vÊn ®Ò thao t¸c vµ xö lý c¸c cÊu tróc
d÷ liÖu cã d¹ng c©y mµ nã cßn cã nhiÒu øng dông kh¸c, thÝ dô trong kü
thuËt nÐn sè liÖu. ThËm chÝ nh ta sÏ thÊy, c©y cã thÓ dïng ®Ó cµi ®Æt
hµng ®îi cã ®é u tiªn hay c¶ danh s¸ch tæng qu¸t trong mét sè bµi to¸n
qu¶n lý c¬ së d÷ liÖu.
1 2
3 4 5 6
7 8 9
Nãi chung chóng ta cã thÓ nhËn thÊy r»ng: nÕu nót cha ®îc lu tr÷ ë
phÇn tö p cña m¶ng th× nót con tr¸i ®îc lu tr÷ ë phÇn tö 2p+1 vµ
nót con ph¶i ®îc lu tr÷ ë phÇn tö 2p+2. Víi c©y nhÞ ph©n bÊt kú cã n
nót th× vÒ nguyªn t¾c ta vÉn cã thÓ lu tr÷ c¸c nót trong m¶ng cì n. Tuy
nhiªn ta rÊt khã ®a ra mét quy luËt ®¸nh sè hîp lý ®Ó khái nhÇm lÉn.
Trong trêng hîp nµy ngêi ta thªm c¸c nót gi¶ ®Ó c©y nhÞ ph©n trë thµnh
36
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
gÇn ®Çy vµ ¸p dông c¸ch ®¸nh sè trªn ®©y ®Ó cµi ®Æt. Nh vËy mçi nót
sÏ ph¶i chøa thªm th«ng tin ®Ó nhËn biÕt ®ã lµ nót gi¶ hay nót thËt. Râ
rµng c¸ch cµi ®Æt nµy cho trêng hîp c©y tæng qu¸t rÊt l·ng phÝ bé nhí.
C¸ch cµi ®Æt theo kiÓu liªn kÕt dïng cÊp ph¸t bé nhí ®éng tá ra phï hîp
h¬n. Mçi nót ngoµi th«ng tin h÷u Ých sÏ cã thªm 2 trêng ®Þa chØ trá tíi
nót con tr¸i vµ nót con ph¶i. Ngoµi ra cã mét con trá proot trá tíi nót gèc
lµm ®iÓm xuÊt ph¸t.
• Pretrav: duyÖt c©y theo thø tù tríc (NLR - Node Left Right) hay cßn ®-
îc gäi lµ duyÖt c©y theo ®é s©u.
§Çu tiªn chóng ta th¨m (visit) nót gèc.
Sau ®ã duyÖt nh¸nh c©y con tr¸i theo phÐp duyÖt pretrav.
Cuèi cïng duyÖt nh¸nh c©y con ph¶i theo phÐp duyÖt pretrav.
• Intrav: duyÖt c©y theo thø tù gi÷a (LNR - Left Node Right)
DuyÖt nh¸nh c©y con tr¸i theo phÐp duyÖt intrav.
Th¨m (visit) nót gèc.
Cuèi cïng duyÖt nh¸nh c©y con ph¶i theo phÐp duyÖt intrav.
• Posttrav: duyÖt c©y theo thø tù sau (LRN - Left Right Node)
DuyÖt nh¸nh c©y con tr¸i theo phÐp duyÖt posttrav.
DuyÖt nh¸nh c©y con ph¶i theo phÐp duyÖt posttrav.
Th¨m (visit) nót gèc.
• Breadthtrav: duyÖt c©y theo bÒ réng tøc lµ duyÖt c©y theo møc
DuyÖt c¸c nót tõ tr¸i qua ph¶i, b¾t ®Çu tõ møc 0, møc 1, 2, ...
Sau ®©y lµ thø tù c¸c nót trong c¸c phÐp duyÖt c©y nhÞ ph©n ë h×nh
3.8.
NLR: ABDEC A
LNR: DBEAC
LRN: DEBCA B C
Breadth: ABCDE
D E
3.4.2. Cµi ®Æt c©y nhÞ ph©n b»ng ph¬ng ph¸p liªn kÕt
• Khai b¸o cÊu tróc c©y nhÞ ph©n
Cã thÓ dïng m¶ng ®Ó cµi ®Æt c©y nhÞ ph©n. Tuy nhiªn c¸ch cµi ®Æt
nµy ngay tõ ®Çu ®· cã thÓ nh×n thÊy mét sù kh«ng têng hîp: m¶ng lµ
cÊu tróc tuyÕn tÝnh, cßn c©y th× kh«ng. Dïng ph¬ng ph¸p liªn kÕt ®Ó
cµi ®Æt c©y th× tiÕt kiÖm bé nhí vµ c¸c thao t¸c ®îc thùc hiÖn dÔ dµng
h¬n. Mçi nót trªn c©y nhÞ phÇn gåm ba thµnh phÇn: thµnh phÇn chøa
th«ng tin cã tªn lµ info, hai thµnh phÇn cßn l¹i lµ c¸c biÕn con trá left vµ
right dïng ®Ó lu ®Þa chØ cña nót con tr¸i vµ con ph¶i. VËy cÊu tróc mét
phÇn tö trªn c©y nhÞ ph©n ®îc khai b¸o lµ:
Nãi chung trêng info cã thÓ lµ trêng phøc hîp chøa nhiÒu thµnh phÇn,
nhng víi môc ®Ých lµm næi bËt b¶n chÊt cña thuËt to¸n, ta khai b¸o info
lµ sè nguyªn.
Mét c©y nhÞ ph©n sÏ ®îc x¸c ®Þnh nÕu ta biÕt ®îc ®Þa chØ nót gèc
proot cña nã. V× vËy nót gèc sÏ lµ ®èi sè ®îc truyÒn theo kiÓu tham
chiÕu cho c¸c hµm. Sau ®©y lµ mét sè hµm quan träng:
39
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
ph¶i hñy nót P ®Ó khái l·ng phÝ bé nhí. Ta ph©n ra 3 trêng hîp sau:
1. NÕu nót P cÇn xãa lµ nót l¸, ta chØ cÇn hñy nót ®ã. Trong trêng hîp
nµy nót thay thÕ (stand-for node) lµ NULL. PhÇn liªn kÕt cña nót cha
cña nót P b©y giê trá ®Õn NULL
2. Nót P cÇn xãa chØ cã mét c©y con, ta chän nót con cña nót P lµm
nót thay thÕ, t¹o l¹i mèi liªn kÕt tõ nót cha cña P víi nót thay thÕ, sau
®ã hñy nót P.
3. NÕu nót P cã 2 con. Chóng ta cã thÓ chän nót thay thÕ lµ mét trong 2
nót sau:
- Nót tr¸i nhÊt cña c©y con bªn ph¶i nót P.
- Nót ph¶i nhÊt cña c©y con bªn tr¸i nót P.
Chóng ta quy íc chän nót chän nót thay thÕ lµ nót ph¶i nhÊt cña c©y
con bªn tr¸i.
Trêng hîp 1:
A A
B C B C
40
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Trêng hîp 2:
1 1
5 2 5 3
3 2 3
2 3
Trêng hîp 3:
1 1
5 2 5 2
1 1
3 3
1 3
2 3
41
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
t¸c xãa nót x ta cÇn biÕt nót cha cña nã ®Ó ®Æt l¹i mèi liªn kÕt. V× ta
muèn tham sè fp gi÷ nguyªn gi¸ trÞ khi ra khái thñ tôc nªn ta khai b¸o
tham sè nµy theo kiÓu tham chiÕu. C¸c bíc t×m kiÕm ®îc thùc hiÖn nh
sau: b¾t ®Çu tõ nót p = nót gèc, ta so s¸nh gi¸ trÞ x víi néi dung nót p.
NÕu x trïng víi néi dung nót p th× t¸c vô t×m kiÕm kÕt thóc vµ tr¶ vÒ
®Þa chØ nót p. NÕu x kh¸c p->info th× ta ®Æt fp = p ®Ó ghi l¹i ®Þa
chØ nót cha cña nót p tiÕp theo; nÕu x nhá h¬n th× ta ®Æt p = p
->left, x lín h¬n ®Æt p = p ->right. Cø nh vËy cho ®Õn khi t×m thÊy x
hoÆc p b»ng NULL th× dõng l¹i vµ kÕt luËn lµ kh«ng t×m thÊy.
node* search2(node *proot,node *&fp,int x)
{node* p=proot;fp=NULL;
while(p!=NULL)
{if(x == p->info) return(p);// tim thay
if(x < p->info) {fp=p;p = p->left;}
else
{fp=p;p = p->right;}
}
return(NULL);// khong tim thay
}
Thªm nót cã néi dung x vµo c©y t×m kiÕm b»ng ®Ö quy
Tríc hÕt ta dïng t¸c vô search ®Ó t×m kiÕm xem nót x ®· tån t¹i trªn
c©y cha, nÕu tån t¹i råi th× th«ng b¸o lµ nót ®· cã, kh«ng thªm n÷a. NÕu
nót gèc lµ NULL th× ta t¹o nót gèc míi vµ g¸n néi dung x cho trêng info
cña gèc nµy. NÕu gèc kh¸c rçng vµ x nhá h¬n néi dung nót gèc th× ta ¸p
dông thao t¸c thªm x b»ng ph¬ng ph¸p ®Ö quy vµo c©y con tr¸i, ngîc
l¹i th× thªm nót b»ng ph¬ng ph¸p ®Ö quy vµo c©y con ph¶i.
void insert(node* &proot,int x)
{if(proot==NULL) {proot=makenode(x); return;}
if(search(proot,x))
{cout<<endl<<"Nut da co, khong them duoc!";return;}
if(x<proot->info) insert(proot->left,x);
else insert(proot->right,x);
}
Thªm nót cã néi dung x vµo c©y t×m kiÕm kh«ng dïng ®Ö quy
Tríc hÕt ta dïng t¸c vô search ®Ó t×m kiÕm xem nót x ®· tån t¹i trªn
c©y cha, nÕu tån t¹i råi th× th«ng b¸o lµ nót ®· cã, kh«ng thªm n÷a. B¾t
®Çu tõ nót gèc, so s¸nh gi¸ trÞ x víi néi dung nót gèc ta lu«n x¸c ®Þnh
®îc cÇn thªm x vµo nh¸nh c©y con bªn tr¸i hay bªn ph¶i, tïy thuéc vµo
kÕt qu¶ cña phÐp so s¸nh lµ x nhá h¬n hay lín h¬n néi dung nót gèc. Cø
nh vËy ta ®i ®Õn mét nót fp lµ n¬i cã thÓ thªm nót cã néi dung x. Nót
fp hoÆc lµ nót l¸, hoÆc lµ nót cßn thiÕu c©y con tr¸i hoÆc c©y con ph¶i.
NÕu x nhá h¬n néi dung nót fp th× nót thªm vµo lµ nót con tr¸i, ngîc l¹i
lµ nót con ph¶i cña fp.
void insert2(node * &proot, int x)
{if(proot==NULL) {proot=makenode(x);return;}
if(search(proot,x)) {cout<<endl<<"Nut da co, khong them
duoc!";return;}
node *fp, *p, *q; // fp la nut cha cua p, q la nut them vao
// Khoi dong cac gia tri
fp = NULL;
42
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
p = proot;
//tim nut fp, ya va fya, nut moi them vao la nut la con cua nut fp
while(p!=NULL)
{if(x<p->info)
{fp=p;p=p->left;} else {fp=p;p=p->right;}
} //end of while(p!=NULL)
/*Sau vong lap tren day thi nut p bi rong, con nut fp la nut can them
nut co noi dung x.*/
//Them nut q co noi dung x la con cua fp.
q = makenode(x);
if(x < fp->info) fp->left = q; else fp->right = q;
//Tao nut la moi co noi dung x
}
Xãa nót trªn c©y nhÞ ph©n t×m kiÕm
Tríc hÕt ta dïng thñ tôc search2 ®Ó t×m kiÕm nót x trªn c©y. NÕu
kh«ng t×m thÊy th× th«ng b¸o lµ nót kh«ng tån t¹i. Cßn nÕu t×m thÊy
th× ta cã nót fp chÝnh lµ nót cha cña nót cÇn xãa p, ta cÇn nót fp ®Ó
®Æt l¹i mèi liªn kÕt sau khi xãa.
Khi xãa nót p trªn c©y nhÞ ph©n t×m kiÕm, ta t×m mét nót ®Ó thay
thÕ nót ®ã. NÕu p lµ nót l¸ th× nót thay thÕ lµ nót NULL. NÕu p chØ cã
mét c©y con th× nót thay thÕ lµ nót con cña nã. NÕu p cã hai c©y con
th× nót thay thÕ lµ nót tr¸i nhÊt cña c©y con bªn ph¶i hoÆc nót ph¶i
nhÊt cña c©y con bªn tr¸i.Ta quy íc chän nót ph¶i nhÊt cña c©y con bªn
tr¸i.
void remove(node *&proot, int x)
{node *fp,*p,*f,*rp,*q; /*rp la nut thay the cho nut p co noi dung x,
f la nut cha cua nut thay the rp*/
p=search2(proot,fp,x); //fp la nut cha cua nut p
if(p==NULL) {cout<<"Khong tim thay nut x";return;}
//Nut la
if(p->right==NULL && p->left==NULL)
{if(p==proot) {delete proot;proot=NULL;return;}
if(fp->left==p) {fp->left=NULL;delete p;return;}
if(fp->right==p) {fp->right=NULL;delete p;return;}
};
//Nut chi co mot cay con trai
if(p->left!=NULL && p->right==NULL)
{if(fp->left==p) {fp->left=p->left;delete p;return;}
if(fp->right==p) {fp->right=p->left;delete p;return;}
}
//Nut chi co mot cay con phai
if(p->left==NULL && p->right!=NULL)
{if(fp->left==p) {fp->left=p->right;delete p;return;}
if(fp->right==p) {fp->right=p->right;delete p;return;}
};
//Nut p co 2 nut con
//Tim nut thay the, la nut phai nhat cua cay con trai
f=p;
rp=p->left;
while(rp->right!=NULL) {f=rp;rp=rp->right;}
f->right=rp->left;/*rp la phai nhat, do do khong co con phai
vi khong con rp nen nut cha phai chi den nut sau do*/
43
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
p->info=rp->info;
//doi noi dung cua p va rp, roi xoa rp
delete rp;
}
P
Q
Xoay tr¸i quanh nót
a Q P
P
c
b c a b
44
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
3.6.1. ChØ sè c©n b»ng (balance factor) cña mét nót trªn
c©y nhÞ ph©n t×m kiÕm
§Ó cã thÓ x¸c ®Þnh vÞ trÝ ®Ó xoay l¹i c©y, t¹i mçi nót ta sÏ lu tr÷ thªm
th«ng tin vÒ tÝnh c©n b»ng cña c©y ®ã. T¹i mét nót P bÊt kú ta sÏ ký
hiÖu l(P) lµ chiÒu cao cña c©y con tr¸i, r(P) lµ chiÒu cao cña c©y con
ph¶i. Ta sÏ ®Þnh nghÜa bal(P) lµ chØ sè c©n b»ng t¹i nót ®ã theo c«ng
thøc: bal(P)=r(P)-l(P)
VËy bal(P) cña mét nót bÊt kú trªn c©y AVL chØ cã thÓ nhËn mét trong 3
gi¸ trÞ 0,-1,+1, trong ®ã
bal(P) = 0 c©y gèc P c©n b»ng c¶ hai bªn (tr¸i ph¶i b»ng nhau).
bal(P) = -1 c©y gèc P lÖch tr¸i.
bal(P) = +1 c©y gèc P lÖch ph¶i.
Ghi chó. ë ®©y dÔ cã sù hiÓu nhÇm vÒ thuËt ng÷: C©y AVL ®îc coi lµ
c©n b»ng nÕu chØ sè c©n b»ng cña tÊt c¶ c¸c nót thuéc tËp hîp {-1, 0,
1}, trong khi ®ã theo c¸ch nãi trªn ®©y th× sù lÖch cã nghÜa lµ chiÒu
cao c¸c c©y bªn tr¸i vµ bªn ph¶i kh«ng b»ng nhau.
3.6.3. C©n b»ng l¹i c©y khi thªm nót
Chóng ta cã thÓ thÊy r»ng cã nh÷ng vÞ trÝ khi thªm nót c©y vÉn c©n
b»ng. Ngêi ta rót ra ®îc nh÷ng trêng hîp c©y bÞ mÊt c©n b»ng khi thªm
nót nh sau:
Trêng hîp 1: VÞ trÝ thªm nót lµ phÝa sau bªn tr¸i cña nót bÞ lÖch tr¸i
(bal(P)=-1)
P
-
0 0
0 0
H×nh 3.13.a. Khi thªm nót U c©y con sÏ mÊt c©n b»ng.
Trêng hîp 2: VÞ trÝ thªm nót lµ phÝa sau bªn ph¶i cña nót bÞ lÖch ph¶i
(bal(P)=+1)
45
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
P
1
0 0
0 0
H×nh 3.13.b. Khi thªm nót U c©y con sÏ mÊt c©n b»ng.
Thùc hiÖn phÐp xoay c©y ®Ó c©n b»ng l¹i c©y:
Mét ®iÒu kh¸ lý thó xÈy ra khi thªm nót vµo c©y AVL, lµ mÆc dï viÖc
thªm nót x vµo c©y cã thÓ g©y ra mét lo¹t vÞ trÝ mÊt c©n b»ng trªn ®-
êng ®i tõ nót gèc ®Õn vÞ trÝ chÌn nót x, nhng ta l¹i chØ cÇn c©n b»ng
nh¸nh c©y con cã gèc s ë vÞ trÝ cuèi cïng cã thÓ mÊt c©n b»ng trªn ®-
êng ®i tõ gèc ®Õn x. Lý do lµ v× nh ta sÏ thÊy, sau khi thªm nót x vµ
thùc hiÖn thao t¸c c©n b»ng ta thÊy nh¸nh c©y con s cã chiÒu cao
®óng b»ng chiÒu cao cña nã tríc khi chÌn x. Do ®ã viÖc chÌn x kh«ng lµm
¶nh hëng ®Õn ®é cao cña c¸c c©y con trªn ®êng tõ gèc ®Õn x.
Ta gäi s lµ nót tríc gÇn nhÊt (cña nót x) bÞ mÊt c©n b»ng do thªm nót
x. Cã 2 trêng hîp:
- Tríc khi thªm nót x bal(s)=-1 vµ nót l¸ x thªm vµo lµ nót sau bªn tr¸i cña
s. (Xem h×nh 3.14.a)
x s -
s
1 0
C
chiÒ
A B u cao
n
chiÒ chiÒ
u cao u cao
n n
H×nh 3.14.a. Nh¸nh c©y con nót gèc s tríc khi thªm nót.
46
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
- Tríc khi thªm nót x bal(s) = +1 vµ nót l¸ x thªm vµo lµ nót sau bªn ph¶i
cña s. (Xem h×nh 3.14.b)
s 1 x
A 0 s1
chiÒ
u cao B C
n chiÒ chiÒ
u cao u cao
n n
H×nh 3.14.b. Nh¸nh c©y con gèc s tríc khi thªm nót.
V× 2 trêng hîp trªn lµ t¬ng tù nªn chóng ta chØ kh¶o s¸t trêng hîp 1,
tøc lµ c©y s bÞ lÖch tr¸i.
Chóng ta cã thÓ thÊy ba c©y A, B vµ C cã chiÒu cao nh nhau vµ
b»ng n. NÕu c©y rçng ta ®Æt n=-1. Gäi s1 lµ con tr¸i cña s, ta xÐt c¸c
trêng hîp sau:
Trêng hîp a: C©y gèc s1 lÖch tr¸i, tøc lµ lÖch cïng phÝa víi s.
s
- 0
s1
Xoay ph¶i nót s quanh nót
s
s1 - c 0
n
a
a b b c
n n
x
x
s s
- -
s s2
C C
1 1 chiÒ
Xoay tr¸i nót 0 chiÒ
s1 s
s u cao B2 u cao
A 2 n
1
chiÒ n
B1
chiÒ
B1 B2 A chiÒ u
u cao chiÒ cao
chiÒ chiÒ u
n u cao
u u cao
cao cao n
47
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
x
x
48
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
B1 B2
A chiÒ chiÒ C
chiÒ u u chiÒ
u cao cao cao u cao
n n
x
s s
- -
s1 1 - s C
C Xoay tr¸i nót 2
s2 s1 0 chiÒ
1
chiÒ s B2 u cao
A u cao 1 chiÒ n
n B1
chiÒ B1 B2 A chiÒ u
u cao chiÒ chiÒ chiÒ cao
u
n u u u cao cao
cao cao n x
x
s2
0
Xoay ph¶i nót s
- s1 0 s
B2
A
B1
chiÒ C
chiÒ chiÒ
chiÒ u
u u cao
u cao cao
cao n
n x
Còng nh trong trêng hîp a, sau c¸c phÐp xoay c©y, nót s, s1, s2 ®·
c©n b»ng. H¬n n÷a ta cã thÓ thÊy chiÒu cao cña c©y s2 lµ n+1, tøc lµ
®óng b»ng chiÒu cao cña c©y s tríc khi chÌn nót x. Tõ ®©y ta suy ra
r»ng hÖ sè c©n b»ng cña c¸c nót tríc nót s ®Òu gi÷ nguyªn nh tríc khi
chÌn x.
B¶ng sau ®©y ph©n biÖt c¸c trêng hîp c©y bÞ mÊt th¨ng b»ng khi
thªm nót vµ c¸c phÐp xoay c©y t¬ng øng ®Ó c©n b»ng l¹i c©y:
Trêng hîp 1: C©y gèc s vèn lÖch tr¸i.
Trêng Tríc khi Sau khi C¸c phÐp xoay vµ chØ sè
hîp thªm nót thªm nót x c©n b»ng míi
x
49
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
a bal(s) = bal(s)=-2 Xoay ph¶i nót s
-1 bal(s1)= bal(s) = 0, bal(s1) = 0
bal(s1)= -1
0
b1 bal(s) = bal(s)= -2 Xoay kÐp:
-1 bal(s1)= 1. Xoay tr¸i nót s1
bal(s1) = +1 2. Xoay ph¶i nót s
0 bal(s2)=-1 bal(s)=+1,bal(s1) =
bal(s2)=0 0,bal(s2)=0
b2 bal(s) = bal(s)= -2 Xoay kÐp:
-1 bal(s1)= 1. Xoay tr¸i nót s1
bal(s1) = +1 2. Xoay ph¶i nót s
0 bal(s2)=+ bal(s)=0,bal(s1) = -1,
bal(s2)=0 1 bal(s2)=0
Nh vËy khi thªm nót vµo c©y AVL nÕu c©y mÊt c©n b»ng th× ta chØ
cÇn c©n b»ng côc bé b»ng c¸ch xoay ®¬n hay xoay kÐp c©y con cã nót
gèc s.
Ta cã thÓ tãm t¾t l¹i qu¸ tr×nh chÌn vµ c©n b»ng c©y mét c¸ch
®¬n gi¶n nh sau:
XuÊt ph¸t tõ gèc theo ®êng ®i D, ta t×m ®îc vÞ trÝ chÌn nót x. Sau
khi chÌn x ta lÇn trë l¹i ®êng ®i tõ x trë vÒ gèc vµ tÝnh l¹i hÖ sè cÇn
b»ng vµ dõng l¹i ë nót s ®Çu tiªn cã hÖ sè c©n b»ng -2 (lÖch tr¸i)
hoÆc 2 (lÖch ph¶i). Gäi s1 lµ con cña s n»m trªn ®êng ®i D. DÜ
nhiªn lµ hÖ sè c©n b»ng cña s1 kh«ng thÓ lµ 0. NÕu s lÖch cïng phÝa
víi s1 th× chØ cÇn xoay c©y s theo nguyªn t¾c: lÖch tr¸i th× xoay
50
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
ph¶i vµ ngîc l¹i. Cßn nÕu s1 lÖch kh¸c phÝa th× tríc hÕt ph¶i xoay s1,
sau ®ã xoay s.
s 0
a c
n n
Trêng hîp 2:
Tríc khi xo¸ nót bal(s) = 0, tøc lµ c©y kh«ng bÞ lÖch. Sau khi xãa nót
th× bal(s)= -1, c©y vÉn c©n b»ng vµ chiÒu cao cña c©y kh«ng bÞ gi¶m,
do ®ã kh«ng ¶nh hëng ®Õn c¸c nót ®øng tríc, gi¶i thuËt kÕt thóc.
s -
a c
n-
n
1
51
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Trêng hîp 3:
Tríc khi xãa nót trªn nh¸nh c©y bªn ph¶i th× c©y lÖch tr¸i. Xãa nót xong
th× c©y bªn ph¶i gi¶m ®i 1, do ®ã chØ sè c©n b»ng cña nót s sÏ b»ng
-2. Ta ph¶i c©n b»ng l¹i. Tuy nhiªn kh¸c víi trêng hîp thªm nót, trong trêng
hîp nµy chiÒu cao cña c©y bÞ gi¶m nªn cã thÓ ¶nh hëng d©y chuyÒn
®Õn c¸c nót ®øng tríc.
Trêng hîp a: bal(s1)=0.
s
- Xoay ph¶i nót s quanh nót +
s1 s1
s
s1 0 c -
n-
1
a
a b n b c
n n n n-
1
s
- Xoay ph¶i nót s quanh nót 0
s1 s1
s
s1 - c 0
n-
1
a
a b n b c
n n- n- n-
1 1 1
s s
- -
s C s2 C
1
1 chiÒ Xoay tr¸i nót
s 0 chiÒ
0 s u cao s1 B2 u cao
A 2 n-1
1
chiÒ n-1
B1
chiÒ
B1 B2 A chiÒ u
u cao chiÒ cao
chiÒ chiÒ u
n-1 u cao
u u cao
cao cao n-1
52
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
0 s1 0
s
B1 B2
A chiÒ chiÒ C
chiÒ u u
u cao cao cao n-1
n-1
s s
- -
s C s2 C
1
1 chiÒ Xoay tr¸i nót
s 0 chiÒ
s u cao s1 B2 u cao
A 2 n-1
1
chiÒ n-1
B1
chiÒ
B1 B2 A chiÒ u
u cao chiÒ cao
chiÒ chiÒ u
n-1 u cao
u u cao
cao cao n-1
53
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
0 s2
Xoay ph¶i nót s
0 s1 1
s
B1 B2
A chiÒ chiÒ C
chiÒ u u
u cao cao cao n-1
n-1
s s
- -
s 1 C s2 C
1 chiÒ Xoay tr¸i nót - chiÒ
s
1 s u cao s1 B2 u cao
A 2 n-1
1
chiÒ n-1
B1
chiÒ
B1 B2 A chiÒ u
u cao chiÒ cao
chiÒ chiÒ u
n-1 u cao
u u cao
cao cao n-1
- s1 0
s
B1 B2
A chiÒ chiÒ C
chiÒ u u
u cao cao cao n-1
n-1
Nh ta cã thÓ thÊy ë trªn, cã kh¸ nhiÒu trêng hîp sau khi ®¹t ®îc sù c©n
b»ng th«ng qua phÐp xoay, th× ®é cao cña c©y bÞ thay ®æi, tøc lµ bÞ
thÊp h¬n tríc. Sù thÊp h¬n nµy sÏ ¶nh hëng ®Õn c¸c nót ®øng tríc, v×
vËy sau khi c©n b»ng xong c©y con ta l¹i ph¶i xÐt ®Õn c©y cha vµ c©n
b»ng c©y cha. Qu¸ tr×nh sÏ dõng l¹i khi ta gÆp mét trêng hîp sau khi c©n
b»ng th× c©y kh«ng bÞ thÊp ®i.
54
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Thay cho viÖc x¸c ®Þnh ®é cao trong trêng hîp xÊu nhÊt, tøc lµ cho tr-
íc n ta cÇn ph¶i x¸c ®Þnh ®é cao h trong trêng hîp xÊu nhÊt lµ bao
nhiªu, ta sÏ x¸c ®Þnh sè nhá nhÊt c¸c ®Ønh mµ c©y AVL cã ®é cao h
ph¶i cã. Gäi Th lµ c©y cã ®é cao h víi sè ®Ønh nhá nhÊt, vµ ta gäi D h lµ
sè ®Ønh t¬ng øng. Nh vËy víi h cè ®Þnh cã thÓ cã nhiÒu c¸ch tæ chøc
c©y nhng Dh lµ mét sè kh«ng ®æi. Khi ®ã mét trong 2 c©y con cña nã
ph¶i cã ®é cao h-1, cßn c©y con kia cã ®é cao h-1 hoÆc h-2. Nhng v×
Th lµ c©y cã ®é cao h víi sè ®Ønh nhá nhÊt, nªn ta suy ra r»ng 2 c©y
con kia cã ®é cao lµ h-1 vµ h-2, v× nÕu c¶ 2 cã ®é cao h-1 th× ta cã
thÓ thay mét trong 2 c©y b»ng c©y cã ®é cao h-2, vÉn ®¶m b¶o yªu
cÇu AVL mµ l¹i cã sè ®Ønh nhá h¬n. B¶n th©n 2 c©y con l¹i lµ nh÷ng
c©y cã sè ®Ønh nhá nhÊt. Ta cã
§Æt Gh = Dh +1, ta cã
55
Ch¬ng 4
S¾p xÕp vµ t×m kiÕm
4.1. Më ®Çu
S¾p xÕp vµ t×m kiÕm lµ hai thao t¸c ®îc sö dông thêng xuyªn trong
c¸c øng dông tin häc. Hai thao t¸c nµy cã mèi liªn quan mËt thiÕt. Thêng
nÕu d÷ liÖu ®îc s¾p xÕp th× thao t¸c t×m kiÕm ®îc thùc hiÖn dÔ dµng
h¬n. VÝ dô nÕu mét m¶ng chøa d÷ liÖu ®îc s¾p xÕp th× ta cã thÓ ¸p
dông thuËt to¸n t×m kiÕm nhÞ ph©n cã ®é phøc t¹p tÝnh to¸n log2n,
nhanh h¬n rÊt nhiÒu so víi thuËt to¸n t×m kiÕm tuyÕn tÝnh (cã ®é phøc
t¹p tÝnh to¸n n). Hay nh c©y nhÞ ph©n t×m kiÕm ch¼ng h¹n, nhê d÷
liÖu ®îc tæ chøc theo c¸ch thøc ®Æc biÖt (khãa t¹i mçi nót lín h¬n c¸c
khãa trªn c©y con tr¸i vµ nhá h¬n c¸c khãa trªn c©y con ph¶i) nªn viÖc
t×m kiÕm chØ cÇn thùc hiÖn trªn c¸c nót theo quan hÖ cha con, nghÜa lµ
chØ cÇn ®i qua chiÒu cao cña c©y.
S¾p xÕp danh s¸ch c¸c phÇn tö theo mét thø tù t¨ng hoÆc gi¶m dÇn
theo mét khãa nµo ®ã lµ mét viÖc ®îc thùc hiÖn thêng xuyªn kh«ng
nh÷ng trong tin häc mµ c¶ trong cuéc sèng thêng ngµy. Khi niªm yÕt
danh s¸ch c¸c häc sinh thi ®ç vµo trêng ®¹i häc, ta thêng xÕp theo vÇn
a,b,c ®Ó cho c¸c thÝ sinh dÔ t×m ra tªn m×nh. C¸c tõ trong mét cuèn tõ
®iÓn còng ®îc s¾p xÕp theo thø tù a, b,c, nhê vËy chóng ta cã thÓ
nhanh chãng x¸c ®Þnh vïng chøa tõ cÇn tra, vµ dÔ dµng t×m ®îc tõ cÇn
tra cøu.
Cã thÓ thÊy r»ng kh¸i niÖm s¾p xÕp chØ ®îc sö dông cho nh÷ng tËp
hîp mµ trªn ®ã cã x¸c ®Þnh mét trËt tù tuyÕn tÝnh, nghÜa lµ gi÷a hai
phÇn tö bÊt kú bao giê còng cã thÓ nãi lµ phÇn tö nµo ®øng tríc, phÇn tö
nµo ®øng sau. Nh vËy tËp hîp cã thÓ thùc hiÖn s¾p xÕp tríc hÕt ph¶i lµ
mét d·y c¸c phÇn tö hay lµ mét cÊu tróc danh s¸ch (Ýt nhÊt lµ vÒ mÆt
logic, vÝ dô sinh viªn trong mét líp cã thÓ ngåi kh«ng theo mét tr×nh tù
nµo, nhng nÕu ta ®¸nh sè c¸c sinh viªn th× l¹i t¹o thµnh danh s¸ch). Nh
thÕ ta lu«n cã thÓ g¸n chØ sè cho mçi phÇn tö, vÝ dô phÇn tö ®øng tríc
tÊt c¶ c¸c phÇn tö kh¸c lµ a 0, phÇn tö tiÕp theo lµ a1, ...Khi ta dïng m¶ng
®Ó cµi ®Æt danh s¸ch th× c¸c chØ sè lµ têng minh, nghÜa lµ chóng còng
chØ vÞ trÝ trong m¶ng vµ cã thÓ truy xuÊt trùc tiÕp. Cßn nÕu danh s¸ch
®îc cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt trong bé nhí hay cµi ®Æt trªn tÖp
ë bé nhí ngoµi, hoÆc thËm chÝ lµ cÊu tróc c©y víi phÐp duyÖt nµo ®ã
th× kh«ng thÓ sö dông chØ sè ®Ó truy xuÊt trùc tiÕp c¸c phÇn tö. Bµi
to¸n s¾p xÕp mét d·y c¸c phÇn tö thêng liªn quan ®Õn viÖc so s¸nh mét
hoÆc nhiÒu gi¸ trÞ khãa. Tuy nhiªn ®Ó ®¬n gi¶n, ë ®©y ta t¹m coi khãa
lµ chÝnh phÇn tö ®ã.
Ta gäi d·y c¸c phÇn tö A = (a0, a1,..., an-1) lµ ®· ®îc s¾p xÕp t¨ng dÇn
nÕu phÇn tö ®øng tríc kh«ng lín h¬n phÇn tö ®øng sau, tøc lµ nÕu i<j
th× ai≤ aj. T¬ng tù d·y A ®îc gäi lµ gi¶m dÇn nÕu phÇn tö ®øng tríc
kh«ng bÐ h¬n phÇn tö ®øng sau.
Bµi to¸n s¾p xÕp mét d·y A lµ qu¸ tr×nh xö lý biÕn ®æi vÞ trÝ c¸c
phÇn tö trong d·y sao cho tõ d·y ban ®Çu thêng cha ®îc s¾p xÕp trë
thµnh ®îc s¾p xÕp. Gi¶ sö ta ®ang quan t©m ®Õn viÖc s¾p xÕp theo
thø tù t¨ng dÇn. Khi ®ã râ rµng víi mäi cÆp bÊt kú (a i, aj) víi i<j th× ai≤ aj.
Ta gäi cÆp nh thÕ nµy lµ cÆp s¾p thuËn. NÕu mét d·y cha ®îc s¾p th×
sÏ tån t¹i nh÷ng cÆp kh«ng thuËn, nghÜa lµ i<j nhng ai> aj. Ta gäi cÆp
nh thÕ nµy lµ cÆp s¾p ngîc hay nghÞch thÕ. Kh¸i niÖm nµy sÏ ®îc dïng
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
nhiÒu trong c¸c bµi to¸n s¾p xÕp.
Trong khoa häc m¸y tÝnh cã hai lo¹i gi¶i thuËt s¾p xÕp ®îc dïng phæ
biÕn lµ s¾p xÕp néi (hay cßn gäi lµ s¾p xÕp trong) vµ s¾p xÕp ngo¹i
(hay cßn gäi lµ s¾p xÕp ngoµi).
- S¾p xÕp trong lµ toµn bé d÷ liÖu cÇn s¾p xÕp ®îc ®a vµo bé nhí, nhê
vËy tèc ®é s¾p xÕp ®îc thùc hiÖn nhanh nhng kÝch thíc d÷ liÖu bÞ h¹n
chÕ theo dung lîng bé nhí.
- S¨p xÕp ngoµi lµ chØ mét phÇn d÷ liÖu cÇn s¾p xÕp ®îc ®a vµo bé
nhí, phÇn cßn l¹i ®îc lu ë bé nhí ngoµi. Tèc ®é s¾p xÕp ®îc thùc hiÖn
chËm h¬n s¾p xÕp trong nhng kÝch thíc d÷ liÖu cã thÓ rÊt lín.
Sau ®©y chóng ta nghiªn cøu c¸c gi¶i thuËt s¾p xÕp trong, vµ ta gi¶
thiÕt lµ ta cÇn s¾p xÕp danh s¸ch A= (a 0, a1,..., an-1) theo thø tù t¨ng
dÇn. C¸c thuËt to¸n s¾p xÕp ®îc giíi thiÖu sau ®©y ®îc cµi ®Æt trong
ch¬ng tr×nh 41SapXep.CPP.
- LÇn chän 0: T×m nót nhá nhÊt trong kho¶ng tõ 0 ®Õn n-1 b»ng c¸ch
®Æt gi¸ trÞ nhá nhÊt t¹m thêi b»ng a0, sau ®ã duyÖt tõ 1
®Õn n-1, thùc hiÖn n-1 lÇn so s¸nh ®Ó x¸c ®Þnh vÞ trÝ nót
nhá nhÊt, thÝ dô ®ã lµ vÞ trÝ k0, sau ®ã ®æi gi¸ trÞ 2 nót
t¹i vÞ trÝ 0 vµ k0 .
- LÇn chän 1: T×m nót nhá nhÊt trong kho¶ng tõ 1 ®Õn n-1 b»ng c¸ch
®Æt gi¸ trÞ nhá nhÊt t¹m thêi b»ng a1, sau ®ã duyÖt tõ 2
®Õn n-1, thùc hiÖn n-2 lÇn so s¸nh ®Ó x¸c ®Þnh vÞ trÝ nót
nhá nhÊt, thÝ dô ®ã lµ vÞ trÝ k1, sau ®ã ®æi gi¸ trÞ 2 nót
t¹i vÞ trÝ 1 vµ k1 .
...
- LÇn chän i: T×m nót nhá nhÊt trong kho¶ng tõ i ®Õn n-1 b»ng c¸ch
®Æt gi¸ trÞ nhá nhÊt t¹m thêi b»ng ai, sau ®ã duyÖt tõ i+1
®Õn n-1, thùc hiÖn n-i lÇn so s¸nh ®Ó x¸c ®Þnh vÞ trÝ nót
nhá nhÊt, thÝ dô ®ã lµ vÞ trÝ ki, sau ®ã ®æi gi¸ trÞ 2 nót
t¹i vÞ trÝ i vµ ki .
....
- LÇn chän n-2 (lÇn chän cuèi): T×m nót nhá nhÊt trong kho¶ng tõ n-2
®Õn n-1 b»ng c¸ch so s¸nh an-2 vµ an-1 x¸c ®Þnh vÞ trÝ nót
nhá h¬n, thÝ dô ®ã lµ vÞ trÝ kn-2, sau ®ã ®æi gi¸ trÞ 2 nót
t¹i vÞ trÝ n-2 vµ kn-2 (kn-2 cã thÓ lµ n-2 hoÆc n-1)
i=1 1 2 14 13 12 11
1 2 14 13 12 11
i=2 1 2 14 13 12 11
1 2 11 13 12 14
Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Selection sort:
c. Mét d¹ng t¬ng tù selection sort: ph¬ng ph¸p ®æi chç trùc
tiÕp
§èi víi c¸c b¹n sinh viªn míi lµm quen víi thuËt to¸n, cã thÓ ph¬ng ph¸p lùa
58
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
chän ®¬n gi¶n vÉn h¬i khã hiÓu. Cã mét d¹ng t¬ng tù thuËt to¸n nµy nh-
ng dÔ hiÓu h¬n, lµ ph¬ng ph¸p ®æi chç trùc tiÕp nh sau:
Víi mçi i (i = 0,1,2,...,n-2) ta còng biÕn ®æi d·y khãa Ai = (ai, ai+1,..., an-
1) sao cho ai lµ khãa nhá nhÊt. Thay v× xuÊt ph¸t tõ i råi t×m vÞ trÝ k
sao cho ak cã gi¸ trÞ nhá nhÊt trong d·y con Ai, sau ®ã chØ cÇn ®æi ak
cho ai (®æi mét lÇn), ta l¹i xuÊt ph¸t tõ j=i+1 vµ mçi lÇn nhËn thÊy aj <
ai th× ta l¹i ®æi hai vÞ trÝ nµy. Nh vËy cã thÓ ph¶i qua rÊt nhiÒu lÇn ®æi
chç ta míi cã ®îc d·y Ai tháa m·n ®iÒu kiÖn trªn. Nh vËy cho dï thuËt to¸n
nµy còng cã ®é phøc t¹p tÝnh to¸n n2 nh ph¬ng ph¸p lùa chän ®¬n
gi¶n, nhng trong thùc tÕ ta ph¶i thùc hiÖn nhiÒu phÐp tÝnh h¬n. Trong
trêng hîp c¸c phÇn tö cã cÊu tróc phøc t¹p chøa nhiÒu lo¹i th«ng tin th×
viÖc ®æi chç rÊt tèn thêi gian vµ bé nhí. Sau ®©y lµ ®o¹n ch¬ng tr×nh
cµi ®Æt thuËt to¸n ®æi chç trùc tiÕp:
void selectsort2(float a[],int N)
{int i,j;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(a[j]<a[i]) swap(a[i],a[j]);
}
Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Bubble Sort:
NhËn xÐt: Gi¶i thuËt Bubble Sort tèt h¬n Selection sort vµ tËn dông ®îc
t×nh huèng d·y ®· ®îc s¾p xÕp hay gÇn s¾p xÕp: d·y cµng gÇn ®îc
s¾p xÕp th× cÇn cµng Ýt phÐp tÝnh. §Æc biÖt nÕu d·y ®· ®îc s¾p xÕp
th× chØ cÇn n-1 lÇn so s¸nh, nghÜa lµ nÕu d·y ®· s¾p th× thêi gian thùc
hiÖn cã bËc O(n).
60
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Bubble Sort cã c¶i tiÕn:
NhËn xÐt: Gi¶i thuËt Bubble Sort c¶i tiÕn tèt h¬n Bubble Sort th«ng th-
êng, do ®ã tèt h¬n Selection sort.
NhËn xÐt:
Insertion sort lµ ph¬ng ph¸p dÔ hiÓu, dÔ cµi ®Æt. MÆc dÇu thêi gian
thùc hiÖn gi¶i thuËt cã bËc O(n2) nhng trong vµi trêng hîp c¶i tiÕn, thuËt
to¸n nµy cã thêi gian thùc hiÖn nhanh h¬n selection sort. §Æc biÖt khi
danh s¸ch gÇn ®îc s¾p xÕp th× thêi gian tÝnh to¸n sÏ Ýt h¬n nhiÒu, nhÊt
lµ trong trêng hîp danh s¸ch ®· s¾p xÕp th× thuËt to¸n cã bËc O(n).
61
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
s¸ch ®· s¾p xÕp a[0], a[1],...,a[i-1]. DÜ nhiªn lµ ta ph¶i t×m mét vÞ trÝ
thÝch hîp trong d·y nµy. NÕu a[i-1]<a[i] th× kh«ng cÇn lµm g× n÷a v×
a[i] ®· ë ®óng vÞ trÝ. NÕu kh«ng ta t×m mét vÞ trÝ mµ a[j-1]<x<a[j]. Lóc
nµy ta kÐo a[j] sang bªn ph¶i mét vÞ trÝ råi míi chÌn x vµo vÞ trÝ a[j]. V×
danh s¸ch cã tÝnh tuyÕn tÝnh nªn viÖc kÐo sang ph¶i mét phÇn tö nµo
®ã sÏ g©y nªn ph¶n øng d©y chuyÒn. Do ®ã mét c¸ch hîp lý h¬n lµ
trong qu¸ tr×nh t×m kiÕm vÞ trÝ chÌn x=a[i], ta kÐo c¸c phÇn tö lín h¬n x
sang ph¶i mét vÞ trÝ. §ã lµ vßng lÆp:
j=i; while(j>0 &&x<a[j-1]) {a[j]=a[j-1];j--;};
Sau vßng lÆp nµy th× ta cã a[j-1]<x vµ nh vËy a[j] chÝnh lµ vÞ trÝ thÝch
hîp ®Ó chÌn x (gi¸ trÞ cña a[j] ®· ®îc dÞch sang ph¶i tríc ®ã. Sau ®©y lµ
hµm m« t¶ thao t¸c s¾p xÕp b»ng ph¬ng ph¸p chÌn ®¬n gi¶n:
62
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
NhËn xÐt:
Shell Sort hiÖu qu¶ h¬n selection sort, bubble sort, insertion sort nh-
ng kÐm hiÖu qu¶ h¬n Quick sort vµ Heap sort.
63
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
Chän mét nót bÊt kú trong danh s¸ch lµm nót trôc (pivot node), th«ng
thêng lµ nót ®Çu tiªn. Ta sÏ thùc hiÖn mét sè thao t¸c ®Ó chuyÓn nót
trôc ®Õn vÞ trÝ thÝch hîp trong d·y (gäi lµ vÞ trÝ pivot) sao cho c¸c
phÇn tö bªn tr¸i nót trôc ®Òu ≤ nót trôc, c¸c nót bªn ph¶i ®Òu > nót
trôc. Ta cã thÓ thùc hiÖn ®iÒu nµy b»ng c¸ch nh sau:
(1) Gi¶ sö low lµ vÞ trÝ ®Çu danh s¸ch, up lµ vÞ trÝ cuèi danh s¸ch. Ta
chän a[low] lµm nót trôc, tøc lµ pivotval = a[low].
(2) QuÐt tõ low lªn: con trá i xuÊt ph¸t tõ vÞ trÝ low t¨ng dÇn vÒ
phÝa up, dõng l¹i khi gÆp nót ®Çu tiªn > pivotval, ghi nhËn vÞ trÝ
nµy.
(3) QuÐt tõ up xuèng: con trá j xuÊt ph¸t tõ vÞ trÝ up gi¶m dÇn vÒ
phÝa low, dõng l¹i khi gÆp nót ®Çu tiªn ≤ pivotval, ghi nhËn vÞ
trÝ nµy.
(4) NÕu i<j th× ®æi gi¸ trÞ 2 nót t¹i 2 vÞ trÝ i vµ j. Sau khi ®æi
xong ta cã a[i]<=pivotval vµ a[j]>pivotval, chuyÓn sang bíc
(5).
NÕu i>j th× chuyÓn sang bíc (6) (i kh«ng thÓ b»ng j, v× i t¬ng
øng víi nót ≤ nót trôc, cßn j t¬ng øng víi nót > nót trôc.
(5) Cho i ch¹y tiÕp vÒ phÝa up, vµ j ch¹y tiÕp vÒ phÝa low, tøc lµ
thùc hiÖn c¸c bíc (2), (3), (4) víi c¸c vÞ trÝ xuÊt ph¸t lµ i vµ j.
(6) Ta dõng l¹i khi i>j. Lóc nµy cã thÓ thÊy r»ng c¸c nót tõ vÞ trÝ j trë
vÒ tríc ®Òu ≤ pivotval, cßn c¸c nót phÝa ph¶i j , tøc lµ c¸c nót tõ
j+1 vÒ phÝa sau ®Òu > pivotval.
(7) Ta trao ®æi gi¸ trÞ 2 nót a[low] vµ a[j] ®Ó chuyÓn nót trôc
®Õn ®óng vÞ trÝ trong d·y.
Sau bíc ®Çu tiªn danh s¸ch ®îc chia lµm 2 phÇn, trong ®ã nót trôc ®·
ë ®óng vÞ trÝ. Ta tiÕp tôc ph©n ho¹ch 2 danh s¸ch con gåm c¸c phÇn
tö tõ vÞ trÝ 0 ®Õn pivot-1 vµ tõ pivot+1 ®Õn up. Cø tiÕp tôc
ph©n ho¹ch cho ®Õn khi danh s¸ch con chØ gåm 2 nót, ta ®æi chç
nÕu cÇn thiÕt. Lóc nµy ta cã danh s¸ch ®· s¾p xÕp.
NhËn xÐt: Theo c¸ch m« t¶ trªn gi¶i thuËt Quicksort cã tÝnh ®Ö quy. Do
®ã ngêi ta thêng cµi ®Æt Quicksort b»ng ®Ö quy hoÆc b»ng stack.
64
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
danh s¸ch con.
Víi 21 = 2 danh s¸ch tiÕp theo cÇn 2m-1 lÇn so s¸nh trong mçi
danh s¸ch con.
...
Víi 2m-1 = n/2 danh s¸ch cuèi cïng cÇn 2 lÇn so s¸nh trong mçi danh
s¸ch con.
Tæng sè lÇn ®æi chç lu«n nhá h¬n tæng sè lÇn so s¸nh, vËy thuËt
to¸n Quicksort cã ®é phøc t¹p tÝnh to¸n lµ nlog 2n trong trêng hîp tèt
nhÊt.
Trêng hîp xÊu nhÊt lµ nót trôc khi nµo còng ë ®Çu hay cuèi danh s¸ch,
thÝ dô trêng hîp danh s¸ch ®· ®îc s¾p xÕp. Lóc nµy ta cã:
Víi danh s¸ch ban ®Çu cÇn n-1 lÇn so s¸nh.
Víi danh s¸ch con tiÕp theo cÇn n-1 lÇn so s¸nh.
...
Víi danh s¸ch cuèi cïng cÇn 1 lÇn so s¸nh.
Tæng sè lÇn so s¸nh lµ: (n-1)+(n-2)+...+2+1 = n(n-1)/2 = O(n2)
NhËn xÐt:
Quicksort phøc t¹p nhng hiÖu qu¶ h¬n c¸c thuËt to¸n võa nªu trªn.
Quicksort thÝch hîp cho danh s¸ch ban ®Çu cha cã thø tù.
Quicksort kÐm hiÖu qu¶ khi danh s¸ch ban ®Çu gÇn cã thø tù. §Æc biÖt
trêng hîp xÊu nhÊt l¹i lµ trêng hîp danh s¸ch ®· ®îc s¾p thø tù.
Ta chän gi¸ trÞ pivotval = a[0] = 3. Cho low = 0, up = 4. Cho i xuÊt ph¸t
tõ low, dÞch chuyÓn qua ph¶i, ®i qua c¸c vÞ trÝ mµ a[i] ≤ pivotval vµ
dõng l¹i vÞ trÝ ®Çu tiªn mµ ®iÒu nµy kh«ng ®óng, tøc lµ a[i] > pivotval.
VÞ trÝ nµy chÝnh lµ a[1]=7. TiÕp theo, cho j xuÊt ph¸t tõ up, dÞch
chuyÓn qua tr¸i, ®i qua c¸c vÞ trÝ mµ a[j] > pivotval vµ dõng l¹i vÞ trÝ
®Çu tiªn mµ ®iÒu nµy kh«ng ®óng, tøc lµ a[i] ≤ pivotva. VÞ trÝ nµy
chÝnh lµ a[3]=1. Ta ®æi chç hai vÞ trÝ cho nhau vµ ®îc kÕt qu¶ nh h×nh
sau:
a0 a1 a2 a3 a4
3 7 2 1 6
3 1 2 7 6
v× i<j nªn ta l¹i dÞch chuyÓn tiÕp: i sang ph¶i cßn j sang tr¸i vµ ®îc kÕt
qu¶ lµ: i dõng l¹i ë vÞ trÝ a[3], cßn j dõng l¹i ë vÞ trÝ a[2]. Ta thÊy r»ng vÞ
trÝ pivot chÝnh lµ 2.
a0 a1 a2 a3 a4
3 1 2 7 6
B©y giê ta ®æi chç a[low] víi a[pivot], tøc lµ a[0] víi a[2] vµ ®îc:
a0 a1 a2 a3 a4
2 1 3 7 6
Nh vËy a[pivot] ®· ®øng ë vÞ trÝ ®óng trong d·y, nghÜa lµ a[2] ®· nhËn
gi¸ trÞ thÝch hîp vµ kh«ng cÇn thay ®æi sau nµy. C«ng viÖc tiÕp theo lµ
ph¶i s¾p xÕp hai d·y con n»m bªn tr¸i vµ bªn ph¶i vÞ trÝ nµy.
void partition(float a[],int low,int up,int& pivot)
{int pivotval=a[low];//Chon nut dau lam truc
int i=low;
int j=up;
while(i<j) //Bat dau quet
{while(a[i]<=pivotval && i<up) i++; //a[i]>pivotval
while(a[j]>pivotval) j--; //a[j]<=pivotval
if(i<j) swap(a[i],a[j]); //Doi cho cap nut sai vi tri
};
swap(a[low],a[j]);pivot=j;
}
66
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
if(low>=up) return;
partition(a,low,up,pivot);
quicksort(a,low,pivot-1);
quicksort(a,pivot+1,up);
}
0 30
26 24
1 2
22 20 15
3 4 5
Ta cã thÓ ®¸nh sè c¸c nót trªn heap theo tõng møc vµ theo thø tù tõ
tr¸i qua ph¶i nh h×nh 4.1.
0 1 2 3 4 5
30 26 24 22 20 15
Heap cã thÓ cµi ®Æt b»ng m¶ng mét chiÒu, nót thø k trong c¸ch
®¸nh sè trªn ®©y sÏ ®îc lu ë phÇn tö k cña m¶ng. Gäi f lµ nót cha cña
nót s, ta cã mèi liªn hÖ sau:
f = (s-1)/2 trong ®ã phÐp chia ë ®©y ®îc hiÓu lµ phÐp chia sè nguyªn
trong ng«n ng÷ C, tøc lµ chØ lÊy phÇn nguyªn, thÝ dô 1 = (3-
1)/2 = (4-1)/2
Con tr¸i sl = 2f+1, con ph¶i sr = 2f+2 = sl +1.
LÇn lît chuyÓn nót gèc vÒ cuèi m¶ng vµ chØnh l¹i heap:
Bíc 1, ®Æt k = n-1: Heap cã k+1 nót lµ a0, a1,..., ak. Chóng ta sÏ xãa
khái heap phÇn tö a0 , sao cho cÊu tróc heap vÉn ®-
îc b¶o toµn. Heap b©y giê chØ cßn k nót, vµ v× vËy
vÞ trÝ ak kh«ng sö dông. Chóng ta sÏ lu tr÷ néi dung
nót a0 cña heap ban ®Çu (gåm k+1 nót) vµo vÞ
trÝ nµy. ak b©y giê trë thµnh phÇn tö lín nhÊt trong
m¶ng.
Bíc 2, ®Æt k = n-2: Heap cã k nót lµ a0, a1,..., ak-1. Chóng ta thùc hiÖn
t¬ng tù nh bíc 1. Heap cã k-1 nót, ak-1 ≤ ak trë
thµnh 2 phÇn tö lín nhÊt trong m¶ng .
...
Bíc n-2, ®Æt k = 2: Heap cã 2 nót lµ a0, a1. Chóng ta thùc hiÖn t¬ng
tù nh bíc 1. Heap chØ cßn l¹i mét nót vµ ta cã a0 ≤
a1 ≤ a2 ≤ ... ≤ ak vµ d·y ®· ®îc s¾p xÕp.
øng dông cÊu tróc heap ®Ó cµi ®Æt hµng ®îi cã ®é u tiªn:
Trong nhiÒu øng dông thùc tÕ, nhÊt lµ trong khoa häc m¸y tÝnh, c¸c
mÉu tin cã khãa thêng ®îc xö lý theo thø tù, nhng kh«ng nhÊt thiÕt theo
thø tù ®îc s¾p hoµn chØnh. Th«ng thêng c¸c mÉu tin ®îc tËp hîp l¹i råi xö
lý mÉu tin cã khãa lín nhÊt, l¹i tËp trung nhiÒu mÉu tin vµ xö lý mÉu tin cã
khãa lín nhÊt kÕ tiÕp vµ cø tiÕp tôc nh vËy. Trong ch¬ng 2 chóng ta ®·
nghiªn cøu c¸ch cµi ®Æt hµng ®îi cã ®é u tiªn b»ng m¶ng cã s¾p thø tù,
trong ®ã ph¬ng ph¸p ®îc dïng lµ ph¬ng ph¸p chÌn ®¬n gi¶n. Râ rµng
chóng ta chØ cÇn quan t©m ®Õn viÖc lÊy ra phÇn tö cã khãa lín nhÊt
(hoÆc bÐ nhÊt), chø kh«ng quan t©m ®Õn viÖc danh s¸ch ®îc s¾p thø
tù hay kh«ng. CÊu tróc heap tá ra lµ cµi ®Æt cã hiÖu qu¶ h¬n cho hµng
®îi cã ®é u tiªn. Thao t¸c chÌn phÇn tö bÊt kú vµ lÊy ra phÇn tö lín nhÊt
cã ®é phøc t¹p kho¶ng O(logn). B¹n ®äc cã thÓ viÕt ch¬ng tr×nh cµi
®Æt hµng ®îi cã ®é u tiªn b»ng heap, víi mét sè thao t¸c c¬ b¶n.
68
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
PhÇn 2: ChuyÓn dÇn c¸c nót gèc cña heap vÒ cuèi danh s¸ch ®Ó cã ®îc
danh s¸ch ®· s¾p xÕp. §Æt k = count-1, ta cã ban ®Çu heap cã
c¸c nót lµ a[0], a[1], a[2],..., a[k], trong ®ã a[0] lµ nót gèc, a[k]
lµ nót cuèi cïng. V× a[0] lµ gi¸ trÞ lín nhÊt trong d·y, nªn vÞ trÝ
®óng cña nã sau khi s¾p xÕp ph¶i ë cuèi danh s¸ch, tøc lµ vÞ trÝ
k. Do ®ã ta sÏ chuyÓn a[0] vÒ vÞ trÝ a[k], cßn c¸c nót a[1],
a[2],..., a[k] sÏ chØnh thµnh heap míi lµ a[0], a[1],..., a[k-1]. §Ó
lµm ®iÒu nµy, tríc hÕt ta dïng mét biÕn trung gian x ®Ó lu tr÷
gi¸ trÞ a[k], råi chuyÓn a[0] vÒ vÞ trÝ a[k], sau ®ã ta t×m c¸ch
chÌn x vµo heap ®óng vµo vÞ trÝ cÇn thiÕt. C¸ch dÞch chuyÓn c¸c
phÇn tö trong heap ®Ó cã chç trèng chÌn x ngîc l¹i víi c¸ch dÞch
chuyÓn c¸c phÇn tö khi t¹o heap. Khi t¹o heap ta xuÊt ph¸t tõ vÞ
trÝ k, b¾t ®Çu kÐo c¸c phÇn tö tõ vÞ trÝ cha vÒ vÞ trÝ con; cßn
khi lÊy c¸c nót tõ heap ®Ó t¹o danh s¸ch th× ta l¹i xuÊt ph¸t tõ
gèc vµ kÐo nót con vÒ phÝa cha. Nh vËy nót cha sÏ ®îc thay thÕ
b»ng max cña 3 gi¸ trÞ: x, nót con tr¸i hoÆc nót con ph¶i. ViÖc
thay thÕ kÕt thóc khi mµ x ®îc chän ®Ó thay thÕ nót cha cßn
trèng. Thùc hiÖn chuyÓn c¸c nót cña heap vÒ cuèi danh s¸ch cho
®Õn khi heap chØ cßn mét nót th× nót ®ã còng lµ nót nhá nhÊt
danh s¸ch, kh«ng cÇn dÞch chuyÓn n÷a vµ qu¸ tr×nh s¾p xÕp
kÕt thóc.
void heapsort(float a[],int N)
{/*Chuyen danh sach thanh HEAP bang cach xem khoi dau heap
gom nut
a[0], sau do lan luot chuyen cac nut a[1],a[2],...,
a[N-1] vao heap*/
int i,s,f;int x;
for(i=1;i<N;i++)
69
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
{x=a[i];//Nut can them vao HEAP, ban dau heap co mot nut a[0].
/*Insert x vao vi tri thich hop cua HEAP: xuat phat tu i, di dan ve
goc de tim mot vi tri nut cha thich hop. Vay f se giam dan*/
s=i; //s la nut con, hien tai tren heap chua co a[i]
//f=(s-1)/2 la nut cha
while(s>0 && x>a[(s-1)/2])
{a[s]=a[(s-1)/2]; //Keo nut < x xuong 1 muc
s=(s-1)/2;
};
a[s]=x; //Dien nut x vao vi tri phu hop
}; //end of for(int i=1;i<N;i++)
//Ket thuc chuyen danh sach thanh heap
//Lan luot xoa nut a[0] tren HEAP, dua ve vi tri thich hop tren ds
for(i=N-1;i>0;i--)
{x=a[i];a[i]=a[0];
/*O buoc i heap co i+1 nut, la a[0], a[1],...,a[i]
Muc dich cua chung ta la dua nut a[0] ve vi tri a[i],
dong thoi, chen a[i] vao heap sao cho cau truc heap van bao
toan. De lam dieu nay ta bat dau tu
nut f = 0, theo con duong cha - con trai hoac phai, tim mot vi tri
de chen nut a[i]. De co duoc nut trong de chen a[i], ta can
dich cac nut tren duong di len mot muc, bang cong thuc
nutgoc=max(contrai,conphai,a[i])*/
f=0; //f la nut cha, s la nut con lon hon
s=2*f+1; //Gan s la nut con ben trai
if(s+1<i && a[s]<a[s+1]) s=s+1;/*Neu co nut phai va
lon hon thi chon nut phai*/
while(s<i && x<a[s])
{a[f]=a[s];//Con lon thay the cha
f=s;//Chuyen den con lon tiep theo
s=2*f+1;
if(s+1<i && a[s]<a[s+1]) s=s+1;
};
a[f]=x; //Nut a[k] duoc chen dung cho
}; //end of for(i=N-1;i>0;i--)
};
Bíc 1: Xem danh s¸ch n nót lµ n danh s¸ch 1 nót ®· s¾p thø tù.
Trén tõng cÆp 2 danh s¸ch liªn tiÕp nhau ta ®îc n/2 danh s¸ch
con cã thø tù ( n/2 ®îc hiÓu lµ phÐp chia nguyªn trong ng«n
ng÷ C, nh vËy nÕu n lÎ th× cã 1 danh s¸ch cuèi cïng cha ®îc
trén)
70
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
Bíc 2: Xem danh s¸ch gåm n/2 danh s¸ch con. Trén tõng cÆp 2
danh s¸ch kÒ nhau nh ë bíc 1, ta nhËn ®îc n/4 danh s¸ch
con.
...
Bíc cuèi: Khi chØ cßn 2 danh s¸ch, ta thùc hiÖn trén vµ thu ®îc danh s¸ch
®Çy ®ñ ®îc s¾p xÕp.
Sè bíc trén O(log2n), mçi bíc trén cÇn Ýt h¬n n lÇn so s¸nh.
VËy thêi gian thùc hiÖn gi¶i thuËt merge sort cã bËc lµ O(nlogn).
NhËn xÐt:
Merge sort kh«ng tèi u bé nhí v× ph¶i dïng danh s¸ch t¹m.
Merge sort cã thêi gian tÝnh to¸n cïng bËc víi heap sort, tøc lµ nhanh h¬n
Quicksort, shell sort vµ c¸c ph¬ng ph¸p kh¸c mµ chóng ta võa kh¶o s¸t.
Merge rÊt thÝch hîp cho viÖc s¾p xÕp c¸c khèi d÷ liÖu lín ë bé nhí ngoµi.
Trén tõng cÆp 2 danh s¸ch con ®Ó t¹o d·y Listtmp ®Çy ®ñ:
B¾t ®Çu tõ ®Çu danh s¸ch, ta lÇn lît trén tõng 2 danh s¸ch con liªn
tiÕp nhau ®Ó ®a sang danh s¸ch t¹m Listtmp. Trong trêng hîp sè danh
s¸ch con lµ lÎ th× cuèi cïng sÏ cßn l¹i mét danh s¸ch cha trén. Danh s¸ch
71
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
nµy t¬ng øng víi [low1,up1], lóc nµy ta chuyÓn toµn bé danh s¸ch con
nµy sang Listtmp. Sau ®ã ta copy Listtmp sang a ®Ó b¾t ®Çu mét ®ît
trén míi víi cì cña c¸c danh s¸ch con ®îc t¨ng gÊp ®«i.
Thùc hiÖn thao t¸c trén ®Ó cã ®îc danh s¸ch ®· s¾p xÕp:
Ban ®Çu danh s¸ch cha s¾p xÕp, v× vËy ®Ó cã c¸c danh s¸ch con ®îc
s¾p xÕp ta ph¶i xem c¸c danh s¸ch con chØ cã 1 phÇn tö, tøc lµ ta ®Æt
size = 1. Ta sÏ thùc hiÖn mét vßng lÆp while víi ®iÒu kiÖn dõng lµ size ≥
count. T¹i mçi bíc lÆp, c¨n cø vµo size ta sÏ thiÕt lËp c¸c danh s¸ch con cã
size phÇn tö, sau ®ã tiÕn hµnh trén tõng cÆp mét ®Ó t¹o nªn mét danh
s¸ch mµ trong ®ã b¾t ®Çu tõ a[0], ta cã c¸c danh s¸ch con cã 2*size
phÇn tö ®· ®îc s¾p xÕp. ë vßng lÆp tiÕp theo ta ®Æt size = 2*size , vµ
cø nh vËy. Cuèi cïng ta ®îc danh s¸ch ®îc s¾p xÕp.
while(low1+size<N)
{low2=low1+size;
up1=low2-1;
up2=(low2+size-1<N)? low2+size-1 : N-1;
/*Cho i quet tu low1 den up1, j quet tu low2 den up2. Voi moi i va
j
so sanh va chon phan tu nho hon chuyen sang danh sach tam.*/
for(i=low1,j=low2;i<=up1 && j<=up2;k++)
if(a[i]<=a[j]) Listtmp[k]=a[i++];
else Listtmp[k]=a[j++];;
/*Neu so ds con la so le thi khi tron tung cap se con lai ds cuoi
cung. Ta phai chuyen danh sach nay sang ds tam*/
for(i = low1; k < N; i++) Listtmp[k++] = a[i];
for(i = 0; i < N; i++) a[i] = Listtmp[i];
size *= 2;//Tang co cua danh sach con len 2 lan.
}//end of while(size<N)
}
72
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
4.2.8. S¾p xÕp theo chØ sè
Trong mét sè øng dông, c¸c nót ai thêng chøa rÊt nhiÒu th«ng tin, do
®ã viÖc dÞch chuyÓn c¸c nót sÏ tèn nhiÒu thêi gian, vµ trong mét sè tr-
êng hîp cßn tèn c¶ bé nhí, thÝ dô trêng hîp merge sort ch¼ng h¹n, ta ph¶i
dïng mét danh s¸ch t¹m trong qu¸ tr×nh s¾p xÕp. Râ rµng gi¸ trÞ cña nót
ai hoµn toµn ®îc x¸c ®Þnh th«ng qua chØ sè i cña nã. Tõ ®©y chóng ta
cã thÓ thÊy r»ng viÖc s¾p xÕp kh«ng nhÊt thiÕt ph¶i tiÕn hµnh trùc tiÕp
trªn c¸c nót mµ ta cã thÓ biÕn ®æi d·y chØ sè sao cho tõ d·y ban ®Çu
(0,1,2...,n-1) ta sÏ biÕn ®æi thµnh d·y (i0, i1, ... , in-1 ) ®Ó d·y c¸c nót t¬ng
øng trë thµnh ®îc s¾p xÕp. Sau ®©y lµ ch¬ng tr×nh cµi ®Æt theo ý t-
ëng ®ã (B¹n ®äc cã thÓ tù t×m hiÓu thuËt to¸n, vÒ b¶n chÊt c¸c thuËt
to¸n còng hoµn toµn t¬ng tù nh trêng hîp dÞch chuyÓn c¸c phÇn tö. §iÒu
kh¸c biÖt lµ thay v× dÞch chuyÓn hay thay ®æi néi dung c¸c nót, ta chØ
cÇn thay ®æi c¸c chØ sè mµ th«i.
73
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
hµnh t×m kiÕm nhÞ ph©n néi dung x ë ®o¹n [bottom,mid-1]; ngîc l¹i ta
thùc hiÖn t×m kiÕm nhÞ ph©n trªn ®o¹n [mid+1,top]. Cø nh vËy cho
®Õn khi t×m thÊy x hoÆc kh«ng t×m thÊy. Trong ch¬ngtr×nh sau thay
v× ký hiÖu c¸c biÕn lµ bottom, top vµ mid, chóngt«i chØ ký hiÖu lµ i, j k.
Cã thÓ thÊy r»ng ta thùc hiÖn t×m kiÕm b»ng c¸ch liªn tôc chia ®«i d·y,
vµ sau mçi lÇn chia ®«i nh thÕ th× chØ thùc hiÖn t×m kiÕm trªn mét nöa
d·y mµ th«i. Gi¶ sö k lµ gi¸ trÞ lín nhÊt sao cho 2 k < n, tøc lµ 2k < n ≤
2k+1 . Khi ®ã cã thÓ thÊy r»ng qu¸ t×nh t×m kiÕm ®îc thùc hiÖn nhiÒu
nhÊt trong k+1 bíc, mçi bíc øng víi mét thao t¸c chia ®«i d·y. ThËt vËy,
n n
lÇn chia ®Çu tiªn d·y cã ®é dµi lµ , lÇn tiÕp theo lµ 1 , ... vµ lÇn thø i
2 2
n n
lµ i . Theo hÖ thøc trªn th× víi k+1 ta cã k +1 ≤ 1. NghÜa lµ cïng l¾m lµ
2 2
®Õn bíc k+1 th× sè phÇn tö trong danh s¸ch cÇn t×m lµ 1, nghÜa lµ qu¸
tr×nh ph¶i kÕt thóc. Mçi bíc ta chØ thùc hiÖn mét phÐp so s¸nh, vµi phÐp
chia, vËy sè phÐp tÝnh chØ kho¶ng C(k+1) = Clog2n. Tõ ®©y ta suy ra
r»ng thuËt to¸n t×m kiÕm nhÞ ph©n cã ®é phøc t¹p tÝnh to¸n log2n.
74
C©u hái vµ bµi tËp
Ghi chó.
Trong phÇn nµy sÏ cã rÊt nhiÒu c©u hái yªu cÇu m« t¶ thuËt to¸n vµ viÕt
ch¬ng tr×nh. C¸c b¹n cã thÓ sö dông mét trong nh÷ng ph¬ng ph¸p ®·
biÕt ®Ó m« t¶ thuËt to¸n, vÝ dô nh: ng«n ng÷ tù nhiªn, m· gi¶, lu ®å hay
ng«n ng÷ lËp tr×nh. Ng«n ng÷ lËp tr×nh ®îc yªu cÇu ë ®©y lµ C hoÆc
C++. Nh vËy "yªu cÇu viÕt c¸c dßng lÖnh" ®îc hiÓu lµ "viÕt c¸c dßng
lÖnh b»ng C hoÆc C++". NÕu c©u hái gåm c¶ hai phÇn lµ m« t¶ thuËt
to¸n vµ viÕt ch¬ng tr×nh th× cã nghÜa lµ tríc hÕt ph¶i m« t¶ thuËt to¸n
b»ng ng«n ng÷ tù nhiªn, sau ®ã lµ viÕt ch¬ng tr×nh. Khi m« t¶ thuËt
to¸n ngêi ta thêng tr×nh bµy thµnh c¸c bíc cã ®¸nh sè (vÝ dô B0, B1,...)
mét c¸ch chÆt chÏ. Tuy nhiªn còng cã trêng hîp c¸ch tr×nh bµy nµy lµm
cho thuËt to¸n khã hiÓu. NÕu viÖc m« t¶ thuËt to¸n theo c¸ch nãi tù nhiªn
dÔ hiÓu h¬n th× c¸c b¹n cã thÓ sö dông (®©y lµ c¸ch mµ mét sè tµi liÖu
nh cuèn s¸ch "CÈm nang thuËt to¸n" thêng sö dông). Trong tµi liÖu nµy
rÊt nhiÒu thuËt to¸n ®¬n gi¶n ®îc tr×nh bµy theo c¸ch nµy. VÝ dô khi m«
t¶ thuËt to¸n s¾p xÕp b»ng lùa chän ta cã thÓ tr×nh bµy nh sau:
Víi mçi i (i=0,1,2,..., n-2) ta t×m phÇn tö a[k] bÐ nhÊt trong d·y con (a[i], a[i+1],...,a[n-
1]) råi ®æi chç cho a[i] nÕu i≠k. §Ó lµm ®iÒu nµy ta dïng biÕn min ®Ó ghi nhËn gi¸ trÞ
bÐ nhÊt. Ban ®Çu min ®îc ®Æt b»ng a[i], sau ®ã ta dïng mét biÕn j ®Ó duyÖt qua c¸c
phÇn tö cßn l¹i trong danh s¸ch con, khëi ®Çu j=i+1 vµ kÕt thóc khi j=n-1. Mçi lÇn nhËn
thÊy a[j]<min th× ta l¹i ®Æt min=a[j] vµ k=j. Nh thÕ khi j ®i ®Õn cuèi d·y th× ta cã
min lµ gi¸ trÞ bÐ nhÊt vµ gi¸ trÞ bÐ nhÊt ®ã lµ a[k]. NÕu k ≠ i th× a[k] vµ a[i] ®îc ®æi
chç cho nhau. Nh vËy a[i] ®· ë ®óng vÞ trÝ cña nã trong d·y cÇn s¾p xÕp. Khi i=n-2 th×
d·y con chØ cßn mét phÇn tö duy nhÊt lµ a[n-1] vµ kh«ng cÇn ph¶i lùa chän n÷a.
NÕu cã ch¬ng tr×nh kÌm theo th× thuËt to¸n cã thÓ m« t¶ rÊt ng¾n, cèt
nãi lªn ®îc b¶n chÊt vÊn ®Ò. Sau ®ã phÇn chi tiÕt sÏ ®îc thÓ hiÖn b»ng
c¸ch gi¶i thÝch nh÷ng dßng lÖnh chÝnh. VÝ dô nÕu c©u hái lµ: m« t¶
thuËt to¸n s¾p xÕp b»ng lùa chän vµ viÕt ch¬ng tr×nh cµi ®Æt thuËt
to¸n nµy th× cã thÓ lµm nh sau:
M« t¶ thuËt to¸n:
§Çu vµo: M¶ng c¸c sè thùc a[], biÕn nguyªn N lµ cì cña m¶ng. Thêng m¶ng a cha ®îc
s¾p xÕp.
§Çu ra: M¶ng a[] ®· ®îc s¾p xÕp t¨ng dÇn.
C¸ch thùchiÖn: Víi mçi i (i=0,1,2,...,N-2) t×m a[k] lµ phÇn tö bÐ nhÊt trong d·y con
(a[i], a[i+1], ..., a[N-1] råi ®æi chç a[k] víi a[i] nÕu k ≠ i.
Trong trêng hîp b¹n kh«ng tr×nh bµy ®îc thuËt to¸n, kh«ng viÕt ®îc ch-
¬ng tr×nh hoÆc viÕt ®îc ch¬ng tr×nh nhng kh«ng biÕt c¸ch gi¶i thÝch,
th× b¹n cßn mét gi¶i ph¸p lµ gi¶i thÝch thuËt to¸n th«ng qua vÝ dô cô thÓ
(tÊt nhiªn lµ b¹n sÏ kh«ng nhËn ®îc sè ®iÓm tèi ®a v× b¹n kh«ng thùc
hiÖn ®óng yªu cÇu bµi ra). VÝ dô víi ph¬ng ph¸p s¾p xÕp b»ng lùa chän
b¹n cã thÓ ®a ra m« t¶ ng¾n gän råi minh häa b»ng vÝ dô nh sau:
M« t¶ thuËt to¸n:
Víi mçi i (i = 0,1,2,...,n-2) ta sÏ chän trong d·y khãa a i, ai+1,..., an-1 khãa nhá nhÊt ak, råi
®æi chç cho ai (dÜ nhiªn lµ cã thÓ ai chÝnh lµ khãa nhá nhÊt vµ t¹i bíc nµy kh«ng cÇn
®æi chç).
VÝ dô, gi¶ sö d·y A ban ®Çu lµ:
a0 a1 a2 a3 a4 a5
14 2 1 13 12 11
i=1 1 2 14 13 12 11
1 2 14 13 12 11
i=2 1 2 14 13 12 11
1 2 11 13 12 14
Tãm l¹i, ®iÒu quan träng nhÊt lµ b¹n ph¶i hiÓu ®îc vÊn ®Ò, sau ®ã nÕu
tr×nh bµy ®îc theo chuÈn mùc lµ tèt nhÊt, nÕu kh«ng, b¹n cã thÓ tr×nh
bµy theo c¸ch mµ b¹n hiÓu.
78
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
11. Gi¶ sö cÊu tróc c¸c nót trªn c©y nhÞ ph©n ®îc khai b¸o b»ng lÖnh:
struct node {int info; node* left, *right;};
Khi ®ã mét c©y nhÞ ph©n ®îc x¸c ®Þnh bëi mét biÕn con trá proot
chØ ®Õn nót gèc. H·y m« t¶ vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn
c©y nhÞ ph©n cã nót gèc proot:
- Khëi t¹o c©y
- DuyÖt c©y theo thø tù tríc.
- DuyÖt c©y theo thø tù gi÷a.
- DuyÖt c©y theo thø tù sau.
12. Nªu ®Þnh nghÜa cÊu tróc c©y nhÞ ph©n t×m kiÕm, mét vµi øng dông
vµ cho vÝ dô.
13. M« t¶ vµ cµi ®Æt thao t¸c t×m mét nót cã khãa x trªn c©y nhÞ ph©n
t×m kiÕm.
14. M« t¶ vµ cµi ®Æt thao t¸c thªm mét nót cã khãa x trªn c©y nhÞ ph©n
t×m kiÕm.
15. M« t¶ thuËt to¸n xãa khãa x trªn c©y nhÞ ph©n t×m kiÕm.
16. Cho d·y c¸c khãa 15, 6, 7, 21, 25,42. H·y m« t¶ qu¸ tr×nh x©y dùng
c©y nhÞ ph©n t×m kiÕm b»ng c¸ch lÇn lît chÌn c¸c khãa trªn ®©y
vµo c©y vµ biÓu diÔn b»ng h×nh vÏ. Sau khi c©y ®îc x©y dùng, h·y
m« t¶ c¸c thao t¸c lÇn lît xãa c¸c khãa 21 vµ 25.
17. Nªu ®Þnh nghÜa c©y c©n b»ng chiÒu cao (c©y AVL).
18. Cho d·y c¸c khãa lµ c¸c sè thùc nh sau:
5 13 9 7 6 4 8 11
H·y t¹o vµ vÏ c©y AVL b»ng c¸ch lÇn lît chÌn c¸c khãa trªn vµo c©y
19. H·y lËp luËn ®Ó ®a ra íc lîng cña c©y AVL cao nhÊt chøa n khãa , tõ
®ã suy ra ®¸nh gi¸ vÒ thêi gian t×m kiÕm c¸c khãa trªn c©y AVL cã
n khãa.
79
Tµi liÖu tham kh¶o
1. Alistair Mc Monnies & W. Stewart Mc. Sporran, Gi¸o tr×nh cÊu tróc
d÷ liÖu b»ng ng«n ng÷ C, Nhµ xuÊt b¶n thèng kª, 1999
2. Donald E.Knuth, The Art of Computer Programming - Volume 1,
Volume 3, Addison - Wesley Longman, Inc. Second printing, May
1998.
3. §inh M¹nh Têng, CÊu tróc d÷ liÖu vµ gi¶i thuËt, NXB KH&KT, 2000
4. §ç Xu©n L«i, CÊu tróc d÷ liÖu vµ Gi¶i thuËt, NXB KH&KT, 1998
5. §ç §øc Gi¸o, C¬ së to¸n trong lËp tr×nh, NXB KH&KT, 1998
6. Hoµng KiÕm, Gi¶i mét bµi to¸n trªn m¸y tÝnh nh thÕ nµo, tËp
mét, NXB GD, 2000
7. Kenneth H. Rosen, To¸n häc rêi r¹c øng dông trong tin häc, NXB
KH&KT, 2000
8. NguyÔn Hång Ch¬ng, CÊu tróc d÷ liÖu, øng dông vµ cµi ®Æt
b»ng C, NXB TPHCM, 2000
9. NguyÔn Trung Trùc, CÊu tróc d÷ liÖu, §¹i häc B¸ch khoa TPHCM,
1997
10.NguyÔn Xu©n Huy, ThuËt to¸n, Nhµ xuÊt b¶n Thèng kª, 1988
11. Robert Sedgewick, CÈm nang thuËt to¸n, NXB KH&KT,1998
12. TrÇn H¹nh Nhi - D¬ng Anh §øc, Gi¸o tr×nh CÊu tróc d÷ liÖu vµ
gi¶i thuËt, §¹i häc Quèc gia Hå ChÝ Minh, 2001.
C©u hái lý thuyÕt vµ thùc hµnh dµnh cho thi hÕt m«n
I. PhÇn lý thuyÕt
1. H·y m« t¶ v¾n t¾t cÊu tróc Stack (ng¨n xÕp) vµ øng dông. H·y cho
biÕt néi dung cña Stack sau mçi thao t¸c sau ®©y:
EAS*Y**QUE***ST***I*ON
Víi mçi ch÷ c¸i tîng trng cho thao t¸c thªm ch÷ c¸i t¬ng øng vµo Stack,
dÊu * tîng trng cho thao t¸c lÊy néi dung mét phÇn tö trong Stack in
lªn mµn h×nh.
H·y cho biÕt sau khi hoµn tÊt chuçi thao t¸c, nh÷ng g× xuÊt hiÖn trªn
mµn h×nh?
2. H·y m« t¶ v¾n t¾t cÊu tróc Queueu (hµng ®îi) vµ øng dông. H·y cho
biÕt néi dung cña Queue sau mçi thao t¸c sau ®©y:
EAS*Y**QUE***ST***I*ON
Víi mçi ch÷ c¸i tîng trng cho thao t¸c thªm ch÷ c¸i t¬ng øng vµo
Queue, dÊu * tîng trng cho thao t¸c lÊy néi dung mét phÇn tö trong
Queue in lªn mµn h×nh.
H·y cho biÕt sau khi hoµn tÊt chuçi thao t¸c, nh÷ng g× xuÊt hiÖn trªn
mµn h×nh?
3. B¹n h·y thö nªu mét vµi lý do khi ngêi ta x©y dùng cÊu tróc c©y nhÞ
ph©n.
B C
D E F
G H I
H·y m« t¶ v¾n t¾t c¸c phÐp duyÖt c©y nhÞ ph©n theo:
Thø tù tríc, Thø tù gi÷a, Thø tù sau vµ theo bÒ réng.
råi viÕt d·y c¸c nót ®îc th¨m khi duyÖt c©y nµy theo tõng c¸ch duyÖt
nãi trªn, trong ®ã gi¶i thÝch viÖc lùa chän 3 nót nµo ®ã (tuú b¹n lùa
chän).
5. Th«ng tin vÒ b¹n ®äc ë th viÖn gåm (Tªn, Sè thÎ). Cho mét danh s¸ch
nh sau:
(A,25), (B,30), (C,26), (D, 20), (E,23), (F,29), (G,15), (H,35), (I,19),
(J,44), (K,17).
a. H·y khai b¸o cÊu tróc d÷ liÖu (d¹ng con trá) cña c©y nhÞ ph©n t×m
kiÕm chøa danh s¸ch b¹n ®äc nãi trªn (b»ng ng«n ng÷ C). H·y gi¶i
thÝch ý nghÜa cña khai b¸o mµ b¹n ®a ra.
b. H·y vÏ (trªn giÊy) tõng bíc c©y nhÞ ph©n t×m kiÕm sau khi lÇn lît
chÌn tõng b¹n ®äc trong danh s¸ch trªn vµo c©y víi khãa lµ Sè thÎ,
trong ®ã t¹i mçi nót cña c©y ph¶i thÓ hiÖn ®Çy ®ñ Tªn vµ Sè thÎ.
c. H·y m« t¶ thao t¸c xãa b¹n ®äc cã m· sè 20 vµ vÏ l¹i c©y sau khi
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
xãa.
6. H·y m« t¶ vµ ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n c¸c thuËt to¸n s¾p xÕp
néi (m¶ng mét chiÒu) sau ®©y: lùa chän (Selection Sort), ®æi chç
trùc tiÕp, chÌn (insertion Sort), næi bät (Bubble Sort), vµ trén (merge
sort), sau ®ã minh häa b»ng c¸ch s¾p xÕp m¶ng ®îc cho díi ®©y:
5, 13, 9, 7, 6, 4, 8, 11
3. C¸c yªu cÇu t¬ng tù nh c©u 1, nhng víi c¬ së d÷ liÖu thùc tÕ lµ c¸c
nh©n viªn cña c¬ quan víi c¸c th«ng tin (M· nh©n viªn, Hä tªn, L¬ng).
4. C¸c yªu cÇu t¬ng tù nh c©u 1, nhng víi c¬ së d÷ liÖu thùc tÕ lµ c¸c
b¹n ®äc trong th viÖn víi c¸c th«ng tin (Sè thÎ, Hä tªn, N¨m sinh).
83