You are on page 1of 89

Tµi liÖu tham kh¶o hç trî häc tËp m«n häc

CÊu tróc d÷ liÖu vµ gi¶i thuËt

TS. Phan §¨ng CÇu

Hµ néi, th¸ng 05/ 2006


(Tæng sè trang c¶ b×a: 70)
môc lôc

Lêi nãi ®Çu..................................................................4

Ch¬ng 1.......................................................................1

ThuËt to¸n vµ thuËt gi¶i................................................1


1.1. ThuËt to¸n ...................................................................................1
1.1.1. §Þnh nghÜa vµ vÝ dô.............................................................1
1.1.2. C¸c ®Æc trng cña thuËt to¸n.................................................1
1.1.3. BiÓu diÔn thuËt to¸n .............................................................2
1.1.4. Ph©n tÝch thuËt to¸n.............................................................3
1.1.5. §é phøc t¹p cña thuËt to¸n.....................................................4
1.2. ThuËt gi¶i.....................................................................................8
1.2.1. §Ö quy....................................................................................8
1.2.2. Më réng kh¸i niÖm thuËt to¸n: thuËt gi¶i.............................11
1.2.3. ThuËt gi¶i vµ cÊu tróc d÷ liÖu.............................................12
1.3. Gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh............................................13
1.3.1. Kh¸i niÖm vÒ vÊn ®Ò vµ bµi to¸n.......................................13
1.3.2. C¸c bíc gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh..........................13

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

C©y nhÞ ph©n...........................................................32


3.1. Më ®Çu......................................................................................32
3.2. Mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n................................33
3.3. VÝ dô vÒ c©y nhÞ ph©n............................................................35
3.4. C©y nhÞ ph©n tæng qu¸t.........................................................36
3.4.1. DuyÖt c©y nhÞ ph©n..........................................................37
3.4.2. Cµi ®Æt c©y nhÞ ph©n b»ng ph¬ng ph¸p liªn kÕt.............38
3.5. C©y nhÞ ph©n t×m kiÕm.........................................................39
3.5.1. Thao t¸c chÌn (insert)...........................................................39
3.5.2. Thao t¸c xãa (remove).........................................................39
3.5.2. Cµi ®Æt c©y nhÞ ph©n t×m kiÕm.....................................41
3.6. C©y c©n b»ng chiÒu cao (Height balanced tree).....................44
3.6.1. Thao t¸c xoay c©y nhÞ ph©n..............................................44
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............................................................................45
3.6.3. C©n b»ng l¹i c©y khi thªm nót............................................45
3.6.4. Xo¸ nót trªn c©y AVL..........................................................51
3.6.5. Vµi nhËn xÐt vÒ c©y AVL....................................................54

Ch¬ng 4.....................................................................56

S¾p xÕp vµ t×m kiÕm ..............................................56


4.1. Më ®Çu......................................................................................56
4.2. C¸c gi¶i thuËt s¾p xÕp hay dïng................................................57
4.2.1. S¾p xÕp b»ng lùa chän (Selection Sort)..............................57
4.2.2. S¾p xÕp næi bät (Bubble sort)............................................59
4.2.3. S¾p xÕp chÌn (Insertion sort) .............................................61
4.2.4. Ph¬ng ph¸p Shell Sort .........................................................62
4.2.5. S¾p xÕp nhanh (Quick Sort)................................................64
4.2.6. S¾p xÕp kiÓu xÕp chång (Heap sort) ................................67
4.2.7. S¾p xÕp trén (Merge sort)...................................................70
4.2.8. S¾p xÕp theo chØ sè...........................................................73
4.3. T×m kiÕm..................................................................................73
4.3.1. T×m kiÕm tuyÕn tÝnh vÞ trÝ cã néi dung x........................73
4.3.2. T×m kiÕm nhÞ ph©n vÞ trÝ cã néi dung x.........................73

C©u hái vµ bµi tËp.....................................................75

Tµi liÖu tham kh¶o.....................................................80

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.

Hµ néi, th¸ng 12/2005

TS. Phan §¨ng CÇu


Ch¬ng 1
ThuËt to¸n vµ thuËt gi¶i
1.1. ThuËt to¸n
1.1.1. §Þnh nghÜa vµ vÝ dô
ThuËt to¸n (Algorithm) lµ kh¸i niÖm c¬ së cña To¸n häc vµ Tin häc, cã thÓ
®Þnh nghÜa mét c¸ch trùc gi¸c nh sau:
ThuËt to¸n lµ mét d·y h÷u h¹n c¸c bíc, mçi bíc m« t¶ chÝnh x¸c c¸c
phÐp to¸n hoÆc hµnh ®éng cÇn thùc hiÖn, ®Ó gi¶i quyÕt mét vÊn ®Ò
nµo ®ã.
ThuËt ng÷ “thuËt to¸n” (algorithm) cã xuÊt xø tõ tªn cña nhµ to¸n häc
Ud¬bªck (Liªn x« cò) sèng vµo kho¶ng ®Çu thÕ kû thø 9 (kho¶ng n¨m 825)
-Abu J¸far Mohammed ibn Musa Al - khowarizmi ( cha cña J¸fa, con cña Musa,
gèc ngêi xø Khovarizmi - lµ c¸ch gäi cña ngêi Trung ¸ cæ). Ban ®Çu ngêi ta
dïng thuËt ng÷ algorism, xuÊt ph¸t tõ côm tõ al - khowarizmi (gèc ngêi xø
Khovarizmi), cßn Khovarizmi lµ tªn cæ cña thÞ trÊn Khiva cña Liªn x«. Suèt
mét thêi gian dµi, thuËt ng÷ nµy ®îc dïng ®Ó chØ c¸c phÐp tÝnh sè häc
trªn c¸c sè thËp ph©n. VÒ sau tõ algorism ®îc thay ®æi thµnh algorithm vµ
mang ý nghÜa chung h¬n, bao hµm c¶ c¸c thñ tôc ®Ó gi¶i mét bµi to¸n nãi
chung chø kh«ng chØ lµ c¸c thñ tôc ®Ó thùc hiÖn c¸c phÐp tÝnh sè häc. Mét
vÝ dô ®iÓn h×nh vÒ thuËt to¸n lµ thuËt to¸n t×m ¦SCLN do nhµ to¸n häc
Hy l¹p Euclid ph¸t minh tõ thêi cæ Hy l¹p (c¸ch ®©y h¬n 2000 n¨m) vµ ®îc
gi¶i thÝch chi tiÕt trong luËn ¸n næi tiÕng cña «ng lµ “Elements”. C¸c vÝ dô
®¬n gi¶n kh¸c lµ c¸c phÐp tÝnh sè häc nh céng, trõ, nh©n, chia.
Suèt trong mÊy chôc thÕ kû ph¸t triÓn cña to¸n häc, kh¸i niÖm thuËt to¸n vÉn ®îc hiÓu
vµ ®îc dïng mét c¸ch trùc quan nh trªn ®©y. Cho ®Õn ®Çu thÕ kû 20, trong to¸n häc xuÊt
hiÖn mét sè bµi to¸n mµ viÖc cã thuËt to¸n ®Ó gi¶i chóng lµ rÊt ®¸ng nghi ngê. Ngêi ta
®Æt vÊn ®Ò lµ liÖu cã thÓ chøng minh lµ kh«ng cã thuËt to¸n ®Ó gi¶i bµi to¸n ®ã hay
kh«ng. NÕu nh kh¸i niÖm trùc gi¸c vÒ thuËt to¸n lµ ®ñ dïng khi ta chøng minh viÖc cã
thuËt to¸n cô thÓ nµo ®ã, th× ngîc l¹i, nã kh«ng thÓ lµ c¬ së cho viÖc chøng minh cã thuËt
to¸n ®Ó gi¶i bµi to¸n nµy hay bµi to¸n kh¸c hay kh«ng. Muèn chøng minh kh«ng cã thuËt
to¸n th× tríc hÕt cÇn ph¶i cã mét ®Þnh nghÜa to¸n häc chÝnh x¸c cho kh¸i niÖm thuËt
to¸n.
Vµo kho¶ng nh÷ng n¨m ®Çu cña thËp kû 30, G«del, Kleene, Church, Turing vµ Post ®·
®a ra mét sè ®Þnh nghÜa nh»m chÝnh x¸c hãa kh¸i niÖm thuËt to¸n. Sau ®ã nhiÒu t¸c gi¶
kh¸c tiÕp tôc ®a ra mét sè ®Þnh nghÜa kh¸c vÒ thuËt to¸n. C¸c ®Þnh nghÜa ®ã nãi chung
®Òu t¬ng ®¬ng víi nhau, tuy mçi ®Þnh nghÜa cã mét sè thuËn lîi riªng, thÝch hîp víi viÖc
nghiªn cøu mét líp vÊn ®Ò nµo ®ã. Cã thÓ liÖt kª mét sè m« t¶ h×nh thøc cho thuËt to¸n
nh sau:
- M¸y Turing (1936)
- M¸y Post (1936)
- Hµm ®Ö quy (G«del 1931, Church 1936, Kleene 1936)
- ThuËt to¸n chuÈn Markov (1954)
- V¨n ph¹m Chomsky kiÓu 0 (1959)
- HÇu hÕt c¸c ng«n ng÷ lËp tr×nh (tõ 1950 ®Õn nay).
Tuy nhiªn trong tµi liÖu nµy chóng ta chØ giíi h¹n kh¸i niÖm thuËt to¸n theo nghÜa trùc
gi¸c.

1.1.2. C¸c ®Æc trng cña thuËt to¸n


Cã thÓ liÖt kª 6 ®Æc trng quan träng sau ®©y cña thuËt to¸n:
(1) §¹i lîng vµo (Input). C¸c thuËt to¸n thêng cã c¸c gi¸ trÞ nhËp (input
values).
(2) §¹i lîng ra (Output). ThuËt to¸n thêng t¹o ra c¸c gi¸ trÞ xuÊt (output
values) thÓ hiÖn lêi gi¶i cho bµi to¸n hay vÊn ®Ò.
(3) TÝnh x¸c ®Þnh (Definiteness). C¸c bíc trong thuËt to¸n ph¶i chÝnh x¸c
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â rµng.
(4) TÝnh kÕt thóc (Finiteness). ThuËt to¸n ph¶i cho ra lêi gi¶i (hay kÕt qu¶)
sau mét sè h÷u h¹n bíc. Chóng ta lu ý r»ng sè c¸c bíc m« t¶ trong thuËt
to¸n lµ h÷u h¹n cha ®ñ ®Ó b¶o ®¶m vÒ tÝnh dõng cña thuËt to¸n. VÝ
dô thuËt to¸n chuyÓn mét ph©n sè sang sè thËp ph©n chÝnh x¸c
kh«ng cã sai sè lµ thuËt to¸n cã lóc kh«ng dõng. ThÝ dô nÕu ta muèn
chuyÓn 1/3 thµnh sè thËp ph©n th× ta gÆp phÐp chia cã v« h¹n bíc
kh«ng dõng.
TÝnh dõng cña thuËt to¸n thêng ®îc chøng minh dùa trªn nh÷ng tri thøc
to¸n häc. ThÝ dô khi chøng minh tÝnh dõng cña thuËt to¸n Euclid ta chØ
ra r»ng d·y c¸c sè d gi¶m dÇn vµ bÞ chÆn bëi 0, do ®ã ph¶i dõng t¹i 0
sau h÷u h¹n bíc.
(5) TÝnh hiÖu qu¶. Yªu cÇu ®Çu tiªn cña tÝnh hiÖu qu¶ cña thuËt to¸n lµ
sù ®óng ®¾n, cô thÓ lµ: víi d÷ liÖu vµo cho tríc, thuËt to¸n ho¹t ®éng
sau mét sè h÷u h¹n bíc sÏ dõng vµ cho kÕt qu¶ mong muèn. KÕt qu¶
mong muèn thêng ®îc x¸c ®Þnh qua ®Þnh nghÜa. B»ng c¸c phÐp thö ta
chØ cã thÓ x¸c ®Þnh ®îc tÝnh sai cña thuËt to¸n. Muèn x¸c ®Þnh tÝnh
®óng ta ph¶i chøng minh.
Yªu cÇu quan träng thø 2 cña tÝnh hiÖu qu¶ cña thuËt to¸n lµ tÝnh h÷u
hiÖu hay tÝnh kh¶ thi. TÝnh h÷u hiÖu thêng ®îc ®¸nh gi¸ qua thêi gian
thùc hiÖn, dung lîng lu tr÷ trªn thiÕt bÞ nhí khi thùc hiÖn thuËt to¸n trªn
m¸y tÝnh.
(6) TÝnh tæng qu¸t. ThuËt to¸n ph¶i ®îc ¸p dông ®îc cho tÊt c¶ c¸c bµi
to¸n cã d¹ng nh mong muèn, chø kh«ng ph¶i chØ ¸p dông cho mét sè tr-
êng hîp riªng lÎ.
Theo ®Þnh nghÜa vµ c¸c ®Æc trng trªn ®©y ta cã thÓ thÊy thuËt to¸n
Euclid, c¸c phÐp tÝnh sè häc lµ c¸c thuËt to¸n. TÝnh tæng qu¸t thêng ®îc
quy íc tïy tõng trêng hîp cô thÓ, vµ trong thùc tÕ nhiÒu khi ta cã thÓ so s¸nh
vÒ tÝnh tæng qu¸t cña c¸c thuËt to¸n. ThÝ dô ta gäi R1 lµ thuËt to¸n ®a
khèi vu«ng Rubic tõ mét h×nh tr¹ng tuú ý trë vÒ h×nh tr¹ng nguyªn thñy,
tøc lµ h×nh tr¹ng c¸c mÆt ®ång mÇu; cßn thuËt to¸n R2 ®a Rubic tõ h×nh
tr¹ng A tïy ý sang h×nh tr¹ng B tïy ý, th× thuËt to¸n R2 tæng qu¸t h¬n.
ThuËt to¸n R1 lµ trêng hîp riªng cña thuËt to¸n R2 khi B lµ h×nh tr¹ng ban
®Çu.
§Ó hiÓu râ h¬n c¸c ®Æc trng cña thuËt to¸n, ta xÐt vÝ dô sau:
Gi¶ sö khi nhËn mét líp häc míi, Ban gi¸m hiÖu yªu cÇu gi¸o viªn chñ
nhiÖm chän líp trëng theo c¸c bíc sau:
- LËp danh s¸ch sinh viªn trong líp.
- S¾p thø tù danh s¸ch sinh viªn.
- Chän sinh viªn ®øng ®Çu danh s¸ch ®Ó lµm líp trëng.
Râ rµng c¸c bíc trªn ®©y cßn chøa nhiÒu ®iÒu kh«ng râ rµng, vµ gi¸o
viªn kh«ng biÕt xö lý c¸c bíc nh thÕ nµo cho ®óng, nh vËy cha thÓ hiÖn mét
thuËt to¸n. §Ó trë thµnh thuËt to¸n th× ta ph¶i thªm c¸c th«ng tin nh lËp
danh s¸ch gåm nh÷ng th«ng tin g×, s¾p thø tù theo c¸i g×, thÕ nµo lµ ngêi
®øng ®Çu danh s¸ch...

1.1.3. BiÓu diÔn thuËt to¸n


Ngêi ta thêng dïng c¸c ph¬ng ph¸p sau ®©y ®Ó biÓu diÔn thuËt to¸n:
- Ng«n ng÷ tù nhiªn.
- Lu ®å (s¬ ®å khèi).
- Tùa ng«n ng÷ lËp tr×nh (pseudo code = m· gi¶).
- Ng«n ng÷ lËp tr×nh.
2
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Trong c¸ch biÓu diÔn thuËt to¸n b»ng ng«n ng÷ tù nhiªn ngêi ta liÖt kª
c¸c bíc cña thuËt to¸n b»ng lêi. Nhîc ®iÓm cña c¸ch nµy lµ thêng chøa ®ùng
nh÷ng ®iÒu mËp mê, kh«ng râ rµng do ®Æc tÝnh cña ng«n ng÷ tù nhiªn.
BiÓu diÔn thuËt to¸n b»ng lu ®å gióp ta cã c¸ch nh×n tæng quan vÒ toµn
c¶nh cña qu¸ tr×nh xö lý theo thuËt to¸n. Tuy nhiªn nã còng cã mét sè nhîc
®iÓm vÝ dô tèn c«ng søc vµ thêi gian khi so¹n th¶o b»ng phÇn mÒm nh
word hay excel, ®Æc biÖt lµ víi thuËt to¸n phøc t¹p.
Ngµy nay ngêi ta thêng kÕt hîp nhiÒu c¸ch biÓu diÔn. VÝ dô, ®Çu tiªn m«
t¶ v¾n t¾t c¸c bíc cÇn thùc hiÖn b»ng ng«n ng÷ tù nhiªn. Sau ®ã dïng m·
gi¶ ®Ó chØ râ cÇn thùc hiÖn nh÷ng lÖnh g× nÕu cµi ®Æt ch¬ng tr×nh.
Cuèi cïng, nÕu m· gi¶ vÉn cha ®ñ râ rµng ®Ó ngêi lËp tr×nh cµi ®Æt trªn
m¸y tÝnh th× ngêi ta dïng mét ng«n ng÷ lËp tr×nh cµi ®Æt cho trêng hîp
®¬n gi¶n, cha chó ý ®Õn giao diÖn, cèt ®Ó lét t¶ ®îc nh÷ng ®iÒu cèt lâi
cña thuËt to¸n. Trong tµi liÖu nµy chóng t«i còng sÏ sö dông c¸ch phèi hîp
nµy trong truêng hîp cÇn thiÕt.

1.1.4. Ph©n tÝch thuËt to¸n


Mét thuËt to¸n thêng cã 6 ®Æc trng nãi trªn, trong ®ã tÝnh hiÖu qu¶ lµ
mét ®Æc trng kh¸ quan träng trong viÖc ¸p dông thuËt to¸n vµo thùc tÕ. §Ó
®¸nh gi¸ tÝnh hiÖu qu¶ cña thuËt to¸n, th«ng thêng ngoµi tÝnh ®óng ®¾n,
ngêi ta thêng dùa trªn 2 tiªu chuÈn sau ®©y:
(a) ThuËt to¸n ®¬n gi¶n, dÔ hiÓu, dÔ cµi ®Æt (dÔ viÕt ch¬ng tr×nh)
(b) ThuËt to¸n ch¹y nhanh vµ tiÕt kiÖm nhÊt c¸c nguån tµi nguyªn cña
m¸y tÝnh.
Khi ta viÕt ch¬ng tr×nh chØ ®Ó sö dông mét sè Ýt lÇn th× tiªu chuÈn (a)
cã vÎ quan träng h¬n. Lo¹i bµi to¸n ta thêng gÆp trong thùc tÕ thÝ dô ta cÇn
lËp ch¬ng tr×nh ®Ó nhËp sè liÖu cho nh÷ng cuéc ®iÒu tra x· héi häc. Mçi
cuéc ®iÒu tra nh vËy cã mét khu«n d¹ng c©u hái riªng vµ ch¬ng tr×nh
nhËp sè liÖu chØ dïng mét lÇn. Tuy vËy trong mäi trêng hîp chóng ta ®Òu
ph¶i tr¶ gi¸ cho sù ®¬n gi¶n hãa. Dï cho ch¬ng tr×nh chØ dïng mét lÇn nh-
ng nÕu ta viÕt qu¸ ®¬n gi¶n th× khi nhËp sè liÖu sÏ dÔ ph¹m nhiÒu lçi, sÏ
tèn nhiÒu c«ng ®Ó söa hoÆc kÕt qu¶ ph©n tÝch sÏ kh«ng chÝnh x¸c. V×
vËy theo chóng t«i chóng ta nªn lu ý ®Õn tiªu chuÈn (a) nhng kh«ng qu¸
chó ý vµo tiªu chuÈn nµy.
Vµo thêi kú kü thuËt m¸y tÝnh cha ph¸t triÓn, tèc ®é tÝnh to¸n vµ kh¶
n¨ng lu tr÷ cña m¸y tÝnh cßn h¹n chÕ th× tiªu chuÈn (b) rÊt ®îc chó ý.
Ngµy nay m¸y tÝnh c¸ nh©n ®· ®¹t ®Õn tèc ®é gÇn mét tû phÐp tÝnh /
gi©y, dung lîng bé nhí trong lªn ®Õn hµng chôc thËm chÝ hµng tr¨m Mb,
thiÕt bÞ nhí ngoµi lªn ®Õn hµng chôc Gb th× c¸c tiªu chuÈn trªn ®©y
kh«ng cßn lµ vÊn ®Ò qu¸ cÊp thiÕt n÷a. ThËt vËy, nÕu nh cïng thùc hiÖn
chøc n¨ng so¹n th¶o v¨n b¶n hay lµm c¸c trang tÝnh, c¸c phÇn mÒm
Wordstar hay Lotus 123 tríc ®©y chØ n»m gän trªn mét ®Üa mÒm th×
ngµy nay c¸c phÇn mÒm Microsoft Word hay Microsoft Excel ph¶i chøa trªn
®Üa CD-ROM. Ngay phong c¸ch lËp tr×nh còng thay ®æi. Chóng ta biÕt
r»ng lËp tr×nh b»ng ng«n ng÷ bËc thÊp lµ tiÕt kiÖm tèt nhÊt tµi nguyªn
m¸y tÝnh vµ b¶o ®¶m tèc ®é nhanh nhÊt. Tuy nhiªn ngêi lËp tr×nh sÏ rÊt
vÊt v¶ khi viÕt c¸c c©u lÖnh. §Ó gi¶i quyÕt mét vÊn ®Ò ngêi ta ph¶i viÕt
hµng v¹n dßng lÖnh, rÊt khã theo dâi vµ liªn kÕt chóng. Ngêi ta ®· dïng c¸c
ng«n ng÷ bËc cao nh C++, Visual Basic... ®Ó lËp tr×nh theo kiÓu m« dun
hãa hoÆc theo híng ®èi tîng. Nh vËy tuy cã l·ng phÝ vÒ dung lîng nhí hay
lµm cho tèc ®é tÝnh to¸n bÞ chËm h¬n, nhng ®æi l¹i, c«ng viÖc lËp tr×nh
cã thÓ chia cho nhiÒu ngêi vµ sau ®ã nèi ghÐp dÔ dµng.
3
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
VËy th× thùc ra cã cÇn tiªu tèn thêi gian ®Ó thiÕt kÕ c¸c thuËt to¸n hiÖu
qu¶ kh«ng? VÝ dô sau ®©y sÏ tr¶ lêi cho c©u hái nµy.

