http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp
CHƯƠNG I:
THU(T TOÁN
1.1. KHÁI NI-M THU(T TOÁN.
1.1.1. M/ ñ1u:
nhiu lp bài toán tng quát xut hin trong toán hc ri rc. Chng hn, cho
m t dãy các s% nguyên, tìm s% ln nht; cho m t t)p h*p, lit các t)p con c,a nó; cho
t)p h*p các s% nguyên, x.p chúng theo th1 t2 tăng d4n; cho m t mng, tìm ñưng ñi
ng7n nht gi8a hai ñ9nh c,a nó. Khi ñư*c giao cho m t bài toán như v)y thì vic ñ4u
tiên ph<i m y d2ng m t hình d?ch i toán ñó thành ng8 c<nh toán hc. Các
cu trúc ri rc ñư*c dùng trong các mô hình này là t)p h*p, y, hàm, hoán v?, quan h,
cùng vi các cu trúc khác như ñA th?, y, mng B nh8ng khái nim sC ñư*c nghiên c1u
D các chương sau.
L)p ñư*c m t hình toán hc thích h*p ch9 m t ph4n c,a qtrình gi<i. ðI
hoàn tt quá trình gi<i, còn c4n ph<i có m t phương pháp dùng hình ñI gi<i bài toán
tng quát. Nói m t ch tưDng, cái ñư*c ñòi hMi m t th, tNc, ñó dãy các bưc
dOn ti ñáp s% mong mu%n. M t y các bưc như v)y, ñư*c gi là m t thu)t toán.
Khi thi.t k. cài ñQt m t ph4n mm tin hc cho m t vn ñ nào ñó, ta c4n ph<i
ñưa ra phương pháp gi<i quy.t th2c cht ñó thu)t toán gi<i quy.t vn ñ y.
ràng rTng, n.u không tìm ñư*c m t phương pháp gi<i quy.t thì không thI l)p trình
ñư*c. Chính th., thu)t toán khái nim nn t<ng c,a h4u h.t các lĩnh v2c c,a tin
hc.
1.1.2. ð3nh nghĩa:
Thu)t toán m t b<ng lit các ch9 dOn (hay quy t7c) c4n th2c
hin theo tYng bưc xác ñ?nh nhTm gi<i m t bài toán ñã cho.
Thu)t ng8 “Algorithm” (thu)t toán) xut phát tY tên nhà toán hc ] R)p AlB
Khowarizmi. Ban ñ4u, tY algorism ñư*c dùng ñI ch9 các quy t7c th2c hin các phép tính
s% hc trên các s% th)p phân. Sau ñó, algorism chuyIn thành algorithm vào th. kc 19.
Vi s2 quan tâm ngày càng tăng ñ%i vi các máy tính, khái nim thu)t toán ñã ñư*c cho
m t ý nghĩa chung hơn, bao hàm c< các th, tNc xác ñ?nh ñI gi<i các bài toán, ch1 không
ph<i ch9 là th, tNc ñI th2c hin các phép tính s% hc.
nhiu cách trình y thu)t toán: dùng ngôn ng8 t2 nhiên, ngôn ng8 lưu ñA (sơ
ñA kh%i), ngôn ng8 l)p trình. Tuy nhiên, m t khi dùng ngôn ng8 l)p trình thì ch9 nh8ng
lnh ñư*c phép trong ngôn ng8 ñó mi có thI dùng ñư*c và ñiu này thưng làm cho s2
t< các thu)t toán trD nên r%i r7m khó hiIu. Hơn n8a, nhiu ngôn ng8 l)p trình
ñu ñư*c dùng r ng rãi, nên chn m t ngôn ng8 ñQc bit nào ñó ñiu ngưi ta không
mu%n. v)y D ñây các thu)t toán ngoài vic ñư*c trình y bTng ngôn ng8 t2 nhiên
cùng vi nh8ng hiu toán hc quen thu c còn dùng m t dng gi< ñI t< thu)t
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp
toán. Gi< to ra bưc trung gian gi8a s2 t< m t thu)t toán bTng ngôn ng8 thông
thưng s2 th2c hin thu)t toán ñó trong ngôn ng8 l)p trình. Các bưc c,a thu)t toán
ñư*c ch9 rõ bTng cách dùng các lnh gi%ng như trong các ngôn ng8 l)p trình.
Thí d8 1: t< thu)t toán tìm ph4n tj ln nht trong m t dãy h8u hn các s% nguyên.
a) Dùng ngôn ng t nhiên ñ mô t các bưc cn phi thc hin:
1. ðQt giá tr? c2c ñi tm thi bTng s% nguyên ñ4u tiên trong y. (C2c ñi tm
thi sC là s% nguyên ln nht ñã ñư*c kiIm tra D m t giai ñon nào ñó c,a th, tNc.)
2. So sánh s% nguyên ti.p sau vi giá tr? c2c ñi tm thi, n.u ln hơn gtr?
c2c ñi tm thi thì ñQt c2c ñi tm thi bTng s% nguyên ñó.
3. LQp li bưc trưc n.u còn các s% nguyên trong dãy.
4. DYng khi không n s% nguyên nào n8a trong y. C2c ñi tm thi D ñiIm
này chính là s% nguyên ln nht c,a dãy.
b) Dùng ñon gi mã:
procedure max (a
1
, a
2
, ..., a
n
: integers)
max:= a
1
for i:= 2 to n
if max <a
i
then max:= a
i
{max là ph4n tj ln nht}
Thu)t toán y trưc h.t gán s% hng ñ4u tiên a
1
c,a dãy cho bi.n max. Vòng lQp
“for” ñư*c dùng ñI kiIm tra l4n lư*t các s% hng c,a dãy. N.u m t s% hng ln hơn giá
tr? hin thi c,a max thì nó ñư*c gán làm giá tr? mi c,a max.
1.1.3. Các ñ<c trưng c>a thut toán:
BB ð1u vào (Input): M t thu)t toán có các giá tr? ñ4u vào tY m t t)p ñã ñư*c ch9 rõ.
?? ð1u ra (Output): TY mvi t)p các giá tr? ñ4u vào, thu)t toán sC to ra các giá tr? ñ4u ra.
Các giá tr? ñ4u ra chính là nghim c,a bài toán.
BB Tính d@ng: Sau m t s% h8u hn bưc thu)t toán ph<i dYng.
BB Tính xác ñ3nh: w mvi bưc, các bưc thao tác ph<i h.t s1c rõ ràng, không gây nên s2
nh)p nhTng. Nói rõ hơn, trong cùng m t ñiu kin hai b xj lý cùng th2c hin m t bưc
c,a thu)t toán ph<i cho nh8ng k.t qu< như nhau.
BB Tính hiu qu: Trưc h.t thu)t toán c4n ñúng ñ7n, nghĩa sau khi ñưa d8 liu vào
thu)t toán hot ñ ng và ñưa ra k.t qu< như ý mu%n.
BB Tính phC d8ng: Thu)t toán có thI gi<i bt kỳ m t bài toán nào trong lp các bài toán.
CN thI thu)t toán có thI các ñ4u vào các b d8 liu khác nhau trong m t min
xác ñ?nh.
1.2. THU(T TOÁN TÌM KIEM.
1.2.1. Bài toán tìm kiGm:
Bài toán xác ñ?nh v? trí c,a m t ph4n tj trong m t b<ng lit
s7p th1 t2 thưng gQp trong nhiu trưng h*p khác nhau. Chng hn chương trình
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp
kiIm tra chính t< c,a các tY, tìm ki.m các tY này trong m t cu%n tY ñiIn, tY ñiIn
chng qua cũng m t b<ng lit s7p th1 t2 c,a các tY. Các bài toán thu c loi y
ñư*c gi là các bài toán tìm ki.m.
Bài toán tìm ki.m tng quát ñư*c t< như sau: xác ñ?nh v? trí c,a ph4n tj x
trong m t b<ng lit kê các ph4n tj phân bit a
1,
a
2
, ..., a
n
hoQc xác ñ?nh rTng không
mQt trong b<ng lit ñó. Li gi<i c,a bài toán trên v? trí c,a s% hng c,a b<ng lit
giá tr? bTng x (t1c i sC nghim n.u x=a
i
0 n.u x không mQt trong b<ng
lit kê).
1.2.2. Thut toán tìm kiGm tuyGn tính:
Tìm ki.m tuy.n tính hay tìm ki.m tu4n t2 là
b7t ñ4u bTng vic so sánh x vi a
1
; khi x=a
1
, nghim v? trí a
1
, t1c 1; khi xa
1
, so
sánh x vi a
2
. N.u x=a
2
, nghim là v? trí c,a a
2
, t1c là 2. Khi xa
2
, so sánh x vi a
3
. Ti.p
tNc quá trình y bTng cách tu4n t2 so sánh x vi mvi s% hng c,a b<ng lit cho ti
khi tìm ñư*c s% hng bTng x, khi ñó nghim là v? trí c,a s% hng ñó. N.u toàn b<ng lit
ñã ñư*c kiIm tra không xác ñ?nh ñư*c v? trí c,a x, thì nghim 0. Gi< ñ%i
vi thu)t toán tìm ki.m tuy.n tính ñư*c cho dưi ñây:
procedure tìm ki.m tuy.n tính (x: integer, a
1
,a
2
,...,an: integers phân bit)
i := 1
while (i n and x a
i
)
i := i + 1
if i n then location := i
else location := 0
{location là ch9 s% dưi c,a s% hng bTng x hoQc là 0 n.u không tìm ñư*c x}
1.2.3. Thut toán tìm kiGm nh3 phân:
Thu)t toán y thI ñư*c dùng khi b<ng
lit có các s% hng ñư*c s7p theo th1 t2 tăng d4n. Chng hn, n.u các s% hng các
s% thì chúng ñư*c s7p tY s% nhM nht ñ.n s% ln nht hoQc n.u chúng các tY hay xâu
ký t2 thì chúng ñư*c s7p theo th1 t2 tY ñiIn. Thu)t toán th1 hai này gi là thu)t toán tìm
ki.m nh? phân. Nó ñư*c ti.n hành bTng cách so sánh ph4n tj c4n xác ñ?nh v? trí vi s%
hng D gi8a b<ng lit kê. Sau ñó b<ng y ñư*c tách m hai b<ng con nhM hơn
kích thưc nnhau, hoQc m t trong hai b<ng con ít hơn b<ng con kia m t s% hng. S2
tìm ki.m ti.p tNc bTng cách hn ch. tìm ki.m D m t b<ng kê con thích h*p d2a trên vic
so sánh ph4n tj c4n xác ñ?nh v? trí vi s% hng gi8a b<ng kê. Ta sC thy rTng thu)t toán
tìm ki.m nh? phân hiu qu< hơn nhiu so vi thu)t toán tìm ki.m tuy.n tính.
Thí d8 2. ðI tìm s% 19 trong b<ng lit 1,2,3,5,6,7,8,10,12,13,15,16,18,19,20,22 ta
tách b<ng lit gAm 16 s% hng y thành hai b<ng lit nhM hơn, mvi b<ng 8 s%
hng, cN thI là: 1,2,3,5,6,7,8,10 12,13,15,16,18,19,20,22. Sau ñó ta so sánh 19 vi s%
hng cu%i cùng c,a b<ng con th1 nht. 10<19, vic tìm ki.m 19 ch9 gii hn trong
b<ng lit con th1 2 tY s% hng th1 9 ñ.n 16 trong b<ng lit ban ñ4u. Ti.p theo, ta
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp
li tách b<ng lit kê con gAm 8 s% hng ym hai b<ng con, mvi b<ng có 4 s% hng, cN
thI 12,13,15,16 18,19,20,22. 16<19, vic tìm ki.m li ñư*c gii hn ch9 trong
b<ng con th1 2, tY s% hng th1 13 ñ.n 16 c,a b<ng lit ban ñ4u. B<ng lit th1 2
này li ñư*c tách làm hai, cN thI là: 18,19 20,22. 19 không ln hơn s% hng ln
nht c,a b<ng con th1 nht nên vic tìm ki.m gii hn ch9 D b<ng con th1 nht gAm các
s% 18,19, s% hng th1 13 14 c,a b<ng ban ñ4u. Ti.p theo b<ng con ch1a hai s%
hng y li ñư*c tách làm hai, mvi b<ng m t s% hng 18 19. 18<19, s2 tìm
ki.m gii hn ch9 trong b<ng con th1 2, b<ng lit ch9 ch1a s% hng th1 14 c,a b<ng
lit ban ñ4u, s% hng ñó s% 19. Bây gi s2 tìm ki.m ñã thu h€p v ch9 còn m t s%
hng, so sánh ti.p cho thy19 là s% hng th1 14 c,a b<ng lit kê ban ñ4u.
y gi ta có thI ch9 rõ các bưc trong thu)t toán tìm ki.m nh? phân.
ðI tìm s% nguyên x trong b<ng lit a
1
,a
2
,...,a
n
vi a
1
< a
2
< ... < a
n
, ta b7t ñ4u
bTng vic so nh x vi s% hng a
m
D gi8a c,a dãy, vi m=[(n+1)/2]. N.u x > a
m
, vic
tìm ki.m x gii hn D nja th1 hai c,a y, gAm a
m+1
,a
m+2
,...,a
n
. N.u x không ln hơn a
m
,
thì s2 tìm ki.m gii hn trong nja ñ4u c,a dãy gAm a
1
,a
2
,...,a
m
.
y gi s2 tìm ki.m ch9 gii hn trong b<ng lit không hơn [n/2] ph4n tj.
Dùng chính th, tNc này, so sánh x vi s% hng D gi8a c,a b<ng lit kê ñư*c hn ch.. Sau
ñó li hn ch. vic m ki.m D nja th1 nht hoQc nja th1 hai c,a b<ng lit kê. LQp li
quá trình này cho ti khi nh)n ñư*c m t b<ng lit kê ch9 có m t s% hng. Sau ñó, ch9 còn
xác ñ?nh s% hng y có ph<i x hay không. Gi< cho thu)t toán tìm ki.m nh? phân
ñư*c cho dưi ñây:
procedure tìm ki.m nh? phân (x: integer, a
1
,a
2
,...,an: integers tăng d4n)
i := 1 {i là ñiIm mút trái c,a kho<ng tìm ki.m}
j := n {j là ñiIm mút ph<i c,a kho<ng tìm ki.m}
while i < j
begin
m:= [(i+j)/2]
if x>a
m
then i:=m+1
else j := m
end
if x = ai then location := i
else location := 0
{location là ch9 s% dưi c,a s% hng bTng x hoQc 0 n.u không tìm thy x}
1.3. ðL PHNC TOP CPA THU(T TOÁN.
Khái nim v ñR phSc tTp c>a mRt thut toán
Thưc ño hiu qu< c,a m t thu)t toán thi gian máy tính sj dNng ñI gi<i
bài toán theo thu)t toán ñang xét, khi các giá tr? ñ4u vào m t kích thưc xác ñ?nh.
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp
M t thưc ño th1 hai dung *ng b nh ñòi hMi ñI th2c hin thu)t toán khi các giá
tr? ñ4u vào kích thưc xác ñ?nh. Các vn ñ nth. liên quan ñ.n ñ ph1c tp tính
toán c,a m t thu)t toán. S2 phân tích thi gian c4n thi.t ñI gi<i m t bài toán kích
thưc ñQc bit nào ñó liên quan ñ.n ñ ph1c tp thi gian c,a thu)t toán. S2 phân tích
b nh c4n thi.t c,a y tính liên quan ñ.n ñ ph1c tp không gian c,a thu)t toán. Vc
xem xét ñ ph1c tp thi gian không gian c,a m t thu)t toán m t vn ñ rt thi.t
y.u khi các thu)t toán ñư*c th2c hin. Bi.t m t thu)t toán sC ñưa ra ñáp s% trong m t
micro giây, trong m t phút hoQc trong m t t9 m, hiIn nhiên h.t s1c quan trng.
Tương t2 nv)y, dung lư*ng b nh ñòi hMi ph<i kh< dNng ñI gi<i m t bài toán,vì
v)y ñ ph1c tp không gian cũng c4n ph<i tính ñ.n.Vì vic xem xét ñ ph1c tp không
gian g7n lin vi các cu trúc d8 liu ñQc bit ñư*c ng ñI th2c hin thu)t toán nên D
ñây ta sC t)p trung xem xét ñ ph1c tp thi gian.
ð ph1c tp thi gian c,a m t thu)t toán thI ñư*c biIu di†n qua s% các phép
toán ñư*c dùng bDi thu)t toán ñó khic giá tr? ñ4u o có m t kích thưc xác ñ?nh. SD
dĩ ñ ph1c tp thi gian ñư*c t< thông qua s% các phép toán ñòi hMi thay vì thi gian
th2c c,a y tínhbDi các y tính khác nhau th2c hin các phép tính cp trong
nh8ng kho<ng thi gian khác nhau. Hơn n8a, phân tích tt c< c phép toán thành các
phép tính bit sơ cp mà máy tính sj dNng là ñiu rt ph1c tp.
Thí d8 3: Xét thu)t toán tìm s% ln nht trong y n s% a
1
, a
2
, ..., a
n
. thI coi kích
thưc c,a d8 liu nh)p s% lư*ng ph4n tj c,a dãy s%, t1c n. N.u coi mvi l4n so sánh
hai s% c,a thu)t toán ñòi hMi m t ñơn v? thi gian (giây chng hn) thì thi gian th2c
hin thu)t toán trong trưng h*p xu nht là nB1 giây. Viy 64 s%, thi gian th2c hin
thu)t toán nhiu l7m là 63 giây.
Thí d8 4:Thu)t toán v trò chơi “Tháp Hà N i”
Trò chơi “Tháp N i” như sau: ba cc A, B, C 64 cái ñĩa (có lv ñI ñQt
vào cc), c ñĩa có ñưng kính ñôi m t khác nhau. Nguyên t7c ñQt ñĩa vào cc là: mvi
ñĩa ch9 ñư*c chAng lên ñĩa ln hơn nó. Ban ñ4u, c< 64 ñĩa ñư*c ñQt chAng lên nhau D c t
A; hai c t B, C tr%ng. Vn ñ ph<i chuyIn c< 64 ñĩa ñó sang c t B hay C, mvi l4n ch9
ñư*c di chuyIn m t ñĩa.
Xét trò chơi vi n ñĩa ban ñ4u D cc A (cc B C tr%ng). Gi S
n
s% l4n
chuyIn ñĩa ñI chơi xong trò chơi vi n ñĩa.
N.u n=1 thì rõ ràng là S
1
=1.
N.u n>1 thì trưc h.t ta chuyIn nB1 ñĩa bên trên sang cc B (gi8 yên ñĩa th1 n D
dưi cùng c,a cc A). S% l4n chuyIn nB1 ñĩa S
nB1
. Sau ñó ta chuyIn ñĩa th1 n tY cc A
sang cc C. Cu%i cùng, ta chuyIn nB1 ñĩa tY cc B sang cc C (s% l4n chuyIn là S
nB1
).
Như v)y, s% l4n chuyIn n ñĩa tY A sang C là:
S
n
=S
nB1
+1+S
n
=2S
nB1
+1=2(2S
nB2
+1)+1=2
2
S
nB2
+2+1=.....=2
nB1
S
1
+2
nB2
+...+2+1=2
n
1.