VÝ dô. TÝnh ®Þnh thøc ma trËn


Gi¶ sö cho ma trËn vu«ng A = [aij] nxn
Ta cã thÓ tÝnh ®Þnh thøc A theo c«ng thøc ®Ö quy sau:
NÕu n=1 det(A) = a11
n
NÕu n>1 det(A) = ∑ (−1)
j =1
a1j det(M1j)
(1+j)

(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.

1.1.5. §é phøc t¹p cña thuËt to¸n


a. §Þnh nghÜa.
Nh ta thÊy, yªu cÇu vÒ thêi gian vµ kh«ng gian ®Ó thùc hiÖn thuËt to¸n
trong nhiÒu trêng hîp lµ nh÷ng tiªu chuÈn ®¸ng lu ý khi x©y dùng thuËt
to¸n. Tuy nhiªn trong thùc tÕ kh«ng mÊy khi chóng ta cã ®îc gi¶i ph¸p trän
vÑn cho 2 yªu cÇu nµy. ViÖc xem xÐt ®é phøc t¹p vÒ kh«ng gian phô thuéc
phÇn lín vµo cÊu tróc d÷ liÖu ®îc sö dông trong cµi ®Æt thuËt to¸n. Trong
ph¹m vi tµi liÖu nµy chóng t«i sÏ chØ xÐt ®Õn ®é phøc t¹p vÒ thêi gian cña
thuËt to¸n.
Víi mét bµi to¸n, thêng kh«ng chØ cã mét thuËt to¸n. VËy lÊy tiªu chuÈn
g× ®Ó ta nãi r»ng thuËt to¸n nµy ch¹y nhanh h¬n thuËt to¸n kia? Cã lÏ ý
nghÜ ®Çu tiªn ®Õn víi chóng ta lµ ta thö tÊt c¶ c¸c thuËt to¸n trªn m¸y
tÝnh, thuËt to¸n nµo ch¹y Ýt thêi gian h¬n th× ta nãi r»ng thuËt to¸n ®ã
ch¹y nhanh h¬n. Lµm nh vËy xem ra còng cã lý v× chÝnh thùc tiÔn lµ thíc
®o ch©n lý. Tuy nhiªn c¸ch lµm nµy sÏ cã mét sè khã kh¨n sau:
- Ta ph¶i viÕt ch¬ng tr×nh cho tÊt c¶ c¸c thuËt to¸n vµ ®iÒu nµy rÊt khã
thùc hiÖn v× ®«i khi tèn qu¸ nhiÒu c«ng søc. ThËm chÝ ®«i khi gÆp
ph¶i thuËt to¸n nh bµi to¸n th¸p Hµ Néi víi n lín th× ta ®µnh ph¶i t¾t
m¸y mµ kh«ng cã ®îc ®¸nh gi¸ vÒ thêi gian.
4
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
- Ta kh«ng thÓ trao ®æi th«ng tin vÒ ®é nhanh chËm cña thuËt to¸n víi
bªn ngoµi, v× cïng mét thuËt to¸n khi ch¹y ë c¸c m¸y víi cÊu h×nh kh¸c
th× thêi gian tÝnh to¸n sÏ kh¸c.
Râ rµng c¸ch ®¸nh gi¸ thêi gian tÝnh to¸n b»ng gi©y b»ng phót lµ kh«ng
thÝch hîp khi ®¸nh gi¸ thêi gian tÝnh to¸n cña mét thuËt to¸n. Ngêi ta dïng
mét tiªu chuÈn kh¸c lµ sè phÐp tÝnh s¬ cÊp cÇn thiÕt ®Ó thùc hiÖn thuËt
to¸n. Tuy nhiªn còng kh«ng dÔ g× tÝnh to¸n ®îc sè phÐp tÝnh cÇn thiÕt
ngay c¶ víi c¸c thuËt to¸n ®¬n gi¶n. Trong c¸c thÝ dô trªn ta thÊy sè phÐp
tÝnh thêng phô thuéc vµo cì cña sè liÖu vµo. Trong thÝ dô tÝnh ®Þnh thøc,
cì cña d÷ liÖu lµ cÊp cña ®Þnh thøc, trong bµi to¸n th¸p Hµ néi lµ sè ®Üa
®Æt t¹i cäc A...Ta cã thÓ nhËn xÐt r»ng sè phÐp tÝnh cÇn thiÕt thêng phô
thuéc vµo cì d÷ liÖu, do vËy ta cã thÓ coi nã nh mét hµm cña n, tøc lµ T(n).
MÆt kh¸c ta cã thÓ thÊy T(n) kh«ng ph¶i lµ hµm ®¬n trÞ ®èi víi mét thuËt
to¸n. ThÝ dô ta xÐt bµi to¸n kiÓm tra xem sè x cho tríc cã mÆt trong d·y
{a1, a2,..., an} hay kh«ng. ThuËt to¸n ë ®©y lµ so s¸nh a víi tõng phÇn tö
cña d·y, nÕu gÆp ai = x th× dõng l¹i. Ta thÊy ngay nÕu a1 = x th× chØ cÇn
1 phÐp so s¸nh, cßn nÕu ai ≠ x, i = 1,...,n th× sè phÐp so s¸nh lµ n. VËy nãi
chung ta chØ cã thÓ ®a ra ®¸nh gi¸ vÒ T(n) mµ th«i.

§Þ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).

b. Sù ph©n líp c¸c thuËt to¸n


Nh ®· nãi ®Õn ë trªn, hÇu hÕt c¸c thuËt to¸n ®Òu cã mét tham sè chÝnh
lµ N, th«ng thêng lµ sè lîng c¸c phÇn tö d÷ liÖu ®îc xö lý mµ cã ¶nh hëng
rÊt nhiÒu tíi thêi gian ch¹y. Tham sè N cã thÓ lµ bËc cña ®a thøc, kÝch thíc
cña mét tËp tin cÇn s¾p xÕp hay t×m kiÕm, sè nót trong ®å thÞ,.v.v...
HÇu hÕt c¸c thuËt to¸n th«ng dông cã thêi gian ch¹y tiÖm cËn tíi mét
trong c¸c hµm sau:
1 HÇu hÕt c¸c chØ thÞ cña ch¬ng tr×nh ®Òu ®îc thùc hiÖn mét lÇn
hay nhiÒu nhÊt chØ mét vµi lÇn. NÕu tÊt c¶ c¸c chØ thÞ cña mét ch-
¬ng tr×nh cã tÝnh chÊt nµy th× chóng ta sÏ nãi r»ng thêi gian ch¹y
cña nã lµ h»ng sè.
LgN Thêi gian ch¹y cña ch¬ng tr×nh lµ logarit, tøc lµ thêi gian ch¹y cña
ch¬ng tr×nh tiÕn chËm khi N lín dÇn. Trêng hîp nµy thêng x¶y ra
khi ta gi¶i mét bµi to¸n lín b»ng c¸ch chuyÓn nã thµnh bµi to¸n nhá
h¬n cã kÝch thíc a*N víi a<1. C¬ sè cña logarit lµm thay ®æi h»ng
sè C trong ®Þnh nghÜa ®é phøc t¹p tÝnh to¸n nhng kh«ng nhiÒu:
khi N lµ 1000 (~ 210) th× log2N lµ 10, khi N 1 000 000 th× log2N lµ
20. NÕu N ®îc nh©n ®«i th× log2N ®îc céng thªm mét h»ng sè
nhng kh«ng bÞ nh©n ®«i; chØ khi N t¨ng lªn ®Õn N2 th× log2N míi
bÞ nh©n ®«i. Nãi c¸ch kh¸c, nÕu ta cho N t¨ng theo hµm mò th×
log2N chØ t¨ng tuyÕn tÝnh.
N Thêi gian ch¹y lµ tuyÕn tÝnh. §©y lµ trêng hîp mµ mét sè lîng nhá c¸c
xö lý ®îc thùc hiÖn cho mçi phÇn tö d÷ liÖu nhËp. §©y lµ t×nh
huèng tèi u cho mét thuËt to¸n mµ ph¶i xö lý N d÷ liÖu nhËp.
NlogN Thêi gian ch¹y cña ch¬ng tr×nh lµ tuyÕn tÝnh logarit. Ta thêng gÆp
khi gi¶i bµi to¸n b»ng c¸ch t¸ch nã thµnh c¸c bµi to¸n con nhá h¬n,

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.

c. ý nghÜa cña ®é phøc t¹p thuËt to¸n trong thùc hµnh


Ký hiÖu O rÊt cã Ých trong viÖc gióp ®ì c¸c nhµ ph©n tÝch ph©n lo¹i c¸c
thuËt to¸n ®Ó t×m ra thuËt to¸n tèt nhÊt. Tuy nhiªn ph¶i v« cïng cÈn thËn
khi ¸p dông c¸c kÕt qu¶ tõ ký hiÖu O v× 4 lý do sau ®©y:
- Tríc tiªn nã lµ mét “chÆn trªn” vµ ®¹i lîng trong thùc tÕ cã thÓ thÊp h¬n
nhiÒu.
- D÷ liÖu nhËp trong trêng hîp xÊu nhÊt cã thÓ Ýt x¶y ra trong thùc tÕ.
- H»ng sè C kh«ng ®îc biÕt vµ kh«ng cÇn nhá.
- H»ng sè N0 kh«ng ®îc biÕt vµ kh«ng cÇn nhá.
Thêng ngêi ta cè g¾ng t×m ra mét bé d÷ liÖu mµ thêi gian ch¹y lµ
O(f(N)), nhng cã nhiÒu thuËt to¸n rÊt khã x©y dùng ®îc d÷ liÖu nhËp trong
trêng hîp xÊu nhÊt. Còng cã nh÷ng thuËt to¸n v« cïng h÷u Ých nhng l¹i cã
trêng hîp xÊu nhÊt rÊt tåi. ThÝ dô nh thuËt to¸n s¾p xÕp ®îc dïng réng r·i
nhÊt lµ QuickSort cã thêi gian ch¹y lµ O(N 2) nhng cã thÓ dµn xÕp sao cho
thêi gian ch¹y ®èi víi c¸c d÷ liÖu nhËp thêng gÆp trong thùc tÕ lµ NlgN.
C¸c h»ng sè C vµ N0 trong ký hiÖu O thêng che dÊu c¸c chi tiÕt cµi ®Æt
®ãng vai trß quan träng trong thùc tÕ. HiÓn nhiªn khi ta nãi mét thuËt to¸n
cã thêi gian ch¹y lµ O(f(N)) th× sÏ kh«ng bµn g× ®îc vÒ thêi gian ch¹y khi N
nhá h¬n N0. Chóng ta thÝch mét thuËt to¸n ch¹y N2 nano gi©y h¬n thuËt
to¸n ch¹y logN thÕ kû, nhng ký hiÖu O l¹i kh«ng lµm râ ®îc ®iÒu nµy. Mét
tiÕp cËn kh¸c trong nghiªn cøu tÝnh n¨ng cña thuËt to¸n lµ kh¶o s¸t truêng
hîp trung b×nh. Tuy nhiªn thêng th× viÖc ph©n tÝch nµy thêng cã nh÷ng
®ßi hái to¸n häc qu¸ khã, ®«i khi chóng ta kh«ng thÓ t×m ®îc d÷ liÖu nhËp
®Æc trng thêng gÆp trong thùc tÕ thÝ dô nh trêng hîp ®¸nh gi¸ thêi gian
ch¹y trung b×nh cho ch¬ng tr×nh xö lý v¨n b¶n tiÕng Anh . HiÖn nay chóng
ta cha biÕt ®îc tÝnh n¨ng trong trêng hîp trung b×nh cña rÊt nhiÒu thuËt
to¸n.
Thêng th× thuËt to¸n cã ®é phøc t¹p tÝnh to¸n ®a thøc ®îc coi lµ kh¶ thi
trong thùc tÕ. Tuy nhiªn nh chóng t«i ®· nh¾c ®Õn, ngay trong trêng hîp
nµy viÖc thuËt to¸n cã ý nghÜa hay kh«ng cßn tïy thuéc vµo thùc tÕ ¸p
dông. ThÝ dô trong c¸c ®iÒu khiÓn thêi gian thùc ta ph¶i cã kÕt qu¶ gÇn
nh tøc th×, vËy th× nÕu thuËt to¸n cã ®é phøc t¹p ®a thøc cha ch¾c ®·
øng dông ®îc. Hay mét ch¬ng tr×nh nhËp sè liÖu ch¼ng h¹n, thuËt to¸n
ph¶i b¶o ®¶m ®ñ nhanh ®Ó ngêi nhËp sè liÖu kh«ng ph¶i chê ®îi. §ã lµ ch-
7
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
a kÓ trong thùc tÕ viÖc ®¸nh gi¸ ®é phøc t¹p thuËt to¸n nhiÒu khi lµ bµi
to¸n rÊt khã. VËy th× cã thÓ nãi r»ng ®é phøc t¹p tÝnh to¸n cã lÏ mang ý
nghÜa lý thuyÕt nhiÒu h¬n. Do ®ã trong tµi liÖu nµy chóng t«i sÏ kh«ng qu¸
chó träng ®Õn viÖc ®¸nh gi¸ thuËt to¸n qua ®é phøc t¹p tÝnh to¸n.

1.2. ThuËt gi¶i


Trong thùc tÕ cµng ngµy chóng ta gÆp cµng nhiÒu nh÷ng vÊn ®Ò mµ rÊt
khã t×m ®îc thuËt to¸n ®Ó gi¶i quyÕt, nÕu tu©n thñ ®óng c¸c ®Æc trng
trªn ®©y. Tuy nhiªn nÕu ta lµm mÒm ®i 2 tÝnh chÊt quan träng vµ tëng
nh kh«ng thÓ vi ph¹m cña thuËt to¸n lµ tÝnh x¸c ®Þnh vµ tÝnh hiÖu qu¶
th× cã thÓ t×m ®îc lêi gi¶i cho mét sè bµi to¸n phøc t¹p. V× vËy thuËt ng÷
thuËt to¸n trong mét sè trêng hîp ®· ®îc hiÓu theo mét nghÜa réng h¬n. ý
nghÜa cña nã gÇn gièng víi c¸c kh¸i niÖm: qu¸ tr×nh, ph¬ng ph¸p, thñ tôc,
kü thuËt... (recipe, proccess, method, technique, procedure, routine,
rigmarole,....) Trong nhiÒu tµi liÖu, c¸c thuËt ng÷ "thuËt gi¶i" vµ "thuËt
to¸n" ®îc dïng ®Õn mµ kh«ng cã sù ph©n biÖt. Trong tµi liÖu nµy tõ ®©y
trë vÒ sau nÕu kh«ng nhÊn m¹nh g× thªm th× chóng t«i sÏ dïng thuËt ng÷
"thuËt gi¶i" hoÆc "gi¶i thuËt" hoÆc cã thÓ lµ "thuËt to¸n" ®Ó chØ sù më
réng cña thuËt to¸n ®· ®îc ®Þnh nghÜa víi c¸c ®Æc trng tríc ®©y. Mét
trong nh÷ng sù më réng lý thó nhÊt cña thuËt to¸n lµ ph¬ng ph¸p ®Ö quy
(mét sè t¸c gi¶ gäi lµ thuËt to¸n ®Ö quy) mµ chóng ta sÏ xÐt sau ®©y.

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.

b. C¸c ch¬ng tr×nh ®Ö quy ho¹t ®éng nh thÕ nµo?


Mäi ch¬ng tr×nh khi thi hµnh ®Òu cã mét vïng nhí ®Ó dïng lµm stack,
tøc lµ phÇn bé nhí ®îc tæ chøc theo kiÓu vµo sau ra tríc (LIFO). Trong c¸c
thÕ hÖ m¸y tÝnh cò stack cha ®îc thiÕt kÕ. Tõ c¸c bé vi xö lý 8088 ngêi ta
®· ®a ng¨n xÕp vµo bé nhí m¸y tÝnh vµ stack ®îc coi lµ mét trong nh÷ng
phô tïng ®Æc s¾c nhÊt cña c¸c m¸y tÝnh hiÖn ®¹i. §ã lµ mét phÇn cña RAM
ë phÇn ®Þa chØ cao nhÊt cha sö dông. Cã thÓ ®a sè liÖu vµo ng¨n xÕp
b»ng lÖnh PUSH, vµ lÊy chóng ra b»ng lÖnh POP cña hîp ng÷ (assembly).
Khi mét hµm ®îc gäi th× khung kÝch ho¹t (activation frame) cña nã ®îc t¹o
ra trong bé nhí stack. Khung kÝch ho¹t chøa c¸c biÕn côc bé cña hµm vµ b¶n
ghi ho¹t ®éng (active record). B¶n ghi ho¹t ®éng chøa ®Þa chØ trë vÒ cña
hµm gäi nã vµ c¸c tham sè cña hµm ®ã. Sau khi hµm ®îc gäi thùc hiÖn
xong th× ®iÒu khiÓn ®îc tr¶ vÒ cho hµm gäi nã vµ hµm nµy l¹i thùc hiÖn
tiÕp c«ng viÖc tõ ®Þa chØ trë vÒ mµ b¶n ghi ho¹t ®éng cung cÊp, sau ®ã
khung kÝch ho¹t ®îc xãa khái stack.
Khi cã mét lêi gäi ®Ö quy th× viÖc g× sÏ x¶y ra? Ch¬ng tr×nh lóc nµy
xem hµm cã lêi gäi ®Ö quy lµ mét hµm míi vµ t¹o mét mét khung kÝch ho¹t
míi cho nã. Cø nh vËy cho ®Õn khi gÆp trêng hîp dõng th× hµm b¾t ®Çu
®îc tÝnh to¸n. Qu¸ tr×nh lÇn ngîc trë l¹i hµm chøa lêi gäi ®Çu tiªn vµ bé nhí
stack ®îc gi¶i phãng dÇn. Nh vËy nÕu cÊp ®Ö quy cµng cao th× sè khung
kÝch ho¹t trong stack cµng nhiÒu nªn cµng chiÕm dông bé nhí.

§Ó minh häa, ta xÐt 2 vÝ dô sau:


VÝ dô 1. Ch¬ng tr×nh ®Ö quy sau cho ta gi¸ trÞ cña n! víi n nguyªn:
long giaithua(int n) {return(n == 0 ? 1 : n * giaithua(n-1)); }
Ta nhËn xÐt r»ng trong th©n hµm chØ cã mét lêi gäi ®Ö quy duy nhÊt
xuèng cÊp thÊp. Ngêi ta gäi d¹ng ®Ö quy nµy lµ ®Ö quy ®u«i. §èi víi d¹ng
®Ö quy ®u«i mµ hµm tr¶ vÒ gi¸ trÞ th× ta cã thÓ dÔ dµng thay b»ng thñ
tôc lÆp ch¹y nhanh h¬n vµ tèn Ýt bé nhí h¬n. Thay cho viÖc xuÊt ph¸t tõ
møc cao rót gän dÇn xuèng møc thÊp råi l¹i lÇn ngîc ®Õn møc cao, chóng
9
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
ta cã thÓ xuÊt ph¸t ngay tõ møc thÊp vµ lÇn lît ¸p dông ®Þnh nghÜa ®Ö
quy ®Ó t×m gi¸ trÞ hµm t¹i c¸c sè nguyªn lín dÇn. C¸ch lµm nµy ®îc gäi lµ
thñ tôc lÆp vµ ®îc thÓ hiÖn b»ng c¸c dßng lÖnh nh sau:
long giaithua(int n) {if(n==0) return(1); long tmp=1;
for(int i=1;i<=n;i++) tmp*=i;
return(tmp);
}
Trong trêng hîp trªn ®©y thñ tôc lÆp hiÖu qu¶ h¬n nhng sù kh¸c biÖt
gi÷a 2 ph¬ng ph¸p kh«ng lín l¾m. Mét ®iÓm cÇn lu ý lµ nÕu gäi ch¬ng
tr×nh ®Ö quy trªn ®èi víi sè ©m ta sÏ bÞ mét vßng lÆp v« h¹n; ®©y lµ mét
lçi thêng x¶y ra mµ cã thÓ xuÊt hiÖn tinh vi h¬n ®èi víi c¸c ch¬ng tr×nh
®Ö quy phøc t¹p.

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.

c. §Ö quy vµ quy n¹p to¸n häc


Cã mét quan hÖ kh¨ng khÝt gi÷a ®Ö quy vµ quy n¹p to¸n häc, vµ quy n¹p
to¸n häc thêng ®îc dïng ®Ó chøng minh c¸c tÝnh chÊt liªn quan ®Õn thuËt
gi¶i ®Ö quy. Ch¼ng h¹n b¹n ®äc kh«ng khã kh¨n g× cã thÓ chøng minh
tÝnh ®óng ®¾n cña ch¬ng tr×nh giaihua nãi trªn vµ chøng minh c«ng thøc
vÒ sè lÇn chuyÓn ®Üa trong bµi to¸n th¸p Hµ Néi.
Trong c¸c phÇn sau cña tµi liÖu nµy chóng ta sÏ cßn trë l¹i t×m hiÓu vÒ
®Ö quy vµ c¸c øng dông cña nã.

d. §Ö quy cã ph¶i lµ thuËt to¸n víi s¸u ®Æc trng ®· ®Þnh


nghÜa kh«ng?
NÕu theo ®Þnh nghÜa th× thuËt to¸n bao gåm h÷u h¹n bíc ®Ó ®i ®Õn
kÕt qu¶. VÒ nguyªn t¾c, mét bíc cña thuËt to¸n ph¶i ®îc x¸c ®Þnh ngay t¹i
thêi ®iÓm bíc ®ã ®îc thi hµnh, nhng víi thuËt to¸n ®Ö quy, bíc thø n kh«ng
®îc x¸c ®Þnh ngay mµ ph¶i x¸c ®Þnh th«ng qua mét bíc thÊp h¬n. Ch¼ng
h¹n ®Ó tÝnh sè Fibonacci f5 th× ta ph¶i tÝnh f4 + f3 nhng c¸c gi¸ trÞ nµy ta
cha biÕt t¹i thêi ®iÓm nµy. Nh vËy ®Ö quy vi ph¹m tÝnh chÊt x¸c ®Þnh cña
thuËt to¸n. Khi ta gäi thuËt to¸n ®Ö quy nghÜa lµ ta ®· hiÓu thuËt to¸n
theo nghÜa më réng, trong ®ã tÝnh chÊt x¸c ®Þnh ®· ®îc "níi láng".

1.2.2. Më réng kh¸i niÖm thuËt to¸n: thuËt gi¶i


Nh chóng ta võa xÐt ë trªn, c¸ch gi¶i ®Ö quy kh«ng ®¸p øng ®Çy ®ñ c¸c
yªu cÇu ®èi víi mét thuËt to¸n. §ã lµ mét sù më réng kh¸i niÖm thuËt to¸n.
Trong qu¸ tr×nh nghiªn cøu gi¶i quyÕt c¸c bµi to¸n vµ ¸p dông vµo thùc tÕ,
ngêi ta nhËn thÊy cã c¸c t×nh huèng sau ®©y:
a) Cã nh÷ng bµi to¸n cho ®Õn nay vÉn cha cã lêi gi¶i theo kiÓu thuËt
to¸n vµ còng kh«ng biÕt cã tån t¹i thuËt to¸n hay kh«ng.
b) Cã nh÷ng bµi to¸n ®· cã thuËt to¸n nhng kh«ng chÊp nhËn ®îc v×
kh«ng ®¸p øng ®îc yªu cÇu thùc tÕ.
c) Cã nh÷ng bµi to¸n ®îc gi¶i theo c¸ch gi¶i vi ph¹m thuËt to¸n nhng vÉn
®îc chÊp nhËn; thËm chÝ trong c¶ trêng hîp bµi to¸n ®ã cã lêi gi¶i theo
kiÓu thuËt to¸n nhng kh«ng ®¸p øng ®îc yªu cÇu thùc tÕ.
C¸c bµi to¸n thuéc nhãm a) cã thÓ thÊy rÊt nhiÒu trong c¸c tµi liÖu. Sau
®©y chóng t«i xin chØ ra mét sè vÝ dô minh häa cho b) vµ c):

VÝ dô 1. Bµi to¸n ngêi b¸n hµng.


Mét nh©n viªn ph©n phèi hµng cho mét c«ng ty ®îc giao nhiÖm vô ph¶i
giao hµng cho c¸c ®¹i lý cña c«ng ty, sau ®ã trë vÒ c«ng ty. Bµi to¸n ®Æt
ra lµ nh©n viªn nµy ph¶i chän hµnh tr×nh nh thÕ nµo ®Ó tæng qu¶ng ®-
êng ®i tõ khi xuÊt ph¸t ®Õn khi trë vÒ lµ ng¾n nhÊt.
Gi¶ sö cã n ®¹i lý. Ta cã thÓ thÊy ngay c¸ch gi¶i chÝnh x¸c lµ liÖt kª tÊt c¶
c¸c hµnh tr×nh cã thÓ cã vµ chän hµnh tr×nh ng¾n nhÊt. Tuy nhiªn c¸ch
gi¶i nµy l¹i cã ®é phøc t¹p tÝnh to¸n O(n!). Nh ta sÏ thÊy ë phÇn sau, ngêi ta
®· ¸p dông nguyªn lý "tham lam" ®Ó t×m mét lêi gi¶i kh¸ tèt cho bµi to¸n
nµy víi ®é phøc t¹p chÊp nhËn ®îc.

VÝ dô 2. §¸nh gi¸ chÊt lîng s¶n phÈm.

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.2.3. ThuËt gi¶i vµ cÊu tróc d÷ liÖu


Th«ng thêng chóng ta vÉn hiÓu viÖc gi¶i quyÕt mét bµi to¸n lµ t×m thuËt
gi¶i cho bµi to¸n ®ã. Khi cã ®îc thuËt gi¶i ta míi thÓ hiÖn chóng b»ng c¸c
c©u lÖnh vµ cµi ®Æt trªn m¸y tÝnh. Cã thÓ nãi thuËt to¸n lµ “chÊt liÖu”
cña khoa häc m¸y tÝnh, lµ ®èi tîng nghiªn cøu trung t©m trong nhiÒu lÜnh
vùc cña tin häc. HÇu hÕt c¸c thuËt to¸n quan träng cÇn ®Õn c¸c ph¬ng
ph¸p tæ chøc d÷ liÖu trong lóc tÝnh to¸n. C¸c ®èi tîng ®îc t¹o ra theo c¸ch
nµy ®îc gäi lµ c¸c cÊu tróc d÷ liÖu, vµ chóng còng lµ c¸c ®èi tîng trung
t©m cÇn nghiªn cøu trong khoa häc m¸y tÝnh. V× vËy c¸c thuËt to¸n vµ cÊu
tróc d÷ liÖu thêng ®i liÒn víi nhau. C¸c thuËt to¸n ®¬n gi¶n cã thÓ ph¸t
sinh víi c¸c cÊu tróc d÷ liÖu phøc t¹p vµ ngîc l¹i, c¸c thuËt to¸n phøc t¹p cã
thÓ chØ dïng c¸c cÊu tróc d÷ liÖu ®¬n gi¶n. VÒ mèi liªn quan gi÷a thuËt
to¸n vµ cÊu tróc d÷ liÖu, Niklaus Wirth, nhµ to¸n häc vµ tin häc næi tiÕng
ngêi Thôy sÜ , ngêi ®· s¸ng t¹o ra ng«n ng÷ lËp tr×nh Pascal, ®· tãm t¾t
trong mét c©u næi tiÕng:
CÊu tróc d÷ liÖu + Gi¶i thuËt = Ch¬ng tr×nh.
Chóng ta ®· t×m hiÓu vÒ kh¸i niÖm gi¶i thuËt. B©y giê chóng ta sÏ xem
xÐt kh¸i niÖm "cÊu tróc d÷ liÖu" mét c¸ch ®Çy ®ñ h¬n. ThuËt ng÷ "cÊu
tróc d÷ liÖu" bao gåm hai thµnh phÇn: "cÊu tróc" vµ "d÷ liÖu".
CÊu tróc ®îc hiÓu lµ c¸c thµnh phÇn vµ c¸ch thøc liªn kÕt gi÷a chóng
®Ó t¹o nªn mét chØnh thÓ nµo ®ã. VËy còng cã thÓ nãi ®¬n gi¶n lµ: cÊu
tróc lµ mét chØnh thÓ ®îc t¹o nªn bëi nhiÒu thµnh phÇn vµ c¸c thµnh phÇn
12
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
nµy liªn kÕt víi nhau theo mét c¸ch thøc nµo ®ã. Ta nãi cÊu tróc cña ng«i
nhµ chÝnh lµ nãi ng«i nhµ ®îc t¹o nªn bëi nh÷ng thµnh phÇn nµo vµ c¸ch
thøc mµ c¸c thµnh phÇn nµy liªn kÕt víi nhau ra sao. NÕu lµ ng«i nhµ l¸ ë
n«ng th«n th× ®ã lµ kÌo, cét,... Sù liªn kÕt gi÷a chóng lµ chèt hoÆc
®inh...Hay ta nãi cÊu tróc c©u nghÜa lµ nãi r»ng c©u ®îc t¹o thµnh bëi chñ
ng÷, vÞ ng÷, tr¹ng ng÷... vµ c¸c thµnh phÇn nµy bæ nghÜa cho nhau nh
thÕ nµo, phÇn nµo ®øng tríc, phÇn nµo ®øng sau... Trong tin häc thuËt
ng÷ "cÊu tróc d÷ liÖu" lµ nãi vÒ cÊu tróc mµ thµnh phÇn cña nã lµ d÷ liÖu.
NÕu nãi râ h¬n th× cÊu tróc d÷ liÖu lµ d÷ liÖu ®îc tæ chøc mét c¸ch hîp lý
trªn thiÕt bÞ nhí sao cho phï hîp víi nhiÖm vô ®Æt ra (thêng lµ c¸c thao t¸c
cËp nhËt, t×m kiÕm, truy xuÊt th«ng tin).
Mét vµi ghi chó vÒ thuËt ng÷: hiÖn nay trong c¸c tµi liÖu tiÕng ViÖt cã t¸c
gi¶ dïng thuËt ng÷ “thuËt gi¶i” còng cã t¸c gi¶ gäi lµ “gi¶i thuËt”. V× mét
vµi tµi liÖu ®Çu tiªn vÒ lÜnh vùc nµy dïng thuËt ng÷ “gi¶i thuËt”, do ®ã tõ
®©y trë vÒ sau chóng ta sÏ thèng nhÊt dïng thuËt ng÷ “gi¶i thuËt”. Tõ ch-
¬ng 2 cña tµi liÖu nµy chóng ta sÏ t×m hiÓu c¸ch cµi ®Æt mét sè cÊu tróc
d÷ liÖu hay dïng trong lËp tr×nh.

1.3. Gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh


1.3.1. Kh¸i niÖm vÒ vÊn ®Ò vµ bµi to¸n
Cã thÓ nãi, mäi c¸ nh©n còng nh mäi céng ®ång x· héi ph¶i liªn tôc gi¶i
quyÕt nh÷ng vÊn ®Ò vµ bµi to¸n ®Æt ra trong qu¸ tr×nh tån t¹i vµ ph¸t
triÓn. Nhµ to¸n häc cæ Hy l¹p Pitago ®· ph©n chia mäi vÊn ®Ò mµ con ngêi
ph¶i gi¶i quyÕt thµnh 2 lo¹i:
- Theorema lµ vÊn ®Ò cÇn ®îc kh¼ng ®Þnh ®óng-sai. Chóng ta thêng
quen víi lo¹i vÊn ®Ò nµy qua viÖc chøng minh c¸c ®Þnh lý trong to¸n
häc.
- Problema lµ vÊn ®Ò cÇn t×m gi¶i ph¸p ®Ó ®¹t ®îc mét môc tiªu x¸c
®Þnh tõ nh÷ng ®iÒu kiÖn ban ®Çu nµo ®ã.
NhiÒu nhµ nghiªn cøu ®· chØ ra r»ng, c¶ 2 lo¹i vÊn ®Ò mµ Pitago ®· nªu
ra ®Òu cã thÓ diÔn ®¹t theo mét s¬ ®å chung:
A -> B
Trong ®ã:
A cã thÓ lµ gi¶ thiÕt, ®iÒu kiÖn ban ®Çu.
B cã thÓ lµ kÕt luËn, môc tiªu cÇn ®¹t.
-> lµ suy luËn, gi¶i ph¸p cÇn x¸c ®Þnh.
Theo s¬ ®å nµy, viÖc cho mét vÊn ®Ò cã nghÜa lµ cho A vµ B. ViÖc
gi¶i quyÕt vÊn ®Ò cã nghÜa lµ xuÊt ph¸t tõ A sau mét sè h÷u h¹n c¸c bíc
suy luËn cã lý hoÆc hµnh ®éng thÝch hîp ®Ó ®¹t ®îc B. §èi víi tin häc A
®îc hiÓu lµ ®¹i lîng vµo, B lµ ®¹i lîng ra, vµ -> lµ ch¬ng tr×nh m¸y tÝnh.
Nh ta thÊy, ch¬ng tr×nh chØ lµ mét c¸ch m· hãa l¹i thuËt to¸n hoÆc thuËt
gi¶i ®· ®îc x©y dùng ®Ó gi¶i quyÕt vÊn ®Ò ®· cho.
§Ó cho ®¬n gi¶n trong c¸ch diÔn ®¹t, nhiÒu lóc trong c¸ch gäi ta kh«ng
ph©n biÖt hai kh¸i niÖm trªn mµ chØ nãi ng¾n gän lµ bµi to¸n hoÆc vÊn
®Ò.

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

2.1. Danh s¸ch tæng qu¸t


2.1.1. §Þnh nghÜa
Danh s¸ch tuyÕn tÝnh (linear list) hay cßn gäi ®¬n gi¶n lµ danh s¸ch,
lµ mét cÊu tróc d÷ liÖu gåm mét d·y h÷u h¹n c¸c phÇn tö ®îc s¾p
®Æt theo mét trËt tù tuyÕn tÝnh, nghÜa lµ víi hai phÇn tö bÊt kú ta
cã thÓ nãi r»ng phÇn tö nµo ®øng tríc, phÇn tö nµo ®øng sau. Mét danh
s¸ch kh¸c rçng lu«n cã phÇn tö ®Çu tiªn: lµ phÇn tö ®øng tríc tÊt c¶ c¸c
phÇn tö kh¸c, vµ phÇn tö cuèi cïng: lµ phÇn tö ®øng sau mäi phÇn tö
kh¸c.
Danh s¸ch lµ cÊu tróc d÷ liÖu ®¬n gi¶n nhÊt thêng gÆp trong tin häc.
Th«ng thêng mét danh s¸ch L cã thÓ biÓu diÔn díi d¹ng sau:

L = (a0,a1, a2,... ,an-1), n>=0 (2.1)

Ta gäi n lµ ®é dµi cña danh s¸ch. NÕu n = 0, tøc lµ danh s¸ch


kh«ng cã phÇn tö nµo, th× danh s¸ch ®îc gäi lµ rçng. NÕu n>0 th× a0
®îc gäi lµ phÇn tö ®Çu tiªn cßn an-1 lµ phÇn tö cuèi cïng cña danh
s¸ch. Víi 2 phÇn tö ai vµ aj bÊt kú vµ i<j ta nãi r»ng phÇn tö ai
®øng tríc phÇn tö aj. Víi i ≥ 0 vµ i ≤ n-1 ta nãi r»ng ai lµ phÇn tö thø i
cña danh s¸ch.
Kh¸c víi c¸c cÊu tróc kh¸c nh m¶ng, c©y, ®å thÞ,... thuËt ng÷ “danh
s¸ch” ®îc dïng thêng xuyªn trong ®êi sèng hµng ngµy. Ta vÉn hay nãi
®Õn danh s¸ch c¸c bµ mÑ ViÖt nam anh hïng, danh s¸ch thÝ sinh tróng
tuyÓn vµo mét trêng ®¹i häc, danh s¸ch c¸c thiÕt bÞ cÇn thiÕt ®Ó l¾p
®Æt mét phßng thÝ nghiÖm... Ta h·y xÐt mét vÝ dô ®¬n gi¶n vÒ danh
s¸ch sau ®©y:
§Ó chuÈn bÞ cho mét b÷a liªn hoan “tù biªn tù diÔn”, chóng ta ph¶i ra
chî víi mét danh s¸ch c¸c thø cÇn mua:
1 kÐt bia Halida
1 kÐt coca-cola
3 kg xóc xÝch
2 kg r¨m b«ng
0.5 kg b¬
2 kg da chuét
30 b¸nh m×
5 b¸nh ga t«
3 kg cam

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Õ.

2.1.2. C¸c phÐp to¸n c¬ b¶n


C¸c t¸c vô trªn danh s¸ch thêng phô thuéc øng dông cô thÓ. C¸c thao
t¸c sau ®©y lµ nh÷ng thao t¸c thêng gÆp nhÊt:
• Thªm mét nót vµo danh s¸ch.
• Xãa mét nót trªn danh s¸ch.
• S¾p xÕp l¹i c¸c nót theo thø tù t¨ng hoÆc gi¶m dÇn theo mét trêng
nµo ®ã.
• T×m kiÕm nót cã trêng mang th«ng tin cho tríc.

2.1.3. C¸c ph¬ng ph¸p cµi ®Æt danh s¸ch


Danh s¸ch cã thÓ cµi ®Æt trªn tÖp hoÆc trong bé nhí. D÷ liÖu lu trªn
tÖp cã thÓ lu gi÷ l©u dµi nhng thêi gian truy xuÊt chËm. NÕu cµi ®Æt
trong bé nhí th× cã thÓ thao t¸c nhanh nhng l¹i cã nhîc ®iÓm lµ d÷ liÖu
bÞ mÊt khi t¾t m¸y. Ngêi ta thêng dïng c¸ch kÕt hîp lµ danh s¸ch ®îc lu
gi÷ trªn tÖp nhng khi thao t¸c th× mét phÇn hoÆc toµn bé danh s¸ch ®îc
®æ vµo bé nhí. Trong qu¸ tr×nh thao t¸c, d÷ liÖu cã thÓ ®îc lu vµo tÖp
khi cÇn thiÕt. Cµi ®Æt ë bé nhí trong hay trªn tÖp ë thiÕt bÞ nhí ngoµi
còng cã nhiÒu c¸ch thøc kh¸c nhau. Trong c¸c môc tiÕp theo chóng ta sÏ
t×m hiÓu c¸c ph¬ng ph¸p cµi ®Æt danh s¸ch trong bé nhí. Hai ph¬ng
ph¸p c¬ b¶n lµ dïng m¶ng (tÜnh hoÆc ®éng) hoÆc chuçi c¸c phÇn tö cã
liªn kÕt. Dïng m¶ng hay m¶ng ®éng th× bé nhí sö dông ph¶i lµ mét vïng
liªn tôc, vµ vïng nµy ph¶i ®îc x¸c ®Þnh tríc khi biªn dÞch ch¬ng tr×nh
(m¶ng tÜnh) hoÆc tríc khi sö dông danh s¸ch (m¶ng ®éng). Nh÷ng lý do
nµy lµm cho viÖc cµi ®Æt danh s¸ch b»ng m¶ng cã nhiÒu h¹n chÕ, ®Æc
biÖt lµ viÖc sö dông bé nhí kh«ng hîp lý do kh«ng biÕt tríc ®îc chÝnh x¸c
cì cña danh s¸ch. NÕu dïng ph¬ng ph¸p liªn kÕt th× c¸c phÇn tö cã thÓ
n»m r¶i r¸c trong bé nhí, h¬n n÷a mçi phÇn tö cã thÓ t¹o ra vµ hñy bÊt cø
khi nµo cho nªn bé nhí ®îc sö dông mét c¸ch phï hîp, kh«ng bÞ d thõa
hoÆc thiÕu. §Æc ®iÓm cña ph¬ng ph¸p liªn kÕt lµ mçi phÇn tö ngoµi
th«ng tin cÇn lu tr÷ cßn mét hoÆc vµi biÕn con trá ®Ó lu ®Þa chØ cña
c¸c phÇn tö liªn kÕt víi nã. Cã hai c¸ch liªn kÕt thêng ®îc sö dông: liªn
kÕt ®¬n chØ sö dông mét biÕn con trá chØ ®Õn phÇn tö tiÕp theo trong
danh s¸ch (hoÆc chØ ®Õn NULL nÕu lµ phÇn tö cuèi cña danh s¸ch); liªn
kÕt kÐp sö dông hai biÕn con trá, mét biÕn lu ®Þa chØ phÇn tö ®øng tr-
íc, mét biÕn lu ®Þa chØ phÇn tö tiÕp theo. Dïng liªn kÕt kÐp th× viÖc
truy xuÊt c¸c phÇn tö dÔ dµng h¬n nhng viÖc qu¶n lý hai biÕn con trá sÏ
thªm thao t¸c vµ tèn bé nhí h¬n, v× vËy ngêi ta chØ sö dông liªn kÕt kÐp
trong trêng hîp cÇn thiÕt. Trong tµi liÖu nµy chóng ta sÏ t×m hiÓu danh

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.

a. Cµi ®Æt danh s¸ch b»ng m¶ng


Ta thÊy r»ng danh s¸ch lµ mét tËp hîp h÷u h¹n c¸c phÇn tö mµ trªn ®ã
cã x¸c ®Þnh mét trËt tù tuyÕn tÝnh. C¨n cø vµo ®iÒu nµy ta cã thÓ ®¸nh
chØ sè c¸c phÇn tö theo c¸ch sau:
NÕu danh s¸ch gåm n phÇn tö th× phÇn tö ®Çu tiªn cã chØ sè 0 (ta ký
hiÖu lµ a0), phÇn tö cuèi cïng cã chØ sè n-1 (ta ký hiÖu lµ an-1). Bëi v× c¸c
phÇn tö ®Òu ®îc g¸n mét thø tù, nghÜa lµ víi phÇn tö bÊt kú, ta cã thÓ
nãi r»ng phÇn tö ®ã ®øng thø mÊy trong danh s¸ch. Ta quy íc phÇn tö
thø i ®îc g¸n chØ sè i vµ ký hiÖu lµ a i. B»ng c¸ch nµy ta nhËn ®îc c¸ch
biÓu diÔn danh s¸ch theo (2.1) ®· nªu ra trªn ®©y:

L = (a0,a1, a2,... ,an-1), n>=0

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

TiÒn PhÐp To¸n h¹ng §Þa chØ lÖnh tiÕp


tè to¸n theo

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µ:

struct node {float info; node* next;};

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:

struct DanhSach {node *pfirst,*plast;};

• Khëi t¹o danh s¸ch


Hµm init víi ®èi sè d cã kiÓu DanhSach ®îc khai b¸o lµ biÕn tham
chiÕu ®Ó nh÷ng thay ®æi cña d bªn trong hµm vÉn cã hiÖu lùc khi
tho¸t ra khái hµm. Khi khëi t¹o, danh s¸ch cßn cha cã phÇn tö nµo nªn
pfirst vµ plast chØ ®Õn ®Þa chØ 0 (NULL).

void init(DanhSach &d)


{d.pfirst=NULL;d.plast=NULL;
}

• Xãa danh s¸ch khái bé nhí


Thao t¸c nµy cÇn ®Õn khi ta kh«ng cßn cÇn ®Õn danh s¸ch n÷a vµ gi¶i
phãng nã khái bé nhí ®Ó tr¸nh sù l·ng phÝ. NÕu danh s¸ch rçng dÜ nhiªn
lµ kh«ng cÇn ph¶i gi¶i phãng nã. NÕu kh«ng, ta dïng con trá p ®i qua tÊt
c¶ c¸c nót cña danh s¸ch. Nót p1 lu ®Þa chØ nót ®øng tríc p. Mçi lÇn p
chuyÓn ®Õn nót tiÕp theo th× hñy nót do p1 trá ®Õn. §iÒu nµy còng
gièng nh khi ta cÇn th¸o c¸c tÊm v¸n lãt mÆt cÇu vËy: xuÊt ph¸t tõ mét
®Çu cÇu, ta ®øng trªn tÊm thø hai ®Ó th¸o tÊm thø nhÊt, xong råi l¹i
®øng trªn tÊm thø ba ®Ó th¸o tÊm thø hai vµ cho ®Õn khi bíc qua tÊm
cuèi cïng (con trá p=NULL) th× th¸o nèt tÊm nµy vµ kÕt thóc.
p1 p

... info info ...


next next
19
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch

H×nh 2.2 LÇn lît gi¶i phãng c¸c nót trªn danh s¸ch

void clear(DanhSach &d)


{if(empty(d)) return;
node *p,*p1;
p=d.pfirst;
while(p!=NULL)
{p1=p;
p=p->next;
delete p1;
}
d.pfirst=NULL;d.plast=NULL;
}

• KiÓm tra xem danh s¸ch cã rçng kh«ng


Danh s¸ch rçng khi con trá pfirst chØ vµo NULL
int empty(DanhSach &d)
{return(d.pfirst==NULL);
}

• T×m kiÕm khãa x trªn danh s¸ch


B¾t ®Çu tø phÇn tö ®©u tiªn do pfirst trá ®Õn, ta duyÖt qua tÊt c¶ c¸c
phÇn tö cña danh s¸ch (lÖnh p=p->next). NÕu gÆp khãa x th× tr¶ vÒ
®Þa chØ nót t×m thÊy vµ kÕt thóc. NÕu ®i ®Õn hÕt mµ kh«ng t×m thÊy
th× tr¶ vÒ NULL, tøc lµ kh«ng t×m thÊy.
node* search(DanhSach &d,float x)
{node* p=d.pfirst;
while(p!=NULL)
{if(p->info==x) return(p);
p=p->next;
}
return(NULL);

• ChÌn khãa x vµo danh s¸ch


§Ó chÌn khãa x vµo danh s¸ch tríc hÕt ta t×m kiÕm x. NÕu x ®· tån t¹i
th× kÕt thóc, kh«ng chÌn n÷a, v× ta chØ xÐt danh s¸ch gåm c¸c khãa
kh¸c nhau. NÕu kh«ng ta t¹o nót míi b»ng lÖnh pp=new node; g¸n phÇn
th«ng tin nót nµy b»ng x (lÖnh pp->info=x;) vµ con trá next cña nã b»ng
NULL (p->next=NULL). NÕu danh s¸ch cßn rçng, tøc lµ pfirst=NULL, th× ta
®Æt pfirst vµ plast trá vµo nót míi t¹o vµ kÕt thóc (c¸c lÖnh d.pfirst=pp;
vµ d.plast=pp;). NÕu danh s¸ch ®· cã phÇn tö th× nót míi sÏ ®îc chÌn vµo
cuèi danh s¸ch, do ®ã ta ®Æt plast->next=pp; ®Ó nèi nót cuèi cïng cña
danh s¸ch víi nót míi t¹o ra. Sau ®ã chuyÓn plast vÒ nót cuèi b»ng lÖnh
plast=pp;

void insert(DanhSach &d,float x)


{node *pp,*p,*p1;
p=search(d,x);

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

... info info info ...


next next next

H×nh 2.3 Xãa nót p cã khãa x trªn danh s¸ch

void dele(DanhSach &d,float x)


{node *p,*p1,*q;
if(d.pfirst==NULL) return;
if(d.pfirst->info==x)
{p=d.pfirst;d.pfirst=d.pfirst->next;delete p;
if(d.pfirst==NULL) d.plast=NULL;//Tuc la ds chi co mot phan tu
return;
}
p1=d.pfirst;//p1 la nut dung truoc p
p=d.pfirst->next;
while(p!=NULL)
{if(p->info==x) {q=p; p1->next=p->next;
if (d.plast==p) d.plast=p1;//plast bi xoa, phai chuyen ve nut phia
truoc
delete q;
return;}
p1=p;
p=p->next;
}
printf("\nKhoa %4.0f khong co, khong xoa duoc!",x);
};
21
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch

• 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.

void SapXep(DanhSach &d)


{node *p,*p1,*p2; float t,min;
if(empty(d)) return;
p1=d.pfirst;
//pt truoc p,p1t truoc p1
while(p1!=NULL)
{p=p1; min=p1->×no;
p2=p1->next;
while(p2!=NULL)
{if(p2->info<min) {p=p2;min= p->info;}
p2=p2->next;
}
if(p!=p1) {t=p1->info;p1->info=p->info; p->info = t;}//§æi gi¸ trÞ
cña hai nót p vµ p1
p1=p1->next;
}
}
C¸c thao t¸c cßn l¹i c¸c b¹n cã thÓ t×m hiÓu trong ch¬ng tr×nh 22B-
DSLK.CPP
Trong c¸c môc sau ta xÐt hai trêng hîp ®Æc biÖt cña danh s¸ch cã nhiÒu
øng dông, ®ã lµ ng¨n xÕp (Stack) vµ hµng ®îi (Queue).

2.2. Ng¨n xÕp (stack)


2.2.1. Giíi thiÖu stack
Ng¨n xÕp lµ danh s¸ch trong ®ã c¸c nót ®îc thªm vµo hoÆc lÊy ®i chØ
®îc thùc hiÖn ë mét ®Çu gäi lµ ®Ønh cña ng¨n xÕp. MÆc dï trong thùc
22
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
tÕ cã rÊt nhiÒu h×nh ¶nh minh häa c¬ chÕ ho¹t ®éng cña stack, vÝ dô
chång ®Üa ®îc xÕp vµo hép, b¨ng ®¹n ®îc n¹p vµo khÈu sóng m¸y, x©u
chïm ruét ghim ë tay cÇm... nhng thùc ra stack lµ cÊu tróc d÷ liÖu chuyªn
dông. Nã chñ yÕu ®îc c¸c nhµ lËp tr×nh dïng ®Õn khi viÕt ch¬ng tr×nh
biªn dÞch. Nã cung cÊp c¬ chÕ c¬ b¶n cho viÖc gäi thñ tôc con vµ truyÒn
tham sè. Stack còng ®îc dïng cho nhiÒu môc ®Ých kü thuËt kh¸c. Mét vµi
vÝ dô chóng t«i nªu ra trong phÇn nµy nh chuyÓn ®æi mét sè nguyªn
thËp ph©n sang sè nhÞ ph©n thùc ra còng chØ cã tÝnh chÊt minh häa.
B¹n ®äc cã thÓ dÔ dµng thùc hiÖn phÐp chuyÓn ®æi mµ kh«ng dïng
®Õn stack. V× vËy b¹n còng ®õng lÊy lµm ng¹c nhiªn nÕu nh trong khi
viÕt c¸c ch¬ng tr×nh øng dông b¹n cha dïng ®Õn stack bao giê. Stack th-
êng ®îc gäi b»ng nhiÒu tªn kh¸c nhau: danh s¸ch ®Èy xuèng (push-down
list), bé nhí ngîc (reversion storage), kho chøa (cellar), ng¨n xÕp (nesting
store), chång (pile), danh s¸ch vµo sau ra tríc (LIFO - last-in-first-out list),
danh s¸ch yoyo (®å ch¬i trÎ con). Stack cã 2 t¸c vô chÝnh lµ thªm mét nót
vµo ®Ønh vµ lÊy mét nót tõ ®Ønh.

2.2.2. øng dông cña stack


Stack ®ãng vai trß ®Æc biÖt quan träng trong ho¹t ®éng cña m¸y
tÝnh. Stack ®îc coi lµ mét trong nh÷ng phô tïng ®Æc s¾c nhÊt cña c¸c
m¸y tÝnh hiÖn ®¹i. Tríc ®©y stack cha ®îc thiÕt kÕ cøng trong m¸y tÝnh.
Ngay c¶ c¸c lo¹t m¸y IBM 360 lµ nh÷ng m¸y ®· ®em l¹i thµnh c«ng thÞ tr-
êng to lín nhÊt cña IBM kÓ tõ ®Çu nh÷ng n¨m 60 vµ c¸c lo¹i m¸y 360 sau
nµy ®Òu thiÕu ng¨n xÕp. DÇn dÇn v× thÊy ®îc tÇm quan träng cña ng¨n
xÕp nªn b¾t ®Çu tõ c¸c bé vi xö lý 8088 ngêi ta ®· ®a ng¨n xÕp vµo bé
nhí m¸y tÝnh. Ng¨n xÕp thùc ra kh«ng ph¶i lµ mét bé nhí riªng biÖt, nã
chØ lµ mét phÇn cña RAM ë phÇn ®Þa chØ cao nhÊt cha sö dông, ®îc tæ
chøc theo kiÓu vµo sau ra tríc (LIFO). §Þa chØ ®¸y cña ng¨n xÕp ®îc tr÷
trong thanh ghi SS (stack segment register), bªn c¹nh ®ã thanh ghi con
trá ng¨n xÕp (SP - stack pointer register) ®¸nh dÊu ®Ønh ng¨n xÕp t¹i
bÊt cø thêi ®iÓm nµo. Cã thÓ ®a sè liÖu vµo ng¨n xÕp b»ng lÖnh PUSH,
vµ lÊy chóng ra b»ng lÖnh POP cña hîp ng÷ (assembly). Khi mét lÖnh
ng¾t ®Õn, ®Þa chØ cña ch¬ng tr×nh ®ang ch¹y, n»m trong thanh ghi
CS (code segment register) vµ IP (instruction pointer register), sÏ ®îc
chuyÓn vµo ng¨n xÕp, sau ®ã ®Þa chØ cña ch¬ng tr×nh dÞch vô xö lý
ng¾t sÏ ®îc chuyÓn vµo c¸c thanh ghi CS vµ IP , nghÜa lµ ch¬ng tr×nh
dÞch vô sÏ ®îc thùc hiÖn. §»ng sau con trá ng¨n xÕp SP cã thÓ thÊy mäi
c«ng viÖc bÞ treo tríc ®ã vµ b©y giê ®ang ®îi tiÕp tôc, trong khi phÝa tr-
íc con trá SP cã mét vïng trèng mµ trong trêng hîp cÇn thiÕt ch¬ng tr×nh
con dÞch vô ng¾t ®ang ch¹y cã thÓ dïng nã ®Ó lµm vïng nhí lµm viÖc.
NÕu nh÷ng lÖnh ng¾t míi ®Õn tiÕp, ®Þa chØ ch¬ng tr×nh con hiÖn t¹i
l¹i chui vµo ng¨n xÕp nhêng chç cho ch¬ng tr×nh con dÞch vô míi...
Khi ch¬ng tr×nh kh«ng bÞ ng¾t ch¹y xong th× lÇn lît ®Þa chØ c¸c ch-
¬ng tr×nh ®ang bá dë tõ ®Ønh ng¨n xÕp ®îc ®æ trë l¹i c¸c thanh ghi CS
vµ IP vµ ®îc thùc hiÖn; cø nh vËy theo chiÒu híng tõ ®Ønh ®Õn ®¸y
ng¨n xÕp.
Bé nhí ng¨n xÕp kh«ng chØ tham gia trong viÖc xö lý c¸c lÖnh ng¾t,
mµ cßn cã mÆt khi mét ch¬ng tr×nh gäi mét ch¬ng tr×nh kh¸c. Khi gäi
ch¬ng tr×nh con, cã 2 lo¹i sè liÖu ®îc ®a vµo ng¨n xÕp: c¸c tham sè vµ
®Þa chØ trë vÒ. Trong mäi trêng hîp nguyªn t¾c ®Òu nh nhau: cÊt nh÷ng
c«ng viÖc cò ®i mét thêi gian t¹m thêi nhng an toµn vµ ®Ó ý ®Õn c«ng
23
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
viÖc míi. Khi c«ng viÖc míi ®· xong th× tiÕp tôc c«ng viÖc ®ang bá dë
theo thø tù treo sau dì xuèng tríc.
Sau khi t×m hiÓu nh÷ng ®iÒu trªn ®©y vÒ ng¨n xÕp, b¹n ®äc cã thÓ
tù hái: trong m¸y tÝnh ®· cã ng¨n xÕp, vµ ta chØ cã thÓ can thiÖp vµo bé
nhí ng¨n xÕp b»ng lÖnh hîp ng÷. VËy chóng ta häc c¸ch cµi ®Æt ng¨n
xÕp b»ng C++ ®Ó lµm g×? Chóng t«i thö nªu 2 lý do sau:
• Thùc ra bé nhí ng¨n xÕp ®îc t¹o ra vµ ®iÒu khiÓn bëi ch¬ng tr×nh.
NÕu chóng ta häc thªm mét c¸ch cµi ®Æt ng¨n xÕp b»ng ng«n ng÷
bËc cao chóng ta sÏ hiÓu râ thªm c¬ chÕ ho¹t ®éng cña ng¨n xÕp, vµ
nhê vËy nÕu sau nµy khi cã dÞp lËp tr×nh hÖ thèng liªn quan ®Õn
ng¨n xÕp th× sÏ nhanh chãng lµm quen víi c«ng viÖc h¬n.
• MÆc dÇu ch¬ng tr×nh chóng ta viÕt hÇu hÕt dïng ®Õn ng¨n xÕp, nh-
ng chóng ta kh«ng thÓ hiÓu ®îc ng¨n xÕp ®· ®îc dïng cô thÓ nh thÕ
nµo. Trong thùc tÕ chóng ta gÆp nh÷ng bµi to¸n mµ nÕu sö dông ng¨n
xÕp mét c¸ch têng minh, nghÜa lµ chóng ta ph¶i biÕt râ ng¨n xÕp
chøa th«ng tin g×, kÝch cì ng¨n xÕp lµ bao nhiªu..., th× ch¬ng tr×nh
sÏ râ rµng, s¸ng sña h¬n. Trong trêng hîp nµy chóng ta ph¶i t¹o ra ng¨n
xÕp trong ch¬ng tr×nh. Mét vµi trêng hîp ®iÓn h×nh lµ:
- Trong mét sè bµi to¸n vÒ c©y hay ®å thÞ, thÝ dô phÐp duyÖt c©y
theo thø tù tríc (NLR), thø tù gi÷a (LNR), duyÖt ®å thÞ theo
chiÒu s©u, t×m ®êng ®i ng¾n nhÊt trong ®å thÞ, t×m ®êng
®i hoÆc chu tr×nh Euler...
- Satck cßn ®îc dïng ®Ó khö ®Ö quy ®u«i.

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.

a. Cµi ®Æt Stack theo kiÓu kÕ tiÕp (dïng m¶ng ®éng)


Stack thêng ®îc dïng nh mét cÊu tróc d÷ liÖu trung gian hç trî cho viÖc
sö dông c¸c cÊu tróc d÷ liÖu kh¸c, thÝ dô trong c¸c phÐp duyÖt c©y hoÆc
®å thÞ , stack ®îc dïng ®Ó lu c¸c nót trªn ®êng ®i nhng cha duyÖt ®Õn.
Thêng kÝch cì vµ kiÓu cña c¸c phÇn tö cña stack phô thuéc vµo øng dông
cô thÓ. V× vËy ®Ó stack cã thÓ dïng ®îc cho nhiÒu øng dông mµ kh«ng
ph¶i söa ®æi, chóng ta sÏ x©y dùng stack sao cho kÝch cì vµ kiÓu c¸c
phÇn tö cña nã cã thÓ ®îc ®Þnh ra khi sö dông. Ta sÏ lu tr÷ c¸c phÇn tö
cña stack trong m¶ng a[0], a[1],...,a[ max-1], trong ®ã phÇn tö ë ®Ønh
cña stack lµ a[top].

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.

push(A push(B pop push(C push( push(E pop push(F push(


) ) ) D) ) ) G)
5
4 G
3 E F F
2 D D D D D
1 B C C C C C C
0 A A A A A A A A A

H×nh 2.4. Stack víi c¸c thao t¸c push vµ pop

b. Cµi ®Æt Stack theo kiÓu liªn kÕt


Còng gièng nh danh s¸ch tæng qu¸t, trong c¸ch cµi ®Æt stack theo kiÓu
liªn kÕt, mçi nót cña stack sÏ gåm 2 trêng: trêng info chøa th«ng tin vµ tr-
êng next chØ phÇn tö kÕ tiÕp. Tuy nhiªn viÖc ®a phÇn tö vµo vµ lÊy phÇn
tö ra khái stack chØ thùc hiÖn ë mét ®Çu ®îc gäi lµ ®Ønh cña stack.
§Ønh cña stack cã thÓ chän ë ®Çu hoÆc cuèi danh s¸ch. Ta quy íc chän
®Çu danh s¸ch lµm ®Ønh. Cã thÓ thÊy r»ng con trá plast trë nªn kh«ng
cÇn thiÕt. Ta sÏ gäi con trá chØ vµo phÇn tö ®Çu tiªn lµ phead.
p

info info info ... info


next next next next • NULL

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µ:

struct node {int info; node* next;};

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:

struct NganXep {node *phead;};

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().

• §a mét phÇn tö cã khãa x vµo ®Ønh ng¨n xÕp


Tríc hÕt ta t¹o mét nót míi, g¸n phÇn info cña nã b»ng x råi nèi víi nót ®Çu
tiªn b»ng lÖnh:
pp->next=s.phead; sau ®ã chuyÓn con trá phead vÒ nót míi t¹o ra v×
nót nµy b©y giê trë thµnh ®Ønh cña stack.

void push(NganXep &s,int x)


{node *pp,*p,*p1;
pp = new node;
pp->info=x;pp->next=s.phead;
s.phead=pp;
};

• LÊy phÇn tö tõ ®Ønh ng¨n xÕp


ChØ cã thÓ lÊy ®îc phÇn tö nÕu stack kh«ng rçng. LÖnh
assert(!empty(s)); b¶o ®¶m ®iÒu nµy. B¹n nhí thªm lÖnh #include
<assert.h> trong phÇn c¸c chØ thÞ tiÒn xö lý. Gi© trÞ biÕn info trong nót
ë ®Ønh stack ®îc g¸n cho x, sau ®ã nót nµy ®îc gi¶i phãng khái bé nhí.
Con trá phead ®îc chuyÓn ®Õn nót tiÕp theo.

int pop(NganXep &s)


{assert(!empty(s));
int x=s.phead->info;
node* p = s.phead;
s.phead=s.phead->next;
delete p;
return(x);
};

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);
}

2.3. Hµng ®îi (queue)


2.3.1. Giíi thiÖu
Hµng ®îi lµ danh s¸ch gåm c¸c nót tr¶i dµi tõ nót ®Çu ®Õn nót cuèi,
trong ®ã ta chØ cã thÓ thªm c¸c nót vµo cuèi hµng vµ lÊy ®i c¸c nót ë
®Çu hµng. V× ë hµng ®îi nót vµo tríc ®îc lÊy ra tríc nªn cÊu tróc nµy cßn
cã tªn lµ vµo tríc - ra tríc (FIFO - first in first out). §©y lµ cÊu tróc phï hîp
víi suy nghÜ tù nhiªn nhÊt: ®øng vµo hµng tríc th× ®îc phôc vô tríc. Ta cã
thÓ thÊy m« h×nh hµng ®îi ë mäi n¬i: s¾p hµng mua vÐ xem phim, chê
gäi ®iÖn tho¹i tù ®éng, s¾p hµng mua x¨ng... D·y xÕp hµng nhiÒu khi
cßn biÓu hiÖn nÕp sèng v¨n hãa cña mét x· héi mµ mäi thµnh viªn ®Òu
b×nh ®¼ng. Tuy nhiªn trong thùc tÕ nhiÒu khi ta kh«ng thÓ ¸p dông c¬
chÕ FIFO mét c¸ch m¸y mãc. VÝ dô cã mét sè bÖnh nh©n ®îc ®a ®Õn
phßng cÊp cøu trong khi sè bÖnh nh©n nhiÒu h¬n sè b¸c sÜ trùc. DÜ
nhiªn lµ bÖnh nh©n nguy kÞch nhÊt ph¶i ®îc u tiªn xö lý tríc. V× vËy
chóng ta còng cÇn nghiªn cøu lo¹i hµng ®îi cã söa ®æi c¬ chÕ FIFO lµ
27
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
hµng ®îi cã u tiªn: kh«ng ph¶i phÇn tö ®Çu hµng mµ lµ phÇn tö cã ®é u
tiªn cao nhÊt sÏ ®îc lÊy ra khái hµng ®îi.

2.3.2. øng dông hµng ®îi


C¸c qu¸ tr×nh xö lý xÈy ra trong m¸y tÝnh thêng tu©n theo c¬ chÕ
hµng ®îi. Trõ nh÷ng khi ch¬ng tr×nh t¹m ngõng ®Ó xö lý ng¾t hoÆc
ch¹y ch¬ng tr×nh con, c¸c lÖnh ®Òu ®îc thùc hiÖn mét c¸ch tuÇn tù:
lÖnh ®øng tríc sÏ ®îc xö lý tríc. Trong mét hÖ thèng ®a nhiÖm (multi-
tasking), bé xö lý ®iÒu khiÓn nhiÒu ch¬ng tr×nh ®îc ch¹y ®ång thêi
b»ng c¸ch chuyÓn tõ ch¬ng tr×nh nµy sang ch¬ng tr×nh kh¸c theo chu
kú. ViÖc sö dông cÊu tróc hµng ®îi ®Ó theo dâi c¸c ch¬ng tr×nh ®ang
ch¹y lµ rÊt h÷u Ých. Bé xö lý sÏ chó ý ®Õn ch¬ng tr×nh ®øng ®Çu
queue. Ch¬ng tr×nh võa ®îc dµnh thêi gian ch¹y sÏ ®îc göi ra phÝa sau
hµng ®îi ®Ó bé xö lý chuyÓn sù chó ý sang ch¬ng tr×nh kÕ tiÕp.
Mét sè hÖ thèng phô nh m¸y in còng ho¹t ®éng theo c¬ chÕ hµng ®îi.
Trong chÕ ®é in background, nÕu mét file ®îc göi ®Õn bé ®Öm trong khi
bé ®Öm vÉn chøa c¸c file chê in, file nµy ®îc thªm vµo cuèi queue cña t¸c
vô in. T¸c vô in kÕ tiÕp lÊy tõ file ®øng ®Çu queue khi t¸c vô in hiÖn thêi
hoµn tÊt.
Trong c¸c hÖ thèng giao diÖn ®å häa víi ngêi sö dông (GUI - graphical
user interface), queue ®ãng vai trß trung t©m h¬n. PhÇn lín c¸c GUI ®îc
®iÒu khiÓn theo sù kiÖn (event driven), trong ®ã tÊt c¶ c¸c d÷ kiÖn
nhËp tõ bªn ngoµi vµ mét sè sù viÖc x¶y ra bªn trong (vÝ dô cöa sæ ®ang
më trªn mµn h×nh) ®îc xem nh c¸c sù kiÖn. V× kh«ng thÓ gi¶i quyÕt ®îc
c¸c sù kiÖn mét c¸ch liªn tôc, c¸c sù kiÖn ®îc kÕt n¹p vµo queue theo ®é
u tiªn vÒ nhiÖm vô ®Ó chê gi¶i quyÕt.
Còng gièng nh trêng hîp stack, cã thÓ nªu hái: c¬ chÕ hµng ®îi lµ c¬ chÕ
kh¸ tù nhiªn vµ ®îc sö dông nhiÒu trong c¸c ho¹t ®éng m¸y tÝnh. C¸c c¬
chÕ nµy ®îc ®iÒu khiÓn bëi hÖ ®iÒu hµnh vµ chóng ta kh«ng thÓ ®iÒu
khiÓn ®îc th«ng qua ch¬ng tr×nh øng dông th«ng thêng. VËy th× v× sao
cÇn x©y dùng cÊu tróc hµng ®îi? C©u tr¶ lêi lµ:
CÊu tróc hµng ®îi do chóng ta tù x©y dùng ®«i khi rÊt h÷u Ých trong ch-
¬ng tr×nh øng dông do chóng ta x©y dùng. VÝ dô hµng ®îi cã thÓ sö
dông cho phÐp duyÖt c©y theo møc, theo thø tù sau (LRN), duyÖt
®å thÞ theo bÒ réng...

2.3.3. Cµi ®Æt hµng ®îi


a. Cµi ®Æt queue b»ng m¶ng
Nh ta sÏ thÊy, cµi ®Æt queue cã h¬i phøc t¹p h¬n stack, nhÊt lµ khi ta
cµi ®Æt b»ng m¶ng.
Gi¶ sö ta dïng m¶ng a[max] ®Ó cµi ®Æt hµng ®îi.
Trong mét hµng ®îi tù nhiªn, vÝ dô hµng ngêi mua vÐ tµu háa, cø mét
ngêi rêi khái hµng ®îi th× c¶ dßng ngêi cïng chuyÓn lªn phÝa tríc mét vÞ
trÝ. Trong trêng hîp nµy còng kh«ng thÓ lµm kh¸c v× cöa sæ b¸n vÐ lµ cè
®Þnh. Trong c¸ch thùc hiÖn cña m¸y tÝnh, viÖc di chuyÓn liªn tôc g©y
nªn sù tiªu hao tµi nguyªn vµ lµ gi¶i ph¸p kh«ng cã lîi, nhÊt lµ khi queue
dµi. ý tëng ®Çu tiªn lµ cµi ®Æt queue theo c¸ch sau ®©y theo kiÓu cµi
®Æt stack:

Queue ban ®Çu A B C


LÊy ®i 2 phÇn tö C
28
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
Thªm vµo 2 phÇn C D E

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.

c. Cµi ®Æt queue b»ng danh s¸ch liªn kÕt


Queue cã thÓ cµi ®Æt b»ng danh s¸ch liªn kÕt ®¬n, víi quy íc lµ thao t¸c
lÊy phÇn tö lu«n thùc hiÖn ë ®Çu danh s¸ch (tøc lµ phÇn tö do pfirst trá
®Õn) vµ phÇn tö míi lu«n ®îc thªm vµo ë cuèi danh s¸ch (tøc lµ phÝa sau
phÇn tö do plast trá ®Õn).

pfirs plast

info info info ... info


next next next next • NULL

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µ:

struct node {int info; node* next;};

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:

struct HangDoi {node *pfirst, *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;).

void put(HangDoi &q,int x)


{node *pp;
pp = new node;
pp->info=x;pp->next=NULL;
if(q.pfirst==NULL) {q.pfirst=pp;q.plast=pp;return;}//HangDoi von bi
rong
q.plast->next=pp; q.plast=pp;
};

• LÊy phÇn tö tõ ®Çu hµng ®îi


ChØ cã thÓ lÊy ®îc phÇn tö nÕu queue kh«ng rçng. LÖnh
assert(!empty(s)); b¶o ®¶m ®iÒu nµy. B¹n nhí thªm lÖnh #include
<assert.h> trong phÇn c¸c chØ thÞ tiÒn xö lý. Gi© trÞ biÕn info trong nót
ë ®Çu queue ®îc g¸n cho x, sau ®ã nót nµy ®îc gi¶i phãng khái bé nhí.
Con trá pfirst ®îc chuyÓn ®Õn nót tiÕp theo.

int get(HangDoi &q)


{assert(!empty(q));
int x=q.pfirst->info;
node* p = q.pfirst;
q.pfirst=q.pfirst->next;
delete p;
if(q.pfirst==NULL) q.plast=NULL;
return(x);
};

• Thö l¹i hµng ®îi


Cã thÓ thö l¹i xem queue ho¹t ®éng cã tèt kh«ng 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è c¬ sè 2.
ThuËt to¸n chuyÓn mét sè thËp ph©n v chØ cã phÇn lÎ sang d¹ng nhÞ
ph©n: LÊy phÇn ph©n cña v nh©n liªn tiÕp víi 2 cho ®Õn khi kÕt qu¶
phÐp nh©n kh«ng cßn phÇn ph©n hoÆc ®¹t ®îc ®é chÝnh x¸c ta cÇn,
mçi lÇn nh©n ta lÊy phÇn nguyªn cña kÕt qu¶ lµ ci , i=1,2,...,m. Khi ®ã
sè 0. c1 c2 ...cm chÝnh lµ sè nhÞ ph©n cÇn t×m.(Chóng ta lu ý lµ sau mçi
lÇn nh©n ta chØ lÊy phÇn ph©n ®Ó nh©n tiÕp víi 2, phÇn nguyªn ë ®©y
®îc hiÓu lµ phÇn bªn tr¸i dÊu chÊm ph©n).

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.

void ChuyenNP(float t=0.125)


{HangDoi q;
init(q);
float v; int k,h;v=t;
k=0;init(q);
while(fabs(v)>0.00001 && k<10)
{v=v*2;
h=int(v);
put(q,h);
v=v-int(v);//chi lay phan thap phan sau khi nhan v voi 2
k++;
}
printf("\n%f chuyen sang dang thap phan la: 0.",t);
while(!empty(q))
{k=get(q);
printf("%d",k);
}
clear(q);
}

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

H×nh 3.1. C©y nhÞ ph©n

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 ®ã.

3.2. Mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n


§Ó cã thÓ thùc hiÖn c¸c thao t¸c t×m kiÕm vµ chÌn theo ph¬ng ph¸p
nhÞ ph©n trªn c©y nh ý tëng thiÕt kÕ chóng ta nªu ra trªn ®©y, chóng
ta ph¶i tæ chøc c©y nhÞ ph©n theo mét c¸ch ®Æc biÖt, sao cho khi thùc
hiÖn t×m kiÕm hoÆc chÌn ta lu«n cã thÓ quyÕt ®Þnh lµ hµnh ®éng tiÕp
theo sÏ thùc hiÖn ë c©y con tr¸i hay c©y con ph¶i.
ThÝ dô chóng ta sÏ tæ chøc c¸c nót sao cho t¹i mçi nót bÊt kú c¸c nót ë
phÝa tr¸i bao giê còng kh«ng lín h¬n nót ®ã vµ tÊt c¶ c¸c nót phÝa ph¶i
®Òu kh«ng bÐ h¬n nót ®ã. C©y nhÞ ph©n tháa m·n tÝnh chÊt nµy ®îc
gäi lµ c©y nhÞ ph©n t×m kiÕm. §iÒu nµy còng cho ta c¸ch chÌn mét
phÇn tö míi: b¾t ®Çu tõ gèc, ta sÏ lÇn t×m vÞ trÝ thÝch hîp ®Ó chÌn phÇn
tö ®ã. Chóng ta cã thÓ thÊy râ lµ hai c©y nhÞ ph©n chøa cïng d÷ liÖu
cã thÓ ®îc tæ chøc hoµn toµn kh¸c nhau. Trong h×nh 3.1 nÕu chóng ta
chÌn c¸c phÇn tö theo thø tù ®· s¾p s½n A,B,C,D,E ta sÏ ®îc mét c©y nhÞ
ph©n suy biÕn thµnh danh s¸ch.

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

H×nh 3.2. C©y nhÞ ph©n suy biÕn

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

H×nh 3.3. C©y nhÞ ph©n ®Çy ®ñ

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

H×nh 3.4. C©y nhÞ ph©n ®óng


Ta cã thÓ thÊy r»ng c©y nhÞ ph©n ®óng nãi chung cha ®ñ c©n
b»ng ®Ó ®¸p øng ®îc yªu cÇu t×m kiÕm vµ chÌn nhanh. C©y nhÞ
ph©n ®Çy ®ñ lµ c©y nhÞ ph©n ®óng mµ tÊt c¶ c¸c nót l¸ ®Òu cã
cïng mét møc.
• C©y nhÞ ph©n gÇn ®Çy ®ñ (almost complete binary tree): c©y nhÞ
ph©n cã ®é cao d ®îc gäi lµ gÇn ®Çy ®ñ nÕu c¸c nót ë c¸c møc nhá
h¬n hoÆc b»ng d-1 cã ®Çy ®ñ c¸c nót, cßn ë møc d th× ®Çy tõ tr¸i
qua ph¶i (xem h×nh 3.5). Ta cã thÓ thÊy r»ng víi mét tËp d÷ liÖu bÊt
kú ta lu«n cã thÓ t¹o ®îc mét c©y gÇn ®Çy cã c¸c nót lµ c¸c phÇn tö
cña tËp d÷ liÖu ®ã.

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

H×nh 3.5. C©y nhÞ ph©n gÇn ®Çy

• 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.

3.3. VÝ dô vÒ c©y nhÞ ph©n


Trong thùc tÕ cã rÊt nhiÒu vÝ dô minh häa cho cÊu tróc c©y nh c©y cam,
c©y quýt... trong vên, c©y th môc trªn ®Üa cøng hay ®Üa mÒm, c©y gia
ph¶ cña dßng hä, môc lôc cña mét cuèn s¸ch... §ã lµ nh÷ng c©y nhiÒu
nh¸nh mµ chóng ta kh«ng kh¶o s¸t trong tµi liÖu nµy (Trong ch¬ng VII
chóng ta sÏ nghiªn cøu mét lo¹i c©y nhiÒu nh¸nh ®Æc biÖt vµ cã rÊt
nhiÒu øng dông lµ B-c©y). Mét vÝ dô kh¸ hay vÒ c©y nhÞ ph©n lµ c©y
biÓu thøc. C©y biÓu thøc lµ c©y mµ c¸c nót gèc vµ nót trung gian chøa
c¸c to¸n tö hay phÐp to¸n, cßn c¸c nót l¸ chøa c¸c to¸n h¹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

H×nh 3.6. C©y nhÞ ph©n biÓu diÔn biÓu thøc

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.

3.4. C©y nhÞ ph©n tæng qu¸t


Còng nh cÊu tróc danh s¸ch, ta cã thÓ cµi ®Æt c©y nhÞ ph©n theo
kiÓu kÕ tiÕp b»ng m¶ng (contiguous implementation) hoÆc theo kiÓu liªn
kÕt (linked implementation). Víi c©y nhÞ ph©n ®Çy hoÆc gÇn ®Çy cã n
nót ta cã thÓ dïng m¶ng cì n ®Ó lu tr÷. Ta cã thÓ ®¸nh sè c¸c nót cña
nã theo tõng møc: møc 0 lµ nót gèc ®îc ®¸nh sè 0, møc 1 cã 2 nót ®îc
®¸nh sè 1 vµ 2, møc 2 cã 4 nót ®îc ®¸nh sè 3,4,5,6,... tæng qu¸t, møc
m cã 2m nót ®îc ®¸nh sè tõ 2m-1, 2m, 2m+1,... ,2m+1-2. ë møc d cuèi
cïng c¸c nót ®îc ®¸nh sè tõ 2d-1, 2d, 2d+1,... ,n-1.

1 2

3 4 5 6

7 8 9

H×nh 3.7. §¸nh sè c©y nhÞ ph©n gÇn ®Çy

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.

3.4.1. DuyÖt c©y nhÞ ph©n


Còng gièng víi mét cÊu tróc d÷ liÖu bÊt kú, c¸c nót cña c©y nhÞ ph©n
thêng chøa c¸c th«ng tin vµ nhiÒu khi ta ph¶i liÖt kª tÊt c¶ c¸c th«ng tin
®ã theo mét c¸ch nµo ®ã sao cho th«ng tin mçi nót chØ ®îc liÖt kª mét
lÇn vµ kh«ng cã nót nµo bÞ bá sãt. §Ó lµm ®îc viÖc nµy râ rµng ta ph¶i
lÇn lît th¨m c¸c nót cña c©y theo mét thø tù nµo ®ã sao cho mçi nót chØ
®îc th¨m ®óng mét lÇn. C¸ch lµm nµy gäi lµ phÐp duyÖt c©y. Cã nhiÒu
c¸ch duyÖt c©y, thÝ dô ta cã thÓ th¨m c¸c nót theo tõng møc lÇn lît tõ tr¸i
qua ph¶i. Tuy nhiªn nhiÒu khi phÐp duyÖt c©y kh«ng ®¬n thuÇn lµ liÖt
kª th«ng tin c¸c nót mµ cßn nh»m mét môc ®Ých kh¸c. V× vËy 4 phÐp
duyÖt c©y sau ®©y lµ ®îc dïng nhiÒu nhÊt trong thùc 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

H×nh 3.8. Bèn phÐp duyÖt c©y nhÞ ph©n


37
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Chóng ta cã thÓ duyÖt c©y nhÞ ph©n dïng sù trî gióp cña stack, kh«ng
dïng ph¬ng ph¸p ®Ö quy. DuyÖt c©y kh«ng dïng ®Ö quy phøc t¹p vµ khã
theo dâi h¬n. Qua ®©y chóng ta còng cã thÓ thÊy u ®iÓm cña ph¬ng
ph¸p ®Ö quy lµ rÊt ®¬n gi¶n vµ dÔ hiÓu.
DuyÖt c©y theo thø tù gi÷a kh«ng dïng ®Ö quy:
1. §Ó duyÖt mét c©y con tríc hÕt chóng ta sÏ ®i tõ nót gèc cña c©y ®ã
cho ®Õn nót tr¸i nhÊt, trong qu¸ tr×nh ®i qua c¸c nót ta push c¸c nót
vµo stack. Th¨m nót tr¸i nhÊt cña c©y con b»ng t¸c vô pop.
2. Sau khi th¨m nót ®ã:
NÕu nót ®ã cã nh¸nh c©y con ph¶i th× chóng ta ph¶i duyÖt nh¸nh
c©y con ph¶i (vÒ bíc 1).
NÕu nót ®ã kh«ng cã nh¸nh c©y con ph¶i th× th¨m tiÕp nót ®ang lu
ë ®Ønh stack b»ng t¸c vô pop.

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µ:

struct node {int info; node* left, *right;};

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:

• Khëi t¹o c©y nhÞ ph©n


void init(node *&proot)
{proot=NULL;
};

• Xãa c©y nhÞ ph©n khái bé nhí b»ng ®Ö quy


void clear(node* &proot)
{//Dieu kien dung
if(proot!=NULL)
{clear(proot->left);
clear(proot->right);
delete proot;proot=NULL;
}
};

• KiÓm tra xem c©y cã rçng kh«ng


int empty(node *proot)
38
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
{return proot==NULL;
}

• DuyÖt c©y theo thø tù tríc b»ng ®Ö quy


void pretrav(node* proot)
{if(proot!=NULL)
{printf("%5d",proot->info);
pretrav(proot->left);
pretrav(proot->right);
}
}
• DuyÖt c©y theo thø tù gi÷a b»ng ®Ö quy
void intrav(node* proot)
{if(proot!=NULL)
{inttrav(proot->left);
printf("%5d",proot->info);
inttrav(proot->right);
}
}

• DuyÖt c©y theo thø tù sau b»ng ®Ö quy


void posttrav(node* proot)
{if(proot!=NULL)
{posttrav(proot->left);
posttrav(proot->right);
printf("%5d",proot->info);
}
}

3.5. C©y nhÞ ph©n t×m kiÕm


Do cÊu tróc ®Æc biÖt, viÖc thªm vµo vµ xãa nót trªn c©y nhÞ ph©n t×m
kiÕm ®îc thùc hiÖn kh¸c víi c©y nhÞ ph©n thêng. Khi thªm vµo th× vÞ
trÝ cÇn thªm nót ®îc x¸c ®Þnh duy nhÊt mµ kh«ng cÇn ph¶i chØ râ lµ lµ
nót con tr¸i hay ph¶i cña mét nót nµo ®ã. Cã thÓ xãa nót bÊt kú trªn
c©y, nhng ph¶i thùc hiÖn mét sè thao t¸c ®Ó b¶o ®¶m c©y míi vÉn lµ
c©y nhÞ ph©n t×m kiÕm.

3.5.1. Thao t¸c chÌn (insert)


T¸c vô nµy gióp chóng ta thªm nót míi vµo c©y nhÞ ph©n t×m kiÕm. Nót
thªm vµo sÏ lµ nót l¸ ë vÞ trÝ thÝch hîp. XuÊt ph¸t tõ nót gèc, chóng ta so
s¸nh nót ®· cho víi nót gèc, nÕu nót míi cã néi dung bÐ h¬n nót gèc th×
chóng ta ®i vÒ tr¸i, ngîc l¹i ®i vÒ ph¶i (gi¶ thiÕt r»ng trªn c©y kh«ng cã
nót trïng néi dung). Chóng ta sÏ dõng ë nót l¸ hoÆc nót trung gian cßn
thiÕu con. So s¸nh víi nót nµy nÕu nót ®· cho bÐ h¬n th× thªm nót tr¸i,
ngîc l¹i thªm nót ph¶i.

3.5.2. Thao t¸c xãa (remove)


Thao t¸c xãa phøc t¹p h¬n thao t¸c chÌn. Khi ta xãa mét nót P, mét nót
kh¸c trong vïng l©n cËn sÏ thay thÕ vµo vÞ trÝ nót bÞ xãa, ®ång thêi ta
ph¶i ®Æt l¹i mèi liªn kÕt trong vïng l©n cËn nót bÞ xãa. Thay thÕ xong ta

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

H×nh 3.9. Xãa nót l¸ D.

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

H×nh 3.10. Xãa nót 20 chØ cã mét nót con.

Trêng hîp 3:
1 1

5 2 5 2

1 1
3 3

1 3
2 3

H×nh 3.11. Xãa nót 25 cã 2 nót con.

3.5.2. Cµi ®Æt c©y nhÞ ph©n t×m kiÕm


CÊu tróc c¸c nót th«ng tin trªn c©y t×m kiÕm còng gièng víi trêng hîp
c©y nhÞ ph©n thêng. Ta còng dïng ph¬ng ph¸p liªn kÕt ®Ó cµi ®Æt c©y.
Mçi nót cña c©y gåm 3 trêng: trêng info mang th«ng tin, trêng left cã
kiÓu con trá node ®Ó chØ ®Õn con tr¸i, trêng right chØ ®Õn con ph¶i.
Con trá proot chØ gèc cña c©y. C¸c phÐp duyÖt trªn c©y nhÞ ph©n t×m
kiÕm còng ®îc thùc hiÖn nh trªn c©y nhÞ ph©n thêng, nghÜa lµ còng cã
c¸c phÐp duyÖt dïng ®Ö quy vµ kh«ng dïng ®Ö quy. Sau ®©y lµ mét sè
thao t¸c c¬ b¶n:

 T×m kiÕm th«ng tin x trªn c©y dïng ®Ö quy

node* search(node* proot,int x)


{//Dieu kien dung
node* p;
if(proot==NULL) return NULL;
if(proot->info==x) return proot;
//Buoc de quy
if(x<proot->info) p=search(proot->left,x);
else p=search(proot->right,x);
return p;
};

 T×m kiÕm th«ng tin x trªn c©y kh«ng dïng ®Ö quy


Ph¬ng ph¸p nµy thùc hiÖn t×m kiÕm kh«ng ®Ö quy. Ngoµi tham sè x,
cßn cã mét tham sè fp cã kiÓu con trá node. NÕu t×m thÊy th× t¸c vô
tr¶ vÒ nót t×m thÊy, fp chØ nót cha cña nót t×m thÊy. Khi thùc hiÖn thao

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;
}

Mét sè nhËn xÐt vÒ c©y nhÞ ph©n t×m kiÕm:


Khi x©y dùng c©y nhÞ ph©n t×m kiÕm ta rÊt khã h×nh dung vÒ h×nh
d¹ng cña c©y, ta kh«ng tr¶ lêi ®îc c©u hái lµ liÖu c©y cã c©n b»ng hay
kh«ng. DÔ dµng thÊy ®îc lµ trêng hîp xÊu nhÊt x¶y ra khi ta chÌn c¸c khãa
vµo c©y theo thø tù t¨ng dÇn hoÆc gi¶m dÇn. NÕu ta chÌn khãa theo thø
tù t¨ng dÇn th× sÏ ®îc mét c©y nhÞ ph©n t×m kiÕm suy biÕn thµnh
danh s¸ch nh ë h×nh 3.2., tøc lµ c©y hoµn toµn bÞ lÖch ph¶i; nÕu ta chÌn
theo thø tù gi¶m dÇn th× ®îc mét c©y nhÞ ph©n t×m kiÕm lÖch tr¸i.
Trong nh÷ng trêng hîp nµy c¸c thñ tôc t×m kiÕm, chÌn, xãa... còng cã ®é
phøc t¹p tÝnh to¸n lµ O(n) nh trªn danh s¸ch, nghÜa lµ cÊu tróc c©y
kh«ng c¶i thiÖn ®îc chót nµo so víi cÊu tróc danh s¸ch, mµ chØ lµm cho
c¸c thao t¸c cã phÇn phøc t¹p h¬n. Tuy nhiªn trong thùc tÕ th«ng thêng
c¸c khãa ®îc chÌn vµo mét c¸ch ngÉu nhiªn. Ngêi ta ®· tÝnh ®îc thêi gian
trung b×nh ®Ó thùc hiÖn c¸c phÐp to¸n trªn c©y nhÞ ph©n t×m kiÕm lµ
O(logn). (Xem "§inh M¹nh Têng, CÊu tróc d÷ liÖu vµ thuËt to¸n", trang
118).

3.6. C©y c©n b»ng chiÒu cao (Height balanced tree)


Mét trêng hîp ®Æc biÖt cña c©y nhÞ ph©n t×m kiÕm lµ c©y c©n
b»ng chiÒu cao hay cßn gäi lµ c©y AVL do hai nhµ to¸n häc X« ViÕt lµ
Adelson Velsky vµ Landis ph¸t minh ra vµo n¨m 1962. C©y AVL ®îc xem
lµ cÊu tróc d÷ liÖu næi tiÕng nhÊt vµ cæ ®iÓn nhÊt trong c¸c c©y c©n
b»ng. ViÖc thªm nót hay xãa nót trªn c©y nhÞ ph©n AVL sÏ ®îc thùc hiÖn
nh trªn c©y nhÞ ph©n t×m kiÕm. Tuy nhiªn sau mçi lÇn chÌn hoÆc xãa
nót th× c©y cã thÓ mÊt c©n b»ng vµ ta ph¶i thùc hiÖn thao t¸c xoay
c©y ®Ó c©n b»ng l¹i. C¸c thao t¸c t×m kiÕm, chÌn vµ xãa nót trªn c©y
AVL chØ xÊp xØ O(log2n). Sau ®©y chóng ta t×m hiÓu c¸c thao t¸c c©n
b»ng l¹i c©y.

3.6.1. Thao t¸c xoay c©y nhÞ ph©n


Sau khi chÌn hoÆc xãa nót trªn c©y nhÞ ph©n AVL, cã thÓ c©y sÏ mÊt
tr¹ng th¸i c©n b»ng. Trong trêng hîp nµy chóng ta ph¶i thùc hiÖn thao t¸c
xoay tr¸i (rotateleft) hoÆc xoay ph¶i (rotateright) ®Ó c©n b»ng l¹i c©y.
§Ó xoay tr¸i c©y nhÞ ph©n cã nót gèc lµ P , yªu cÇu lµ nót P ph¶i cã nót
con bªn ph¶i Q. Sau khi xoay tr¸i nót P quanh nót con ph¶i Q cña
nã, nót Q trë thµnh nót gèc míi cña c©y, nót P trë thµnh nót con
bªn tr¸i cña nót Q (cßn nót con tr¸i cña Q sÏ thµnh nót con ph¶i cña P).

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

H×nh 3.12. Xoay tr¸i c©y nhÞ ph©n.


Thao t¸c xoay ph¶i còng ®îc thùc hiÖn t¬ng tù khi thay nót con ph¶i
b»ng nót con tr¸i.
NhËn xÐt vÒ phÐp xoay c©y:
Cã thÓ thÊy r»ng khi mét c©y bÞ lÖch ph¶i th× ta hy väng b»ng phÐp
xoay tr¸i nót gèc quanh con ph¶i cña nã sÏ lµm cho c©y kh«ng cßn lÖch
ph¶i n÷a. Tõ h×nh 3.12 ta cã thÓ thÊy r»ng phÐp xoay thùc sù ®¹t ®îc
hiÖu qu¶ nÕu c©y a vµ c©y b ®Òu ng¾n h¬n c©y c, nghÜa lµ P vµ
Q cïng lÖch ph¶i. NÕu Q lÖch tr¸i chiÒu víi P th× thêng ta ph¶i quay
ph¶i Q råi sau ®ã míi quay tr¸i P.

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

H×nh 3.15.a. Xoay tr¸i c©y s.


Trong trêng hîp nµy ta chØ cÇn xoay ph¶i nót s quanh nót s1, ta ®îc
c©y gèc s1 ®· c©n b»ng. H¬n n÷a ta cã thÓ thÊy chiÒu cao cña c©y
s1 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.
Trêng hîp b: C©y gèc s1 lÖch ph¶i, tøc lµ lÖch kh¸c phÝa víi s, nót x lµ
nót sau bªn ph¶i cña nót s1. Lóc nµy ta ph¶i thùc hiÖn 2 phÐp quay, hay
cßn gäi lµ thùc hiÖn phÐp quay kÐp.
Trêng hîp b.1:

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

Xoay ph¶i nót 0 s2


s
0 s1 1
s

B1 B2
A chiÒ chiÒ C
chiÒ u u chiÒ
u cao cao cao u cao
n n
x

H×nh 3.15.b.1. Xoay kÐp c©y s.

Trêng hîp b.2:

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

H×nh 3.15.b.2. Xoay kÐp c©y s.

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

Trêng hîp 2: C©y gèc s vèn lÖch ph¶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
a bal(s) = bal(s)=+2 Xoay tr¸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 ph¶i nót s1
bal(s1) = -1 2. Xoay tr¸i nót s
0 bal(s2)=+ bal(s)=-1,bal(s1) =
bal(s2)=0 1 0,bal(s2)=0
b2 bal(s) = bal(s)= Xoay kÐp:
+1 +-2 1. Xoay ph¶i nót s1
bal(s1) = bal(s1)= 2. Xoay tr¸i nót s
0 -1 bal(s)=0,bal(s1) =
bal(s2)=0 bal(s2)= +1,bal(s2)=0
-1

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.

3.6.4. Xo¸ nót trªn c©y AVL


§Ó xãa mét nót khái c©y AVL ta ¸p dông thuËt to¸n lo¹i nót khái c©y
t×m kiÕm. Tuy nhiªn khi xãa nót, c©y cã thÓ mÊt c©n b»ng vµ ta ph¶i
c©n b»ng l¹i c©y b»ng thao t¸c xoay c¸c nh¸nh c©y liªn quan. Còng nh
trêng hîp thªm nót, chØ cã mét sè trêng hîp viÖc xãa nót lµm cho c©y
mÊt th¨ng b»ng vµ ta ph¶i c©n b»ng l¹i. §ã lµ trêng hîp c©y vèn lÖch ph¶i
vµ ta xãa nót ë nh¸nh c©y bªn tr¸i hoÆc c©y vèn lÖch tr¸i mµ ta xãa nót
trªn nh¸nh c©y bªn ph¶i. ViÖc c©n b»ng c©y khi xo¸ nót tr¸i ®îc thùc
hiÖn t¬ng tù nh viÖc thªm nót trªn nh¸nh c©y bªn ph¶i vµ thao t¸c c©n
b»ng khi xãa nót bªn ph¶i l¹i t¬ng tù nh thao t¸c c©n b»ng khi thªm nót
trªn nh¸nh c©y bªn tr¸i. Tuy nhiªn nh chóng ta sÏ thÊy, nÕu trong thao t¸c
thªm nót ta chØ cÇn nhiÒu nhÊt lµ mét phÐp xoay ®¬n hoÆc kÐp ®Ó
c©n b»ng l¹i c©y th× trong thao t¸c xãa nót, trong trêng hîp xÊu nhÊt ta
cÇn thùc hiÖn kho¶ng logn thao t¸c xoay c©y däc theo ®êng t×m kiÕm
tõ nót thay thÕ trë vÒ nót gèc ®Ó c©n b»ng l¹i c©y.

Thùc hiÖn phÐp xoay c©y ®Ó c©n b»ng l¹i c©y:


Sau ®©y ta xÐt trêng hîp c©n b»ng l¹i c©y gèc s vèn lÖch tr¸i vµ ta
thùc hiÖn xãa nót ë nh¸nh c©y bªn ph¶i, ®ång thêi ta gi¶ sö r»ng viÖc
xãa nót ®· lµm cho nh¸nh c©y bªn ph¶i thÊp ®i 1 so víi tríc khi xãa.
Ta cã c¸c trêng hîp sau:
Gäi s1 lµ con tr¸i cña s, ta xÐt c¸c trêng hîp sau:
Trêng hîp 1:
Tríc khi xo¸ nót bal(s) = 1, tøc lµ c©y lÖch vÒ bªn ph¶i. Sau khi xãa nót
th× bal(s)=0, c©y c©n b»ng hoµn toµn. Tuy nhiªn chiÒu cao cña c©y bÞ
gi¶m ®i 1 so víi tríc khi xãa, do ®ã cã thÓ ¶nh hëng d©y chuyÒn ®Õn
c¸c nót ®øng tríc.

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

H×nh 3.16.a. Bal(s1)=0, xoay ph¶i s, ®é cao c©y kh«ng


®æi (=n+1).
Trêng hîp b: bal(s1)=-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

H×nh 3.16.b. Bal(s1)=-1, xoay ph¶i s, c©y thÊp h¬n


(n<n+1).
Trong c¸c trêng hîp trªn sau khi thùc hiÖn phÐp quay ®¬n ta ®¹t ®îc
sù c©n b»ng, ®ång thêi ta thÊy r»ng ®é cao cña c©y s kh«ng thay ®æi
so víi tríc khi xãa nót. Nh vËy víi phÐp quay nµy ta ®· v« hiÖu hãa ¶nh h-
ëng d©y chuyÒn cña viÖc xãa nót x: hÖ sè c©n b»ng cña c¸c nót ®øng
tríc s kh«ng bÞ ¶nh hëng bëi viÖc chÌn nót.
Trêng hîp c: bal(s1) =+1
Trêng hîp c.1: s2 = s1->right, bal(s2)=0

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

Xoay ph¶i nót s 0 s2

0 s1 0
s

B1 B2
A chiÒ chiÒ C
chiÒ u u
u cao cao cao n-1
n-1

H×nh 3.16.c.1. Bal(s1)=+1, bal(s2)=0,xoay kÐp, c©y thÊp h¬n


(n<n+1).
Trêng hîp c.2: bal(s2)=-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

H×nh 3.16.c.2. Bal(s1)=+1, bal(s2)=-1,xoay kÐp, c©y thÊp h¬n


(n<n+1).
Trêng hîp c.3: bal(s2)=+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

Xoay ph¶i nót s 0 s2

- s1 0
s

B1 B2
A chiÒ chiÒ C
chiÒ u u
u cao cao cao n-1
n-1

H×nh 3.16.c.3. Bal(s1)=+1, bal(s2)=1,xoay kÐp, c©y thÊp h¬n


(n<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.

3.6.5. Vµi nhËn xÐt vÒ c©y AVL


- Trung b×nh 2 lÇn thªm nót th× cÇn mét lÇn c©n b»ng l¹i c©y.
- Trung b×nh 5 lÇn xãa nót th× cÇn mét lÇn c©n b»ng l¹i c©y.
- Chóng ta sÏ chØ ra r»ng, trªn c©y AVL, trong trêng hîp xÊu nhÊt, thêi
gian thùc hiÖn c¸c phÐp to¸n lµ O(logn). Tríc hÕt ta sÏ x¸c ®Þnh ®é cao
cña c©y trong trêng hîp xÊu nhÊt.

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ã

Dh = Dh-1 + Dh-2 +1 tõ ®©y ta cã Dh +1 = Dh-1 +1 + Dh-2 +1

§Æt Gh = Dh +1, ta cã

G0 = 2, G1 = 3, Gh = Gh-1 + Gh-2 , h=2,3,...


D·y Gh chÝnh lµ thµnh phÇn h+2 cña d·y Fibonacci, tøc lµ Gh = Fh+2.
Ta biÕt r»ng nÕu ®Æt n = Fk , khi ®ã n ~ ak víi a ~ 1.61803... lµ “tû
sè vµng”. Tõ ®©y cã thÓ tÝnh ®îc k ~ 1.44log2n.
§Æt n = Dh , ta cã
n = Dh = Gh -1 = Fh+2 - 1 , tõ ®©y n+1 = Fh+2 , suy ra h+2 ~
1.44log(n+1)
vµ do ®ã cã thÓ xem
h ~ 1.44logn
Nh vËy, ®é cao cña c©y AVL trong trêng hîp xÊu nhÊt lµ O(logn). Tõ
®©y ta suy ra r»ng, thêi gian thùc hiÖn c¸c phÐp to¸n trªn c©y AVL
trong trêng hîp xÊu nhÊt lµ O(logn).

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.

4.2. C¸c gi¶i thuËt s¾p xÕp hay dïng


4.2.1. S¾p xÕp b»ng lùa chän (Selection Sort)
a. M« t¶ thuËt to¸n
Theo ph¬ng ph¸p nµy chóng ta lÇn lît chän nót nhá nhÊt cho c¸c vÞ trÝ
0,1,...,n-1 nh sau:

- 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)

ThuËt to¸n nµy cã thÓ m« t¶ ng¾n gän h¬n nh sau:


Víi mçi i (i = 0,1,2,...,n-2) ta sÏ chän trong d·y khãa ai, 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
57
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
14 2 1 13 12 11

C¸c bíc víi i=0, 1, 2 ®îc thùc hiÖn nh sau:


a0 a1 a2 a3 a4 a5
i=0 14 2 1 13 12 11
1 2 14 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

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Selection sort:

Tæng sè lÇn so s¸nh:


Tæng sè lÇn so s¸nh lµ: C(n) = (n-1)+(n-2)+...+(n-k)+...+2+1=n(n-1)/2
Tæng sè lÇn ®æi chç Ýt h¬n tæng sè lÇn so s¸nh.
VËy Selection sort cã bËc lµ O(n2), hay nãi mét c¸ch kh¸c, thuËt to¸n nµy
cã ®é phøc t¹p tÝnh to¸n n2.
NhËn xÐt: Gi¶i thuËt Selection sort ®¬n gi¶n, dÔ hiÓu nhng chËm, kh«ng
tËn dông ®îc t×nh huèng d·y ®· ®îc s¾p xÕp hay gÇn s¾p xÕp.
b. Cµi ®Æt thuËt to¸n Selection Sort
M¶ng a[] vµ cì N cña m¶ng võa lµ ®Çu vµo võa lµ ®Çu ra cña hµm. ë
®Çu vµo, thêng m¶ng cha ®îc s¾p xÕp. §Çu ra lµ m¶ng a ®· ®îc s¾p
xÕp b»ng ph¬ng ph¸p lùa chän. Trong qu¸ tr×nh cho i ch¹y tõ 0 ®Õn
N-2, ta dïng mét biÕn k ghi l¹i chØ sè cña phÇn tö bÐ nhÊt vµ gi¸ trÞ min
ghi l¹i gi¸ trÞ bÐ nhÊt trong d·y ai, ai+1,..., aN-1. Ban ®Çu ta gi¶ thiÕt r»ng
ai lµ bÐ nhÊt (lÖnh k=i). Sau ®ã cho j ch¹y tõ i+1 cho ®Õn cuèi d·y, vµ
mçi lÇn cã phÇn tö bÐ h¬n (lÖnh if(a[j]<a[k])) ta l¹i g¸n gi¸ trÞ k b»ng chØ
sè cña phÇn tö bÐ h¬n ®ã vµ gi¸ trÞ min ®îc g¸n b»ng gi¸ trÞ nµy (lÖnh
k=j; min = a[j];). Khi ®i ®Õn cuèi d·y ta sÏ ®îc k lµ chØ sè cña phÇn tö bÐ
nhÊt. NÕu chØ sè nµy kh«ng ph¶i lµ i th× ta ®æi chç hai phÇn tö a[i] vµ
a[k]. (LÖnh if(k!=i) swap(a[i],a[k]);). ë ®©y ta sö dông hµm swap() thùc
hiÖn ®æi gi¸ trÞ hai ®èi sè. Hµm nµy cã trong ch¬ng tr×nh
41SapXep.cpp.

void selectsort(float a[],int N)


{int i,j,k; float min;
for(i=0;i<N-1;i++)
{k=i; min=a[i];
for(j=i+1;j<N;j++)
if(a[j]<min) {k=j; min=a[j];}
if(k!=i) swap(a[i],a[k]);
}
}

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]);
}

4.2.2. S¾p xÕp næi bät (Bubble sort)


a. M« t¶ thuËt to¸n
Theo ph¬ng ph¸p nµy, danh s¸ch sÏ ®îc duyÖt nhiÒu lÇn, mçi lÇn duyÖt
sÏ lÇn lît so s¸nh cÆp nót thø i vµ i+1 vµ ®æi chç 2 nót nµy nÕu kh«ng
®óng thø tù. Cã thÓ ®a ra mét sè nhËn xÐt nh sau:
- Sau lÇn duyÖt thø nhÊt phÇn tö lín nhÊt sÏ ®îc xÕp ®óng chç, tøc lµ ®-
îc ®a vÒ phÝa cuèi cña d·y. Vµ nãi chung sau lÇn duyÖt thø i th× c¸c
phÇn tö tõ n-i ®Õn n-1 ®îc ®Æt ®óng chç. Nãi c¸ch kh¸c nh÷ng phÇn
tö lín, næi bät lªn trªn cïng th× sÏ ®îc g¹t ra tríc hÕt.
- NÕu cã mét lÇn duyÖt mµ kh«ng cã cÆp phÇn tö nµo ®æi chç th× d·y
®· ®îc s¾p xÕp.

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Bubble Sort:

Tæng sè lÇn so s¸nh:


Trong trêng h¬p xÊu nhÊt (khi ban ®Çu d·y lµ gi¶m dÇn), ta cÇn n-1
phÐp duyÖt (lÇn ®Çu duyÖt n phÇn tö, lÇn 2 duyÖt n-1 phÇn tö, lÇn n-1
duyÖt 2 phÇn tö). Mçi lÇn duyÖt cÇn n-1 phÐp so s¸nh. VËy
Tæng sè lÇn so s¸nh lµ: C(n) = (n-1)2 = O(n2).
Sè lÇn ®æi chç dÜ nhiªn nhá h¬n tæng sè lÇn so s¸nh, do ®ã thuËt to¸n
nµy cã bËc lµ O(n2).

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).

b. Cµi ®Æt thuËt to¸n Bubble sort


B¶n chÊt cña thuËt to¸n nµy lµ so s¸nh c¸c cÆp phÇn tö liÒn kÒ. NÕu
chóng ngîc thø tù th× ®îc ®æi cho nhau. Mâi lÇn duyÖt nh thÕ th× chØ
59
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
cã mét sè cÆp ®îc s¾p xÕp ®óng, chø cha ph¶i toµn bé d·y. Tuy nhiªn
nÕu cã mét lÇn duyÖt nµo ®ã mµ ta kh«ng ph¸t hiÖn ra cÆp s¾p ngîc
thø tù th× cã nghÜa lµ d·y ®· s¾p xÕp. V× cha biÕt tríc sè lÇn duyÖt nªn
ta sÏ dïng mét biÕn logic cã tªn lµ doicho ®Ó ghi nhËn t×nh tr¹ng cã sù
®æi chç hay kh«ng cho mét lÇn duyÖt. Khi b¾t dÇu duyÖt th× biÕn nµy
nhËn gi¸ trÞ false. Trong qu¸ tr×nh duyÖt nÕu cã sù dæi chç th× nã nhËn
gi¸ trÞ true, cã nghÜa lµ cã sù ®æi chç. NÕu qua mét lÇn duyÖt mµ
doicho vÉn kh«ng bÞ thay ®æi gi¸ trÞ, cã nghÜa lµ vÉn nhËn gi¸ trÞ false
th× kÕt thóc, v× ®iÒu ®ã cã nghÜa lµ d·y ®· s¾p xÕp.
void bubblesort(float a[],int N)
{int i,j,doicho;
do
{doicho=false;
for(j=0;j<N-1;j++)
if(a[j]>a[j+1]) {swap(a[j],a[j+1]);doicho=true;}
}
while(!doicho);
}

c. ThuËt to¸n Bubble Sort c¶i tiÕn


Tõ nhËn xÐt r»ng víi lÇn duyÖt ®Çu tiªn i=1 phÇn tö lín nhÊt sÏ ®îc
chuyÓn vÒ cuèi d·y, tøc lµ phÇn tö a n-1 ®· ë ®óng vÞ trÝ. V× vËy lÇn
duyÖt tiÕp theo ta chØ cÇn ®i ®Õn vÞ trÝ n-2. Nãi chung t¹i lÇn duyÖt i
th× chØ cÇn so s¸nh c¸c cÆp tõ vÞ trÝ 0 cho ®Õn vÞ trÝ N-i. Ta cã hµm
cµi ®Æt thuËt to¸n nµy nh sau:

void bubblesort2(float a[],int N)


{int i,j,doicho;
i=1;
do
{doicho=false;
for(j=0;j<N-i;j++)
if(a[j]>a[j+1]) {swap(a[j],a[j+1]);doicho=true;}
i++;
}
while(!doicho);
}

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:

Tæng sè lÇn so s¸nh:


Trong trêng hîp xÊu nhÊt (d· ban ®Çu ®îc s¾p gi¶m dÇn), cÇn n-1 lÇn
duyÖt (k=1,2,...,n-1) lÇn duyÖt thø i cÇn n-i lÇn so s¸nh.
Tæng sè lÇn so s¸nh lµ: C(n) = (n-1)+(n-2)+...+(n-k)+...+2+1 = n(n-1)/2
= O(n2).
Tæng sè lÇn ®æi chç Ýt h¬n tæng sè lÇn so s¸nh, do ®ã thuËt to¸n nµy
cã ®é phøc t¹p tÝnh to¸n lµ O(n2).

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.

4.2.3. S¾p xÕp chÌn (Insertion sort)


a. M« t¶ thuËt to¸n
ThuËt to¸n s¾p xÕp chÌn còng ®¬n gi¶n gÇn nh s¾p xÕp chän nhng
mÒm dÎo h¬n, c¸ch thùc hiÖn nh sau:
§Çu tiªn ta xem danh s¸ch ®· s¾p thø tù chØ cã mét phÇn tö lµ a 0. Ta
b¾t ®Çu chÌn c¸c phÇn tö a1,..., an-1 vµo danh s¸ch sao cho tÝnh s¾p thø
tù lu«n ®îc b¶o ®¶m. Gi¶ sö ta ®· t¹o ®îc danh s¸ch cã k phÇn tö a 0,
a1,..., ak-1 . Ta sÏ chÌn phÇn tö ak vµo danh s¸ch nh sau:
Ta cÇn mét biÕn trung gian x, ®Ó lu tr÷ t¹m thêi gi¸ trÞ ak, v× ta sÏ
cÇn vÞ trÝ thø k, tøc lµ ak ®Ó kÐo c¸c phÇn tö sang ph¶i mét vÞ trÝ
trong qu¸ tr×nh t×m mét vÞ trÝ thÝch hîp cho x. Sau khi x¸c ®Þnh ®îc
vÞ trÝ thÝch hîp cho x, thÝ dô vÞ trÝ j, ta g¸n aj = x (gi¸ trÞ cò cña aj ®·
®îc chuyÓn sang vÞ trÝ j+1)

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt:

Tæng sè lÇn so s¸nh:


Sè lÇn so s¸nh tèi ®a trong lÇn chÌn 1 lµ 1
Sè lÇn so s¸nh tèi ®a trong lÇn chÌn 2 lµ 2
...
Sè lÇn so s¸nh tèi ®a trong lÇn chÌn n-1 lµ n-1
VËy C(n) ≤ 1+2+...+(n-1) = (n2 -n)/2 cã bËc lµ O(n2 )
V× qu¸ tr×nh so s¸nh vµ dÞch chuyÓn ®îc thùchiÖn ®ång thêi, nªn sè
phÐp dÞch chuyÓn cïng cã bËc nh sè phÐp so s¸nh.
V× vËy ta cã thêi gian thùc hiÖn gi¶i thuËt insertion sort cã bËc lµ
O(n2).

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).

b. Cµi dÆt thuËt to¸n insertion sort


Ban ®Çu d·y ®îc xem chØ cã mét phÇn tö a[0] vµ dÜ nhiªn ®îc xem lµ ®·
s¾p xÕp. Sau ®ã xuÊt ph¸t tõ i=1,2,...,N-1 ta chÌn phÇn tö a[i] vµo danh

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:

void insertsort(float a[],int N)


{int i,j;int x;
for(i=1;i<N;i++) //Ban dau day chi co 1 phan tu a[0]
{x=a[i];//chen a[i] vao day da sx a[0],a[1],...,a[i-1]
j=i;
while(j>0 && x<a[j-1])
{a[j]=a[j-1];//Keo nut lon hon x len mot vi tri
j--;
};
/*Chen x vao vi tri hop le, j la vi tri dau tien ma x>=a[j-1]
do do gia tri j dung la vi tri can chen x */
a[j]=x;
} //end of for(i=1;i<N;i++)
};

4.2.4. Ph¬ng ph¸p Shell Sort


a. M« t¶ thuËt to¸n
Shell sort lµ mét d¹ng c¶i tiÕn kh¸c cña insertion sort. Nh ta thÊy, trong
trêng hîp d·y cha s¾p thø tù th× sè lÇn so s¸nh vµ ®æi chç trong
insertion sort rÊt lín. Khi chÌn mét phÇn tö míi ngêi ta ph¶i t×m ®îc vÞ trÝ
cÇn chÌn vµ trong qu¸ tr×nh t×m kiÕm ph¶i dÞch chuyÓn tÊt c¶ c¸c phÇn
tö ë vÒ phÝa ph¶i vÞ trÝ ®ã sang ph¶i mét vÞ trÝ. VÝ dô nÕu phÇn tö nhá
nhÊt n»m ë cuèi danh s¸ch th× ngêi ta cÇn thùc hiÖn n lÇn dÞch chuyÓn
míi ®Õn ®îc vÞ trÝ cÇn chÌn phÇn tö ®ã (vÞ trÝ ®Çu tiªn) Ngêi ta c¶i
tiÕn b»ng c¸ch tríc khi thùc hiÖn simple insertion th× tiÕn hµnh vµi bíc
chÌn víi bíc t¨ng lín h¬n 1 ®Ó danh s¸ch cã xu híng gÇn s¾p xÕp h¬n.
Víi bíc t¨ng h, ngêi ta s¾p xÕp danh s¸ch hoÆc tËp tin sao cho víi mäi d·y
con Ai = (ai, ai+h, ai+2h,... ,ai+kh) lµ d·y ®· s¾p thø tù. B»ng c¸ch s¾p xÕp
theo ®é dµi bíc h víi gi¸ trÞ h kh¸ lín, chóng ta cã thÓ di chuyÓn c¸c
phÇn tö c¸ch xa trong m¶ng vµ v× vËy khi s¾p xÕp víi c¸c bíc h nhá h¬n
th× Ýt ph¶i dÞch chuyÓn. Th«ng thêng c¸c bíc h cã ®é lín gi¶m dÇn vµ
ë bíc cuèi cïng víi h=1 ta ®îc danh s¸ch ®· s¾p xong.

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt :


ViÖc ph©n tÝch ®¸nh gi¸ thêi gian tÝnh to¸n cña Shellsort rÊt khã kh¨n
vµ phô thuéc vµo viÖc chóng ta chän d·y c¸c bíc t¨ng h nh thÕ nµo. Theo
thùc tÕ th× thêi gian thùc hiÖn gi¶i thuËt nµy cã bËc kho¶ng O(n1.5).

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.

b. Cµi dÆt thuËt to¸n Shell Sort


 S¾p xÕp chÌn víi bíc t¨ng h.
Môc ®Ých s¾p xÕp chÌn bíc t¨ng h lµ ta s¾p xÕp tËp tin sao cho víi
mäi d·y con Ai = (ai, ai+h, ai+2h,... ,ai+kh), i = 0,1,2,... lµ d·y ®· s¾p thø tù.
B»ng c¸ch s¾p xÕp theo ®é dµi bíc h víi gi¸ trÞ h kh¸ lín, chóng ta cã
thÓ di chuyÓn c¸c phÇn tö c¸ch xa trong m¶ng vµ v× vËy khi s¾p xÕp víi
c¸c bíc h nhá h¬n th× Ýt ph¶i dÞch chuyÓn. Th«ng thêng c¸c bíc h cã
®é lín gi¶m dÇn vµ ë bíc cuèi cïng víi h=1 ta cã danh s¸ch ®îc s¾p. T-
¬ng tù víi s¾p xÕp chÌn ®¬n gi¶n, ë bíc ®Çu tiªn ta còng xem d·y gåm
mét phÇn tö a[0] lµ d·y ®îc s¾p xÕp, sau ®ã b¾t ®Çu chÌn vµo d·y nµy
c¸c phÇn tö kh¸c cña danh s¸ch. Tuy nhiªn ®iÓm kh¸c biÖt lµ ta kh«ng
b¾t ®Çu tõ a[1] mµ b¾t ®Çu tõ a[i] víi i = h, h+1, h+2,... §Ó chÌn
a[i], tríc tiªn ta dïng mét biÕn trung gian x ®Ó lu gi¸ trÞ nµy vµ dïng vÞ
trÝ i kÐo dÇn c¸c phÇn tö c¸ch i mét kho¶ng k*h vµ lín h¬n x dÞch
sang ph¶i h vÞ trÝ , cho ®Õn khi gÆp vÞ trÝ j ®Çu tiªn nhá h¬n hoÆc
b»ng x. Sau ®ã x (tøc lµ a[i] lóc ®Çu) sÏ ®îc chÌn vµo sau vÞ trÝ j nµy.

void insertsort(float a[],int N, int h=1)


{int i,j;int x;
for(i=h;i<N;i++) //Ban dau day chi co 1 phan tu a[0]
{x=a[i];//chen a[i] vao day da sx a[0],a[1],...,a[i-1]
j=i;
while(j>0 && x<a[j-h])
{a[j]=a[j-h];//Keo nut lon hon x len h vi tri
j=j-h;
};
/*Chen x vao vi tri hop le, j la vi tri dau tien ma x>=a[j-h]
do do gia tri j dung la vi tri can chen x */
a[j]=x;
} //end of for(i=h;i<N;i++)
};

 T¸c vô shell sort


T¸c vô shell sort b©y giê ®¬n gi¶n lµ thùc hiÖn mét sè lÇn thñ tôc
chÌn cã bíc t¨ng h, trong ®ã h gi¶m dÇn vµ cuèi cïng b»ng 1.
§Çu vµo cña hµm nµy ngoµi m¶ng a cßn cã m¶ng step[] cã cì stepnum,
m¶ng nµy tháa m·n step[0]>step[1]>...>step[stepnum]. Trong ch¬ng
tr×nh 41SapXep.CPP th× m¶ng nµy ®îc khai b¸o lµ: int step[3] = {5,3,1};

void shellsort(float a[],int N,int step[],int stepnum)


{int s,i,j,h;int x;
for(s=0;s<stepnum;s++)
{h=step[s];
insertsort(a,N,h);
}
};

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Þ

4.2.5. S¾p xÕp nhanh (Quick Sort)


a. M« t¶ thuËt to¸n
ThuËt to¸n Quicksort ®îc ph¸t minh bëi A.R.Hoare vµo n¨m 1960 vµ
sau ®ã ®· ®îc nhiÒu ngêi nghiªn cøu ph¸t triÓn. §©y lµ ph¬ng ph¸p rÊt
hiÖu qu¶ vµ th«ng dông, thêi gian ch¹y trung b×nh kho¶ng nlogn, trêng
hîp xÊu nhÊt cÇn O(n2) thao t¸c.
C¸ch thùc hiÖn ph¬ng ph¸p nµy nh sau:

 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.

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt :

Tæng sè lÇn so s¸nh:


Víi Quicksort, trêng hîp tèt nhÊt lµ nót trôc lóc nµo còng ë gi÷a danh
s¸ch. Gi¶ sö sè nót lµ 2m (m = lgn), ta cã
Víi 20 = 1 danh s¸ch ban ®Çu cÇn 2m lÇn so s¸nh trong mçi

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.

VËy tæng sè lÇn so s¸nh lµ:

20 . 2m + 21 . 2m-1 + ... 2m-1 . 2 = 2m (m-1) ~ nlog2n

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ù.

b. Cµi dÆt thuËt to¸n Quick Sort


 Thñ tôc partition
Thñ tôc partition lµ h¹t nh©n cña thuËt to¸n s¾p xÕp ®Ö quy quick
sort. Tham sè vµo cña thñ tôc lµ 2 biÕn nguyªn low vµ up chØ vÞ trÝ
®Çu vµ vÞ trÝ cuèi cña ®o¹n d÷ liÖu cÇn ph©n ho¹ch. PhÇn ra cña thñ
tôc lµ biÕn pivot chØ vÞ trÝ chia danh s¸ch thµnh 2 phÇn: c¸c nót cã néi
dung nhá h¬n hoÆc b»ng a[pivot] n»m bªn tr¸i pivot, c¸c nót cã néi dung
lín h¬n a[pivot] n»m bªn ph¶i pivot. Nh vËy th× a[pivot] ®· n»m ®óng
vÞ trÝ cña nã trong danh s¸ch. Thùc hiÖn tiÕp viÖc ph©n ho¹ch víi 2 danh
s¸ch con ta cã thªm 2 phÇn tö n÷a n»m ®óng vÞ trÝ. Cø nh vËy t¹i bíc i
ta cã ®îc 20 + 21 + ... + 2i = 2i+1 -1 phÇn tö ®îc ®Æt ®óng chç. Nh vËy
trong kho¶ng log2n bíc ta cã ®îc danh s¸ch ®· s¾p xÕp. VÊn ®Ò lµ ë chç
t¹i mçi bíc ta chän nót trôc nh thÕ nµo? DÜ nhiªn nót trôc ph¶i lµ hµm cña
hai biÕn low vµ up. §Ó ®¬n gi¶n ta chän nót trôc pivotval = a[low]. VÞ
trÝ nµy nãi chung cha ph¶i vÞ trÝ ®óng cña nót trôc. Ta cÇn t×m mét vÞ
trÝ thÝch hîp tõ low ®Õn up ®Ó chuyÓn nót trôc ®Õn ®ã. Ta sÏ dïng 2
con trá lµ 2 biÕn nguyªn i vµ j ; i quÐt tõ low vÒ phÝa up, cßn j quÐt tõ
phÝa up vÒ phÝa low. i sÏ bá qua c¸c vÞ trÝ mµ a[i] ≤ pivotval vµ dõng l¹i
khi gÆp gi¸ trÞ a[i] > pivotval. Ngîc l¹i j sÏ bá qua c¸c vÞ trÝ mµ a[j] >
pivotval vµ dõng l¹i khi gÆp gi¸ trÞ a[j] ≤ pivotval. Gi¶ sö i < j. VÞ trÝ
mµ ta ®ang cÇn x¸c ®Þnh cho pivot sÏ n»m trong kho¶ng [i,j], vµ ®Ó cã
®îc a[i] ≤ pivotval cßn a[j] > pivotval th× ta ph¶i ®æi gi¸ trÞ t¹i 2 vÞ trÝ
nµy cho nhau. Sau khi ®æi chç 2 phÇn tö sai chç, con trá i ®i tiÕp vÒ
65
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Ýa up, j ®i tiÕp vÒ phÝa low. Cho ®Õn khi nµo ta cã j ≤ i th× dõng l¹i.
T¹i ®©y ta kh«ng ph¶i ®æi gi¸ trÞ t¹i 2 vÞ trÝ, v× ta ®· cã a[j] ≤ pivotval
< a[i]. Ta thÊy t¹i c¸c vÞ trÝ r ≥ j ta lu«n cã pivotval < a[r], do ®ã j
chÝnh lµ vÞ trÝ cÇn ®Æt pivotval ®Ó b¶o ®¶m yªu cÇu ®Æt ra. Do ®ã ta
chuyÓn a[j] vÒ vÞ trÝ low, cßn a[low] th× chuyÓn vÒ vÞ trÝ j, vµ j
còng chÝnh lµ gi¸ trÞ pivot ®ang cÇn t×m.
VÝ dô, gi¶ sö d·y A ban ®Çu lµ:
a0 a1 a2 a3 a4
3 7 2 1 6

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;
}

 Thñ tôc ®Ö quy quicksort


Sö dông thñ tôc partition ta cã thÓ dÔ dµng ®i tíi thñ tôc ®Ö quy s¾p
xÕp nhanh sau ®©y:

void quicksort(float a[],int low,int up)


{int pivot;

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);
}

4.2.6. S¾p xÕp kiÓu xÕp chång (Heap sort)


Trong insertion sort hay shell sort chóng ta ®· dÞch chuyÓn c¸c phÇn tö
®Õn c¸c vÞ trÝ tuyÕn tÝnh, tøc lµ c¸c vÞ trÝ c¸ch ®Òu. Cã thÓ xem Heap
sort mµ chóng t«i sÏ giíi thiÖu sau ®©y còng lµ mét d¹ng c¶i tiÕn cña
shell sort, nhng ë ®©y chóng ta dÞch chuyÓn c¸c phÇn tö kh«ng theo
mét trËt tù tuyÕn tÝnh mµ theo mét cÊu tróc phi tuyÕn lµ c©y nhÞ ph©n.

a. CÊu tróc heap


Heap lµ c©y nhÞ ph©n gÇn ®Çy (almost complete binary tree) ®îc cµi
®Æt b»ng m¶ng mét chiÒu víi nót gèc cã khãa lín nhÊt, vµ tÊt c¶ c¸c
c©y con trong heap còng lµ heap.
Heap nµy ®îc gäi lµ heap gi¶m, ta cã thÓ ®Þnh nghÜa heap t¨ng b»ng
c¸ch t¬ng tù.

0 30

26 24
1 2

22 20 15
3 4 5

H×nh 4.1. CÊu tróc mét heap

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

H×nh 4.2. Dïng m¶ng ®Ó cµi ®Æt heap

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.

b. S¾p xÕp b»ng heap


ý tëng cña ph¬ng ph¸p nµy lµ biÕn ®æi m¶ng A= (a 0, a1,..., an-1) sao
cho m¶ng A lµ cµi ®Æt cña heap cã c¸c nót theo thø tù a0, a1,..., an-1.
Sau khi t¹o ®îc heap cã n nót ta sÏ lÇn lît chuyÓn nót gèc vÒ cuèi vµ
chØnh l¹i heap. §Õn khi heap chØ cßn mét nót th× qu¸ tr×nh s¾p xÕp
67
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
hoµn tÊt vµ m¶ng A ®· ®îc s¾p xÕp. Cô thÓ h¬n ta thùc hiÖn c¸c bíc nh
sau:

BiÕn ®æi m¶ng A ®Ó t¹o cÊu tróc heap:


§Çu tiªn ta xem heap chØ cã mét phÇn tö a0. Ta lÇn lît chÌn c¸c phÇn tö
a1,..., an-1 vµo heap, sao cho cÊu tróc cña heap lu«n ®îc b¶o toµn. Gi¶
sö heap ®· cã k nót a1,..., ak-1, ta cÇn chÌn thªm nót ak . C¸ch thùc
hiÖn rÊt gièng víi c¸ch chÌn trong insertion sort hoÆc shell sort,
nghÜa lµ tríc hÕt ta lu l¹i gi¸ trÞ ak b»ng lÖnh x = ak, råi dïng vÞ trÝ
cña ak lµm ®iÓm xuÊt ph¸t ®Ó dÞch chuyÓn c¸c nót theo c¸ch nót
con = nót cha, cho ®Õn vÞ trÝ cã thÓ chÌn nót víi néi dung x.

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.

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt :


V× heap lµ c©y nhÞ ph©n gÇn ®Çy, do ®ã chiÒu cao cña heap lµ
log2(n+1)-1. Tõ ®©y cã thÓ tÝnh ®îc thêi gian thùc hiÖn gi¶i thuËt heap
sort trong trêng hîp xÊu nhÊt lµ O(nlog2n).
Heap sort lµ mét trong nh÷ng gi¶i thuËt s¾p xÕp trong hiÖu qu¶ nhÊt.

ø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Þ

c. Cµi dÆt thuËt to¸n Heap Sort


Qu¸ tr×nh s¾p xÕp ®îc thùc hiÖn qua 2 phÇn mµ b¹n ®äc cã thÓ
nhËn biÕt ®îc tõ ch¬ng tr×nh:
PhÇn 1: ChuyÓn danh s¸ch thµnh heap. Ban ®Çu ta xem heap chØ cã
mét nót a[0], sau ®ã ta lÇn lît chÌn c¸c nót a[1], a[2],..., a[count-
1] vµo heap. V× heap lµ c©y nhÞ ph©n gÇn ®Çy, nªn khi thªm
nót thø a[k] vµo mét heap cã k nót a[0], a[1], ..., a[k-1], th×
nót a[k] sÏ lµ nót cuèi cïng trong c©y nÕu ta duyÖt c©y theo
møc. Tuy nhiªn ta cÇn trao ®æi néi dung cña nót a[k] víi mét nót
nµo ®ã trong c©y ®Ó cÊu tróc heap ®îc b¶o toµn. C¸c bíc thùc
hiÖn còng gièng nh ph¬ng ph¸p chÌn, nghÜa lµ ®Çu tiªn ta còng
dïng mét biÕn x trung gian ®Ó lu l¹i gi¸ trÞ cña a[k], sau ®ã dïng
vÞ trÝ a[k] ®Ó dån mét sè phÇn tö tõ phÝa tríc ra phÝa sau, cho
®Õn khi t×m ®îc vÞ trÝ thÝch hîp chÌn x. §iÒu kh¸c biÖt cña ph-
¬ng ph¸p dïng heap lµ sù dÞch chuyÓn c¸c phÇn tö kh«ng theo
mét trËt tù tuyÕn tÝnh nh ph¬ng ph¸p chÌn ®¬n gi¶n hoÆc chÌn
bíc t¨ng h, mµ theo mét quan hÖ cha con trªn cÊu tróc c©y. Quan
hÖ ®ã lµ f = (s-1)/2, trong ®ã f lµ vÞ trÝ nót cha, cßn s lµ vÞ trÝ
nót con. Sù thay thÕ lµ: chõng nµo néi dung trong nót cha cßn
nhá h¬n x th× nót cha sÏ ®îc kÐo lªn vÞ trÝ nót con. Khi qu¸
tr×nh dõng l¹i th× ta ®îc vÞ trÝ cÇn chÌn x.

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--)
};

4.2.7. S¾p xÕp trén (Merge sort)


a. M« t¶ thuËt to¸n
ý tëng cña ph¬ng ph¸p nµy lµ chia danh s¸ch thµnh nhiÒu danh s¸ch
con, trén tõng 2 danh s¸ch mét thµnh mét danh s¸ch. TiÕp tôc nh vËy cho
®Õn khi chØ cßn 2 danh s¸ch con, ta trén tiÕp 2 danh s¸ch nµy thµnh
danh s¸ch ®Çy ®ñ ®îc s¾p xÕp. Cô thÓ ta chia lµm c¸c bíc trén nh sau:

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.

Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt :

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.

b. Cµi dÆt thuËt to¸n Merge Sort


PhÇn chÝnh cña t¸c vô nµy lµ trén 2 danh s¸ch ®· s¾p xÕp [low1,up1]
vµ [low2,up2] trong ®ã low2 = up1 +1, hai danh s¸ch nµy lµ 2 danh s¸ch
con liªn tiÕp trªn danh s¸ch a. Khi trén xong ta cã danh s¸ch con ®· s¾p
xÕp [low1,up2] trªn danh s¸ch t¹m Listtmp (Xem h×nh 4.3).

Danh s¸ch cÇn s¾p xÕp a


Danh s¸ch Danh s¸ch
1 2

Danh s¸ch t¹m Listtmp


Ds trén tõ ds 1vµ ds 2

H×nh 4.3. Trén 2 danh s¸ch con

C¸ch trén 2 danh s¸ch con ®îc thùc hiÖn nh sau:


Ta dïng 3 con trá i,j,k ®Ó dÞch chuyÓn trong c¸c danh s¸ch. i quÐt tõ
low1 ®Õn up1, j quÐt tõ low2 ®Õn up2, cßn k th× quÐt tõ low1 ®Õn
up2. Tuy nhiªn gi¸ trÞ cña k chØ cÇn khëi ®Çu b»ng 0 tríc khi trén 2 danh
s¸ch con ®Çu tiªn, sau ®ã sù dÞch chuyÓn cña k phô thuéc vµo sù dÞch
chuyÓn cña i vµ j, mçi lÇn i hoÆc j t¨ng lªn 1 th× k còng t¨ng lªn 1.
Trong qu¸ tr×nh i vµ j dÞch chuyÓn ta so s¸nh 2 gi¸ trÞ a[i] vµ a[j] vµ
chän sè bÐ h¬n ®Ó ®a sang danh s¸ch Listtmp. NÕu i ®îc chän th× i
t¨ng lªn 1, cßn nÕu j ®îc chän th× j t¨ng lªn 1. Ta dÔ thÊy r»ng nãi
chung i vµ j kh«ng ®Õn ®Ých cïng mét lóc. Do ®ã khi mét trong 2
con trá i hoÆc j ®Õn ®Ých th× ta chuyÓn toµn bé phÇn cßn l¹i trong d·y
con kia ®a sang Listtmp mµ kh«ng cÇn so s¸nh g× c¶.

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.

void mergesort(float a[],int N)


{int i,j,k,low1,up1,low2,up2;//Can duoi va tren cua 2 ds con
int size;
int *Listtmp=new int[N];
size=1;//Buoc tron 1: gan size bang 1
while(size<N)
{low1=0;k=0;

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++];;

/*Vi so phan tu duoc chon tu 2 ds khong nhu nhau nen co the i


hoac
j se den dich truoc. Trong truong hop nay ta chuyen phan con lai
cua day chua quet xong sang ds tam*/
for(; i <= up1; k++) Listtmp[k] = a[i++];
for(; j <= up2; k++) Listtmp[k] = a[j++];
low1 = up2+1;
} //while(low1+size<N)

/*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.

4.3. T×m kiÕm


C¸c thuËt to¸n t×m kiÕm cã rÊt nhiÒu. ë ®©y chóng t«i chØ gií thiÖu hai
thuËt to¸n t×m kiÕm trªn m¶ng thêng sö dông lµ t×m kiÕm tuyÕn tÝnh
vµ t×m kiÕm nhÞ ph©n. Ch¬ng tr×nh cµi ®Æt hai thuËt to¸n nµy ®îc lu
trong tÖp 42TKIEM.CPP.

4.3.1. T×m kiÕm tuyÕn tÝnh vÞ trÝ cã néi dung x


T¸c vô lsearch thùc hiÖn viÖc t×m kiÕm tuÇn tù tõ ®Çu danh s¸ch cho
®Õn khi b¾t gÆp phÇn tö cã néi dung x cÇn t×m. NÕu t×m thÊy th× t¸c
vô tr¶ vÒ vÞ trÝ t×m thÊy Ngîc l¹i, gi¸ trÞ tr¶ vÒ gi¸ trÞ -1. Thao t¸c t×m
kÝem ®îc thùc hiÖn theo mét tr×nh tù tuyÕn tÝnh. x ®îc lÇn lît so s¸nh víi
c¸c phÇn tö trong danh s¸ch, b¾t ®Çu tõ phÇn tö ®Çu tiªn a[0]. NÕu
trong qu¸ tr×nh so s¸nh cã phÇn tö trïng víi x th× tr¶ vÒ vÞ trÝ t×m thÊy
vµ kÕt thóc. Trêng hîp xÊu nhÊt lµ trong danh s¸ch kh«ng cã phÇn tö nµo
cã gi¸ trÞ b»ng x. Khi ®ã ta ph¶i duyÖt qua toµn bé danh s¸ch.

int lsearch(float a[],int N,float x)


{int i;
for(i=0;i<N;i++) if(a[i]==x) return(i);
return(-1);
}

§¸nh gi¸ ®é phøc t¹p tÝnh to¸n:


Trêng hîp tèt nhÊt lµ phÇn tö ®Çu tiªn cã gi¸ trÞ b»ng x. Lóc nµy ta chØ
cÇn mét phÐp so s¸nh, vµ nh thÕ ®é phøc t¹p tÝnh to¸n h»ng sè, tøc lµ
thuËt to¸n nµy cã bËc O(1).

4.3.2. T×m kiÕm nhÞ ph©n vÞ trÝ cã néi dung x


T¸c vô bsearch thùc hiÖn viÖc t×m kiÕm nhÞ ph©n. §iÒu kiÖn ®Ó thùc
hiÖn ph¬ng ph¸p nµy lµ danh s¸ch ®· ®îc s¾p xÕp. C¸ch thùc hiÖn ph-
¬ng ph¸p nµy nh sau: ®Çu tiªn ta ®Æt biÕn bottom b»ng 0, lµ vÞ trÝ
phÇn tö ®Çu tiªn cña danh s¸ch, biÕn top b»ng N-1, lµ vÞ trÝ phÇn tö cuèi
cïng cña danh s¸ch, vµ biÕn mid = (bottom+top)/2 lµ vÞ trÝ phÇn tö ë
gi÷a. NÕu néi dung cña nót mid b»ng x th× vÞ trÝ mid chÝnh lµ vÞ trÝ
cÇn t×m vµ qu¸ tr×nh t×m kiÕm kÕt thóc. NÕu x<a[mid] th× ta tiÕn

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.

int bsearch(float a[],int N,float x)


{//Kiem tra xem danh sach da sap xep chua
if(!sorted(a,N)) {cout<<"Danh sach chua sap xep";return false;}
int i,j,k;
i=0,j=N-1;
while(i<=j)
{k=(i+j)/2;
if(a[k]==x) return(k);
if(x<a[k]) j=k-1; else i=k+1;
}
return(-1);
};

§¸nh gi¸ ®é phøc t¹p tÝnh to¸n:

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.

Cµi ®Æt ch¬ng tr×nh:


void selectsort(float a[],int N)
{int i,j,k; float min;
for(i=0;i<N-1;i++)
{k=i; min=a[i];
for(j=i+1;j<N;j++)
if(a[j]<min) {k=j; min=a[j];}
if(k!=i) swap(a[i],a[k]);
}
}
Gi¶i thÝch ch¬ng tr×nh:
Sau phÇn khai b¸o, lÖnh for(i=0;i<N-1;i++) sÏ cho biÕn i ch¹y tõ 0 ®Õn N-2. Víi mçi i
ta t×m vÞ trÝ k sao cho a[k] lµ bÐ nhÊt trong d·y a[i], a[i+1], ..., a[N-1]. §Çu tiªn vÞ trÝ
bÐ nhÊt ®îc t¹m ®Æt lµ i, vµ gi¸ trÞ bÐ nhÊt min ®îc t¹m g¸n b»ng a[i] (c¸c lÖnh k=i;
min=a[i];) sau ®ã ta dïng biÕn j lÇn lît duyÖt qua c¸c phÇn tö phÝa sau, b¾t ®Çu tõ vÞ
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
trÝ j+1 (lÖnh for(j=i+1;j<N;j++)). Víi mçi j nÕu ta thÊy r»ng phÇn tö a[j] <min th× thay
thÕ min b»ng gi¸ trÞ a[j] vµ ghi nhËn vÞ trÝ nµy (lÖnh if(a[j]<min) {k=j; min=a[j];}).
Khi j ®i ®Õn cuèi d·y th× a[k] chÝnh lµ gi¸ trÞ bÐ nhÊt. Ta ®æi chç a[k] víi a[i] nÕu i
≠k (lÖnh if(k!=i) swap(a[i],a[k]);).

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

C¸c bíc víi i=0, 1, 2 ®îc thùc hiÖn nh sau:


a0 a1 a2 a3 a4 a5
i=0 14 2 1 13 12 11
1 2 14 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.

Ch¬ng 1. ThuËt to¸n vµ thuËt gi¶i


(Ch¬ng nµy kh«ng cã trong ®Ò c¬ng «n tËp nhng cÇn hiÓu ®Ó ¸p
dông cho c¸c phÇn sau)
1. Nªu ®Þnh nghÜa vµ c¸c ®Æc trng cña thuËt to¸n. H·y nªu mét vÝ dô
vÒ thuËt to¸n vµ nãi râ c¸c ®Æc trng cña thuËt to¸n ®ã thÓ hiÖn nh
thÕ nµo.
2. Nªu c¸c ph¬ng ph¸p biÓu diÔn thuËt to¸n vµ ph©n tÝch nh÷ng ®iÓm
m¹nh, ®iÓm yÕu cña tõng ph¬ng ph¸p.
3. Gi¶i thÝch kh¸i niÖm ®é phøc t¹p tÝnh to¸n cña c¸c thuËt to¸n th«ng
qua kh¸i niÖm ¤ lín (vÝ dô T(n) = O(g(n)) nghÜa lµ g×). Nªu quy t¾c
c¸ch ®¸nh gi¸ mét biÓu thøc cã d¹ng tæng hoÆc tÝch qua viÖc ®¸nh
gi¸ c¸c thµnh phÇn. ¸p dông ®Ó ®¸nh gi¸ biÓu thøc:
T(n) = 7n2log(n!) + (n2 + 4)logn
4. Gi¶i thÝch t¹i sao nÕu T(n) = O(n) th× còng sÏ ®óng nÕu ta viÕt T(n)
= O(n2 ). Tõ ®©y b¹n h·y nªu nh÷ng chó ý khi hiÓu vÒ ®é phøc t¹p
tÝnh to¸n.
5. V× sao cÇn ph¶i më réng kh¸i niÖm thuËt to¸n?
6. Nªu mèi quan hÖ gi÷a thuËt gi¶i vµ cÊu tróc d÷ liÖu.
7. H·y nªu c¸c bíc cÇn thiÕt khi gi¶i quyÕt mét bµi to¸n b»ng m¸y tÝnh.
76
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp

Ch¬ng 2. Danh s¸ch


(Xem c¸c ch¬ng tr×nh 22b-DSLK.CPP, 23-STACK,24-QUEUE.CPP)
1. Nªu ®Þnh nghÜa cÊu tróc danh s¸ch vµ mét sè c¸ch cµi ®Æt trªn m¸y
tÝnh.
2. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc danh s¸ch liªn kÕt ®¬n
(dslk®) ®îc cµi ®Æt trong bé nhí.
3. Gi¶ sö cÊu tróc c¸c nót trªn danh s¸ch ®îc khai b¸o b»ng lÖnh:
struct node {float info; node* next;};
vµ lÖnh khai b¸o cÊu tróc danh s¸ch lµ: struct DanhSach {node
*pfirst,*plast;};
Trong ®ã pfirst lµ con trá chØ ®Õn phÇn tö (nót) ®Çu tiªn, plast chØ
®Õn nót cuèi cïng trong danh s¸ch. H·y m« t¶ vµ cµi ®Æt c¸c thao t¸c
sau ®©y trªn dslk®:
- Khëi t¹o
- Thªm mét nót cã khãa x
- Hñy nót cã khãa x
- S¾p xÕp dslk®.
4. Nªu ®Þnh nghÜa cÊu tróc ng¨n xÕp (Stack), mét vµi øng dông vµ mét
sè c¸ch cµi ®Æt trªn m¸y tÝnh.
5. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc Stack ®îc cµi ®Æt
b»ng danh s¸ch liªn kÕt ®¬n (dslk®) trong bé nhí.
6. Gi¶ sö cÊu tróc c¸c nót trªn Stack ®îc khai b¸o b»ng lÖnh:
struct node {int info; node* next;};
vµ lÖnh khai b¸o cÊu tróc Stack lµ: struct NganXep {node
*phead;};
Trong ®ã phead lµ con trá chØ ®Õn phÇn tö (nót) ®Çu tiªn trong
danh s¸ch vµ còng ®îc quy íc lµ phÇn tö n»m ë ®Ønh Stack. H·y m« t¶
vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn Stack:
- Khëi t¹o
- Thªm mét nót cã khãa x vµo ®Ønh Stack (thñ tôc push).
- LÊy khãa x (vµ hñy nót chøa nã) tõ ®Ønh Stack.
- Thö l¹i Stack b»ng c¸ch dïng Stack ®Ó chuyÓn ®æi mét sè
nguyªn thËp ph©n sang d¹ng nhÞ ph©n.
7. Nªu ®Þnh nghÜa cÊu tróc hµng ®îi (Queue), mét vµi øng dông vµ
mét sè c¸ch cµi ®Æt trªn m¸y tÝnh.
8. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc Queue ®îc cµi ®Æt
b»ng danh s¸ch liªn kÕt ®¬n (dslk®) trong bé nhí.
9. Gi¶ sö cÊu tróc c¸c nót trªn Queue ®îc khai b¸o b»ng lÖnh:
struct node {int info; node* next;};
vµ lÖnh khai b¸o cÊu tróc Queue lµ: struct HangDoi {node *pfirst,
*plast;};
Trong ®ã pfirst lµ con trá chØ ®Õn phÇn tö (nót) ®Çu tiªn, plast chØ
®Õn nót cuèi cïng trong Queue. PhÇn tö ®îc lÊy ra khái Queue lu«n lµ
phÇn tö ®Çu tiªn, cßn phÇn tö míi ®îc ®a vµo cuèi Queue. H·y m« t¶
vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn Queue:
- Khëi t¹o
- Thªm mét nót cã khãa x vµo cuèi Queue (thñ tôc put).
- LÊy khãa x (vµ hñy nót chøa nã) tõ Queue.
- Thö l¹i Queue b»ng c¸ch dïng Queue ®Ó chuyÓn ®æi mét sè
thËp ph©n chØ cã phÇn lÎ sang d¹ng nhÞ ph©n.
77
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp

Ch¬ng 3. C©y nhÞ ph©n


(C¸c c©u hái tõ 1-8 c¸c b¹n lµm ®Ó hiÓu râ lý thuyÕt, kh«ng n»m
trong ®Ò c¬ng «n thi tèt nghiÖp. C¸c b¹n chó ý h¬n tõ c©u sè 9.
Xem ch¬ng tr×nh 31-CAYTK.CPP).
1. Nªu ®Þnh nghÜa c©y nhÞ ph©n vµ c¸c kh¸i niÖm nót gèc, nót cha,
nót l¸,bËc cña nót, cña c©y, møc cña c©y,... ChØ râ nh÷ng kh¸i niÖm
®ã trªn c©y nhÞ ph©n sau ®©y b»ng c¸ch tr¶ lêi nh÷ng c©u hái sau:
A
 Nót nµo lµ nót gèc? B C
 C¸c nót nµo lµ nót nh¸nh?
 Cha cña nót G lµ nót nµo? D E F G
 Møc cña nót F lµ bao nhiªu?
 BËc cña nót F lµ bao nhiªu?
H I J
 C©y cã chiÒu cao lµ bao nhiªu?

H×nh 1. C©y nhÞ ph©n


2. H·y viÕt d·y c¸c nót ®îc th¨m khi duyÖt c©y nµy theo
 Thø tù tríc
 Thø tù gi÷a
 Thø tù sau.
 DuyÖt theo bÒ réng.
V× sao ngêi ta nãi duyÖt c©y theo thø tù tríc lµ duyÖt theo ®é s©u?
(thùc ra nãi lµ theo ®é cao th× chÝnh x¸c h¬n)
4. 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.
5. B¹n h·y nªu mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n: c©y nhÞ ph©n
®Çy ®ñ, c©y nhÞ ph©n gÇn ®Çy ®ñ, c©y nhÞ ph©n ®óng, c©y nhÞ
ph©n t×m kiÕm, c©y nhÞ ph©n c©n b»ng chiÒu cao (c©y AVL). B¹n
h·y vÏ h×nh biÓu diÔn c¸c lo¹i c©y nhÞ ph©n ®ã vµ nãi râ mèi quan
hÖ gi÷a chóng, thÝ dô c©y nµo lµ trêng hîp riªng cña c©y kh¸c...C©y
nhÞ ph©n ë h×nh 1 cã thuéc lo¹i nµo võa kÓ trªn kh«ng?
6. Cã thÓ thÊy r»ng c©y nhÞ ph©n ®Çy ®ñ lµ cÊu tróc tèt nhÊt trong c¸c
cÊu tróc c©y nhÞ ph©n, nhng trong thùc tÕ lo¹i c©y nµy l¹i Ýt ®îc sö
dông, v× sao?
7. Chøng minh r»ng sè nót trªn møc r cña c©y nhÞ ph©n ®Çy ®ñ lµ 2r ,
tõ ®©y suy ra r»ng c©y nhÞ ph©n ®Çy ®ñ chiÒu cao d cã tæng sè
nót lµ 2d+1 - 1. Vµ tõ ®©y ta suy ra r»ng nÕu tæng sè nót trªn c©y lµ
n th× ®é cao cña c©y ®îc tÝnh theo c«ng thøc d = log2(n+1)-1.
8. H·y ch¹y thö ch¬ng tr×nh cµi ®Æt c©y nhÞ ph©n b»ng ph¬ng ph¸p
liªn kÕt trong tµi liÖu ®Ó hiÓu râ c¸c t¸c vô. Tù viÕt l¹i c¸c thñ tôc quan
träng (cã thÓ gièng hoÆc kh«ng gièng c¸c thñ tôc trong tµi liÖu) thÝ dô
duyÖt c©y theo ph¬ng ph¸p ®Ö quy hoÆc kh«ng ®Ö quy ®Ó n¾m
ch¾c bµi h¬n.
============================================
=======================
9. Nªu ®Þnh nghÜa cÊu tróc c©y nhÞ ph©n, mét vµi øng dông vµ mét sè
c¸ch cµi ®Æt trªn m¸y tÝnh. V× sao ph¬ng ph¸p cµi ®Æt sö dông con
trá ®Ó liªn kÕt c¸c nót tá ra tiÖn lîi h¬n ph¬ng ph¸p dïng m¶ng?
10. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc c©y nhÞ ph©n ®îc cµi
®Æt b»ng ph¬ng ph¸p liªn kÕt (dïng con trá) trong bé nhí.

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.

Ch¬ng 4. S¾p xÕp vµ t×m kiÕm


1. H·y m« t¶, cµi ®Æ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),
chÌn (insertion Sort), næi bät (Bubble Sort), Quick Sort vµ Shell Sort.
(Xem ch¬ng tr×nh 41SapXep.CPP).
2. H·y m« t¶, cµi ®Æt vµ ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n c¸c thuËt to¸n
t×m kiÕm khãa x trªn m¶ng mét chiÒu trong bé nhí. (Xem ch¬ng
tr×nh 42-TKIEM.CPP).

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.

4. Cho c©y nhÞ ph©n sau:


A

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

II. PhÇn thùc hµnh


PhÇn thùc hµnh dù kiÕn ®îc ph©n thµnh 3 møc: trung b×nh (A), lµ møc
b¾t buéc, kh¸ (B) vµ giái (C) nh sau:

C¸c bµi tËp lo¹i A:


• HiÓu ®îc c¸c ch¬ng tr×nh mÉu sau:
21a-DSKE.CPP (cµi ®Æt danh s¸ch b»ng m¶ng)
22a-DSLK.CPP (cµi ®Æt danh s¸ch b»ng ph¬ng ph¸p liªn kÕt ®¬n)
23-STACK.CPP (cµi ®Æt stack b»ng ph¬ng ph¸p liªn kÕt ®¬n)
24-QUEUE.CPP (cµi ®Æt queue b»ng ph¬ng ph¸p liªn kÕt ®¬n)
41SAPXEP.CPP (cµi ®Æt c¸c ph¬ng ph¸p s¾p xÕp, cÇn hiÓu c¸c ph-
¬ng ph¸p lùa chän, chÌn vµ næi bät)
• N¾m ch¾c ®îc mét ch¬ng tr×nh trong sè c¸c ch¬ng tr×nh trªn ®Ó cã
thÓ viÕt l¹i ®îc mét sè hµm.
Ghi chó.
- Sinh viªn cã thÓ tù viÕt ch¬ng tr×nh kh¸c víi ch¬ng tr×nh mÉu.
- Ch¬ng tr×nh 21a-DSKE.CPP cã thÓ thay b»ng ch¬ng tr×nh
21a1DSKE.CPP, 21b-DSKE.CPP hoÆc 21b1DSKE.CPP.
- Ch¬ng tr×nh 22a-DSLK.CPP cã thÓ thay b»ng ch¬ng tr×nh
22a1DSLK.CPP, 22b-DSLK.CPP hoÆc 22b1DSLK.CPP

C¸c bµi tËp lo¹i B:


1. Th«ng tin vÒ mét mÆt hµng trong mét cöa hµng bao gåm: (M· hµng,
Tªn hµng, §¬n gi¸), trong ®ã M· hµng lµ kiÓu chuçi cã ®é dµi 10, Tªn
hµng lµ kiÓu chuçi cã ®é dµi 20, cßn §¬n gi¸ cã kiÓu sè thùc.
H·y dïng cÊu tróc d÷ liÖu d¹ng con trá cña danh s¸ch liªn kÕt ®¬n cµi
®Æt b»ng ng«n ng÷ C ®Ó chøa danh s¸ch c¸c mÆt hµng nãi trªn víi
c¸c thao t¸c nh trong ch¬ng tr×nh mÉu 22a-DSLK.CPP. Khãa ®Ó t×m
kiÕm vµ s¾p xÕp lµ m· hµng. Ngoµi ra sinh viªn cã thÓ bæ sung thªm
mét sè chøc n¨ng nh s¾p xÕp theo ®¬n gi¸, in danh s¸ch theo mét sè
®iÒu kiÖn nµo ®ã...nghÜa lµ c¸c chøc n¨ng mµ thùc tÕ yªu cÇu.
2. 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
cuèn s¸ch trong th viÖn víi c¸c th«ng tin (M· s¸ch, Tªn s¸ch, Sè lîng).

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).

C¸c bµi tËp lo¹i C:


82
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
PhÇn c¬ së d÷ liÖu t¬ng tù nh lo¹i B, nhng ph¬ng ph¸p cµi ®Æt lµ
dïng c©y nhÞ ph©n t×m kiÕm (xem ch¬ng tr×nh mÉu 31-
CAYTK.CPP).

83

You might also like