Tuy nhiên, ta có th so sánh th i gian th c hi n c a hai thu t toán khác nhau.[r]
(1)M C L CỤ Ụ M C L CỤ Ụ
1 Chương 1: GI I THI U CHUNGỚ Ệ
3 1.1. Thu t toán và c u trúc d li u:ậ ấ ữ ệ
3 1.2. M t s v n đ liên quan:ộ ố ấ ề
3 1.3. Ngơn ng di n đ t thu t tốn:ữ ễ ậ
3 Ngơn ng di n đ t thu t tốn đữ ễ ậ ược quy ướ ục s d ng trong giáo trình này là ngơn ngữ t a C++.ự
3 1.3.1. C u trúc c a m t chấ ủ ộ ương trình chính:
3 1.3.2. Các ký t :ự
5 1.3.3. Các câu l nh:ệ
5 1.3.4. Chương trình con:
6 Chương 2: Thi t k và phân tích thu t TỐNẾ Ế Ậ
8 2.1. Thi t k thu t toán:ế ế ậ
8 2.1.1. Module hoá thu t toán:ậ
8 2.1.2. Phương pháp tinh ch nh t ng bỉ ước:
9 2.2. Phân tích thu t tốn: ậ
9 2.2.1. Tính đúng đ n:ắ
9 2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu :ẫ ữ ả ệ ả
9 2.2.3. Phân tích th i gian th c hi n thu t toán:ờ ự ệ ậ
9 Chương 3: đ quy (RecursiON)Ệ
12 3.1. Đ i cạ ương:
12 3.2. Phương pháp đ thi t k m t thu t toán đ quy:ể ế ế ộ ậ ệ
13 3.3. Thu t toán quay lui:ậ
16 Chương 4: M ng và danh sách tuy n tínhẢ Ế
18 4.1. M ng và c u trúc l u tr c a m ng:ả ấ ữ ủ ả
18 4.2. Danh sách tuy n tính (Linear list):ế
19 4.3. Ngăn x p (Stack):ế
20 4.3.1. Đ nh nghĩa:ị
20 4.3.2. L u tr Stack b ng m ng:ư ữ ằ ả
20 4.3.3. Các ví d :ụ
21 4.3.4. Stack v i vi c cài đ t thu t toán đ quy:ớ ệ ặ ậ ệ
25 4.4. Hàng đ i (Queue):ợ
28 4.4.1. Đ nh nghĩa:ị
28 4.4.2. L u tr Queue b ng m ng:ư ữ ằ ả
28 Chương 5: danh sách móc n i (LINKED LIST)Ố
31 5.1. Danh sách móc n i đ n:ố
31 5.1.1. T ch c danh sách n i đ n:ổ ứ ố
31 5.1.2. M t s phép toán trên danh sách n i đ n:ộ ố ố
31 5.2. Danh sách n i vòng:ố
33 5.2.1. Nguyên t c:ắ
33 5.2.2. Thu t toán b sung và lo i b m t nút c a danh sách n i vòng:ậ ổ ỏ ộ ủ ố
34 5.3. Danh sách n i kép:ố
34 5.3.1. T ch c:ổ ứ
34 5.3.2. M t s phép toán trên danh sách n i kép:ộ ố ố
35 5.4. Ví d v vi c s d ng danh sách móc n i:ụ ề ệ ụ ố
(2)5.5. Stack và Queue móc n i:ố
37 Chương 6: CÂY (TREE)
40 6.1. Đ nh nghĩa và các khái ni m:ị ệ
40 6.1.1. Đ nh nghĩa:ị
40 6.1.2. Các khái ni m liên quan:ệ
40 6.2. Cây nh phân:ị
41 6.2.1. Đ nh nghĩa và tính ch t:ị ấ
41 6.2.2. Bi u di n cây nh phân:ể ễ ị
42 6.2.3. Phép duy t cây nh phân:ệ ị
43 6.2.4. Cây nh phân n i vòng:ị ố
49 6.3. Cây t ng quát:ổ
51 6.3.1. Bi u di n cây t ng quát:ể ễ ổ
51 6.3.2. Phép duy t cây t ng quát:ệ ổ
53 6.4. ng d ng (Bi u di n cây bi u th c s h c):Ứ ụ ể ễ ể ứ ố ọ
53 Chương 7: Đ th (GRAPH)Ồ Ị
58 7.1. Đ nh nghĩa và các khái ni m v đ th :ị ệ ề ị
58 7.2. Bi u di n đ th :ể ễ ị
59 7.2.1. Bi u di n b ng ma tr n lân c n (ma tr n k ):ễ ễ ằ ậ ậ ậ ề
59 7.2.2. Bi u di n b ng danh sách lân c n (danh sách k )ể ễ ằ ậ ề
59 7.3. Phép duy t m t đ th :ệ ộ ị
61 7.3.1. Tìm ki m theo chi u sâu:ế ề
61 7.3.2.Tìm ki m theo chi u r ng:ế ề ộ
62 7.4. Cây khung và cây khung v i giá c c ti u:ớ ự ể
63 Chương 8: S P X PẮ Ế
65 8.1. Đ t v n đ :ặ ấ ề
65 8.2. M t s phộ ố ương pháp s p x p đ n gi n:ắ ế ả
65 8.2.1. S p x p ki u l a ch n:ắ ế ể ự ọ
65 8.2.2. S p x p ki u chèn:ắ ế ể
65 8.2.3. S p x p ki u n i b t:ắ ế ể ổ ọ
66 8.3. S p x p ki u phân đo n (S p x p nhanh quick sort):ắ ế ể ắ ế
66 8.4. S p x p ki u vun đ ng (Heap sort):ắ ế ể ố
67 8.5. S p x p ki u tr n (Merge sort):ắ ế ể ộ
69 Chương 9: tìm ki mẾ
71 9.1. Bài tốn tìm ki m:ế
71 9.2. Tìm ki m tu n t :ế ầ ự
71 9.3. Tìm ki m nh phân:ế ị
71 9.4. Cây nh phân tìm ki m:ị ế
71 Tài li u Tham kh oỆ Ả
74
(3)CHƯƠNG 1: GI I THI U CHUNGỚ Ệ 1.1. Thu t toán và c u trúc d li u:ậ ấ ữ ệ
Theo Niklaus Wirth: Thu t toán + C u trúc d li u = Chậ ấ ữ ệ ương trình
Ví dụ: Cho 1 dãy các ph n t , có th bi u di n dầ ể ể ễ ướ ại d ng m ng ho c danhả ặ
sách
C u trúc d li u và thu t tốn có m i quan h m t thi t v i nhau. do đó vi cấ ữ ệ ậ ố ệ ậ ế ệ nghiên c u các c u trúc d li u sau này đi đôi v i vi c xác l p các thu t toán xứ ấ ữ ệ ệ ậ ậ ử lý trên các c u trúc y.ấ ấ
1.2. M t s v n đ liên quan:ộ ố ấ ề
L a ch n m t c u trúc d li u thích h p đ t ch c d li u vào ra và trên cự ọ ộ ấ ữ ệ ợ ể ổ ứ ữ ệ ơ s đó xây d ng đở ự ược thu t tốn x lý h u hi u nh m đ a t i k t qu mongậ ữ ệ ằ ế ả mu n cho bài toán là m t khâu r t quan tr ng.ố ộ ấ ọ
Ta c n phân bi t 2 lo i quy cách d li u: ầ ệ ữ ệ
Quy cách bi u di n hình th c: Cịn để ễ ứ ược g i là c u trúc logic c a d li u.ọ ấ ủ ữ ệ Đ i v i m i ngơn ng l p trình xác đ nh s có m t b c u trúc logic c a dố ỗ ữ ậ ị ẽ ộ ộ ấ ủ ữ li u. D li u thu c lo i c u trúc nào thì c n ph i có mơ t ki u d li uệ ữ ệ ộ ấ ầ ả ả ể ữ ệ tương ng v i c u trúc d li u đó. ứ ấ ữ ệ Ví d : ụ Trong C có các ki u d li u: Struct,ể ữ ệ Union, File,
Quy cách l u tr : là cách bi u di n m t c u trúc d li u trong b nh Víư ữ ể ễ ộ ấ ữ ệ ộ d : C u trúc d li u m ng đụ ấ ữ ệ ả ượ ưc l u tr trong b nh theo quy t c l u tr kữ ộ ắ ữ ế ti p.ế Có 2 quy cách l u tr :ư ữ
L u tr trong: ví d RAM.ư ữ ụ
L u tr ngồi: ví d đĩa (disk).ư ữ ụ
1.3. Ngơn ng di n đ t thu t tốn:ữ ễ ạ ậ
Ngơn ng di n đ t thu t tốn đữ ễ ậ ược quy ướ ục s d ng trong giáo trình này là ngơn ng t a C++.ữ ự
Đ c đi mặ ể : G n gi ng v i Turbo C++, do đó d dàng trong vi c chuy nầ ố ễ ệ ể m t chộ ương trình vi t b ng ngơn ng t a C++ sang ngơn ng C++.ế ằ ữ ự ữ
1.3.1. C u trúc c a m t chấ ủ ộ ương trình chính: void main()
{
S1; S2; Sn; }
L u ýư :
(4)Đ đ n gi n, chể ả ương trình có th khơng c n vi t khai báo. Tuy nhiên có thể ầ ế ể mơ t trả ước chương trình b ng ngơn ng t nhiên.ằ ữ ự
Ph n thuy t minh đầ ế ược đ t gi a 2 d u /* , */ ho c // đ ghi chú trên 1 dòng.ặ ữ ấ ặ ể
(5)Ví dụ:
void main() /* Chuong trinh chuyen so he 10 he 2*/ {
cout << "n = ";
cin >> n; /* Nhap n la so he cs 10*/ T=0;
while (n!=0) {
r = n % 2; Push(T, r); n = n / 2; }
cout << "Ket qua chuyen doi sang he co so la: "; while (T!=0)
{
Pop(T, r); cout << r; }
}
1.3.2. Các ký t :ự
Các ký t s d ng trong chự ụ ương trình là tương t nh trong C++.ự
L u ý: Trong C++ là có s phân bi t gi a ch hoa và ch thư ự ệ ữ ữ ữ ường
1.3.3. Các câu l nh:ệ
L nh gánệ : V = E;
Trong đó: V là bi n (variable), và E là bi u th c (expression).ế ể ứ
L u ýư : Có th dùng phép gán chung. ể Ví dụ: a=b=1;
L nh ghépệ : {S1; S2; ; Sn;} coi nh là m t câu l nh (trong đó Sư ộ ệ i là các câu
l nh).ệ
L nh ifệ : Tương t nh l nh if c a ngôn ng C.ự ệ ủ ữ
if (<biểu thức điều kiện>) <câu lệnh>;
ho c:ặ if (<biểu thức điều kiện>) <câu lệnh 1>; else <câu lệnh 2>;
L nh switchệ : Theo c u trúc sau:ấ
switch (<biểu thức>) {
case gt1: S1; case gt2: S2;
(6)}
L nh l pệ ặ : for, while, while: Tương t nh các l nh l p c aự ệ ặ ủ
C
L nh nh yệ ả : goto n (n: s hi u/nhãn c a chố ệ ủ ương trình)
L nh vào raệ : cin cout gi ng nh C++.ố
1.3.4. Chương trình con:
<kiểu trả về> <Tên hàm>(<danh sách tham số>) {
S1; S2; S3;
[return (giá trị trả về) ] Báo k t thúc chế ương trình con
}
L u ýư : N u hàm có ki u tr v khác ki u void thì khi k t thúc hàm ph i có câuế ể ả ề ể ế ả l nh ệ return <giá tr c a hàm>ị ủ đ gán k t qu cho hàmể ế ả
Sau đây là ví d v hàm có tr v giá tr ụ ề ả ề ị
Ví dụ: Vi t chế ương trình con d ng hàm NamNhuan(x). Cho k t qu n u s x làạ ế ả ế ố năm nhu n có giá tr là True(1), ngậ ị ược l i có giá tr là False(0); ch ng h nạ ị ẳ : NamNhuan(1996) cho giá tr 1, NamNhuan(1997) cho giá tr 0. Bi t r ng x đị ị ế ằ ược g i là năm nhu n n u x chia h t cho 4 và x không chia h t cho 100 ho c x chiaọ ậ ế ế ế ặ h t cho 400.ế
Cách 1: int namnhuan(x)
{ if ((x % == && x % 100 != 0)||(x % 400 == 0)) return 1;
else
return 0; }
Cách 2: int namnhuan(x)
{ return(((x % == 0) && (x % 100 != 0)) || (x % 400 = 0));
}
Ví d vi t v chụ ế ề ương trình con khơng có giá tr tr v (hay cịn g i là th t c).ị ả ề ọ ủ ụ
Ví dụ: Vi t hàm Hoandoi(a, b) đ hốn đ i giá tr c a 2 bi n s a và b cho nhau.ế ể ổ ị ủ ế ố
Cách 1: void hoandoi(&a, &b) //a b tham biến
{ tam=a; a=b; b=tam; }
Cách 2: void hoandoi(&a, &b)
{ a= a+b; b= a-b;
(7)a= a-b; }
(8)CHƯƠNG 2: THI T K VÀ PHÂN TÍCH THU TẾ Ế Ậ TỐN 2.1. Thi t k thu t tốn:ế ế ậ
2.1.1. Module hố thu t tốn:ậ
Các bài tốn ngày càng đa d ng và ph c t p, do đó thu t tốn mà ta đ xu tạ ứ ậ ề ấ càng có quy mơ l n và vi c vi t chớ ệ ế ương trình c n có m t lầ ộ ượng l p trình đơngậ đ o. Mu n làm đả ố ược vi c này , ngệ ười ta phân chia các bài toán l n thành các bàiớ toán nh (module). Và dĩ nhiên m t module có th chia nh thành các module conỏ ộ ể ỏ khác n a, b y gi vi c t ch c l i gi i s đữ ấ ệ ổ ứ ả ẽ ược th hi n theo m t c u trúcể ệ ộ ấ phân c p.ấ
Ví dụ:
Q trình module hố bài tốn được xem là ngun lý “chia đ tr ” (divide &ể ị conquer) hay cịn g i là thi t k t đ nh xu ng (topdown) ho c là thi t k tọ ế ế ỉ ố ặ ế ế ừ khái quát đ n chi ti t (specialization).ế ế
Vi c module hố trong l p trình th hi n :ệ ậ ể ệ
Các chương trình con
C m các chụ ương trình con xung quanh m t c u trúc d li u nào đó. Ch ngộ ấ ữ ệ ẳ h n, th vi n trong C.ạ ệ
Ví dụ: Chương trình qu n lý đ u sách c a m t th vi n nh m ph c v đ c giả ầ ủ ộ ệ ằ ụ ụ ộ ả tra c u sách. C th , gi s ta đã có m t file d li u g m các b ng ghi v cácứ ụ ể ả ộ ữ ệ ả ề thông tin liên quan đ n m t đ u sách nh : tên sách, mã s , tác gi , nhà xu t b n,ế ộ ầ ố ả ấ ả năm xu t b n, giá ti n, ấ ả ề
Yêu c u:ầ
C p nh t d li u đậ ậ ữ ệ ược Tìm ki m.ế
In n.ấ
8
A
B C
E F G H I
D
H chệ ương trình qu n lý sáchả
C p nh t d li uậ ậ ữ ệ Tìm ki mế In nấ
B sung thêm sáchổ S a thơng tin ử
file d li uữ ệ Xố d ữ
li uệ Xem v i m i b n ọ ảớ ghi
Tra c uứ
Th ẻ sách
Th ng kêố
Theo mã
(9)Nh n xétậ :
Vi c module hoá làm cho bài toán đệ ược đ nh hị ướng rõ ràng
B ng cách này, ngằ ười ta có th phân chia cơng vi c cho đ i ngũ l p trình.ể ệ ộ ậ
Đây là m t công vi c m t nhi u th i gian.ộ ệ ấ ề
2.1.2. Phương pháp tinh ch nh t ng bỉ ừ ước:
Phương pháp tinh ch nh t ng bỉ ước là phương pháp thi t k thu t toán g nế ế ậ ắ li n v i l p trình. Nó ph n ánh tinh th n c a q trình module hố và thi t kề ậ ả ầ ủ ế ế thu t toán theo ki u topdown.ậ ể
Xu t phát t ngơn ng t nhiên c a thu t tốn, thu t tốn s đấ ữ ự ủ ậ ậ ẽ ược chi ti t hoáế d n d n và cu i cùng công vi c x lý s đầ ầ ố ệ ẽ ược thay th d n b i các câu l nhế ầ ệ (c a m t ngơn ng l p trình nào đó). Q trình này là đ tr l i d n d n các câuủ ộ ữ ậ ể ả ầ ầ h i: What? (làm gì?), How (làm nh th nào?)ỏ ế
2.2. Phân tích thu t tốn: ậ
Ch t lấ ượng c a m t chủ ộ ương trình hay thu t tốn bao g m:ậ
Tính đúng đ n.ắ
Tính đ n gi n (d hi u, d qu n lý, d l p).ơ ả ễ ể ễ ả ễ ậ
Tính t i u (hi u qu ) v m t th i gian cũng nh không gian nh ố ệ ả ề ặ
2.2.1. Tính đúng đ n:ắ
Đây là m t yêu c u phân tích quan tr ng nh t cho m t thu t tốn. Thơngộ ầ ọ ấ ộ ậ thường, người ta th nghi m (test) nh m t s b d li u nào đó đ cho ch yử ệ ộ ố ộ ữ ệ ể chương trình r i so sánh k t qu th nghi m v i k t qu mà ta đã bi t. Tuyồ ế ả ệ ế ả ế nhiên, theo Dijkstra: “Vi c th nghi m chệ ệ ương trình ch ch ng minh s có m tỉ ứ ự ặ c a l i ch không ch ng minh s v ng m t c a l i”.ủ ỗ ứ ứ ự ắ ặ ủ ỗ
Ngày nay, v i các cơng c tốn h c ngớ ụ ọ ười ta có th ch ng minh tính đúng đ nể ứ ắ c a m t thu t tốn.ủ ộ ậ
2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu :ẫ ữ ơ ả ệ ả
M t thu t toán đ n gi n (d hi u) ch a h n t i u v th i gian và b nh ộ ậ ả ễ ể ẳ ố ề ộ Đ i v i nh ng chố ữ ương trình ch dùng m t vài l n thì tính đ n gi n có th coiỉ ộ ầ ả ể tr ng nh ng n u chọ ế ương trình được s d ng nhi u l n (ví d , các ph n m m)ử ụ ề ầ ụ ầ ề thì th i gian th c hi n rõ ràng ph i đờ ự ệ ả ược chú ý
u c u v th i gian và khơng gian ít khi có m t gi i pháp tr n v n.ầ ề ộ ả ọ ẹ
2.2.3. Phân tích th i gian th c hi n thu t toán:ờ ự ệ ậ
Th i gian th c hi n thu t toán ph thu c vào nhi u y u t :ờ ự ệ ậ ụ ộ ề ế ố
Kích thước d li u đ a vào (dung lữ ệ ượng). N u g i n là kích thế ọ ước d li uữ ệ vào thì th i gian th c hi n m t thu t tốn, ký hi u là T(n).ờ ự ệ ộ ậ ệ
T c đ x lý c a máy tính, b nh (RAM).ố ộ ủ ộ
(10)Tuy nhiên, ta có th so sánh th i gian th c hi n c a hai thu t tốn khác nhau.ể ự ệ ủ ậ
Ví dụ:N u th i gian th c hi n c a thu t toán th nh t Tế ự ệ ủ ậ ứ ấ 1(n) = Cn2 (C: h ngằ
dương) và th i gian th c hi n thu t tốn th hai Tờ ự ệ ậ ứ 2(n) = Kn (K: h ng) thì khi nằ
khá l n, th i gian th c hi n thu t toán 2 s t i u h n so v i thu t toán 1.ớ ự ệ ậ ẽ ố ậ
Cách đánh giá th i gian th c hi n thu t toán theo ki u trên đờ ự ệ ậ ể ược g i là đánhọ giá th i gian th c hi n thu t tốn theo “đ ph c t p tính tốn c a thu t tốn”.ờ ự ệ ậ ộ ứ ủ ậ
2.2.3.1. Đ ph c t p tính tốn c a thu t toán:ộ ứ ạ ủ ậ
N u th i gian th c hi n m t thu t toán là T(n) = Cnế ự ệ ộ ậ (C: h ng), thì ta nóiằ
r ng: Đ ph c t p tính tốn c a thu t tốn này có c p là nằ ộ ứ ủ ậ ấ 2 và ta ký hi u T(n) =ệ
O(n2).
T ng qt:ổ T(n) = O(g(n)) thì ta nói đ ph c t p c a thu t tốn có c p là g(n).ộ ứ ủ ậ ấ
2.2.3.2. Xác đ nh đ ph c t p c a thu t toán:ị ộ ứ ạ ủ ậ
Vi c xác đ nh đ ph c t p tính tốn c a m t thu t tốn nói chung là ph c t p.ệ ị ộ ứ ủ ộ ậ ứ Tuy nhiên, trong th c t đ ph c t p c a m t thu t tốn có th đự ế ộ ứ ủ ộ ậ ể ược xác đ nh tị ừ đ ph c t p t ng ph n c a thu t tốn. C th , ta có m t s quy t c sau:ộ ầ ủ ậ ụ ể ộ ố ắ
Quy t c tính t ngắ ổ :
N u chế ương trình P được phân tích thành 2 ph n: Pầ 1, P2 và n u đ ph c t pế ộ ứ
c a Pủ 1 là T1(n) = O(g1(n)) và đ ph c t p c a Pộ ứ ủ 2 là T2(n) = O(g2(n)) thì đ ph cộ ứ
t p c a P là: T(n) = O(max(gạ ủ 1(n), g2(n)))
Ví dụ: g1(n) = n2, g2(n) = n3. Suy ra: T(n) = O(n3)
L u ýư : g1(n) g2(n) ( n n0) O(g1(n) + g2(n)) = O(g2(n))
Ví dụ: O(n + log2n) = O(n)
Quy t c nhân:ắ
N u đ ph c t p c a Pế ộ ứ ủ 1 là O(g1(n)), đ ph c t p c a Pộ ứ ủ 2 là O(g2(n)) thì độ
ph c t p c a Pứ ủ 1 l ng Pồ 2 (P1 câu l nh l p) đ ph c t p tính tốn làệ ặ ộ ứ
O(g1(n).g2(n))
L u ý:ư
Câu l nh gán, cin, cout, if, switch có th i gian th c hi n b ng h ng s C =ệ ự ệ ằ ằ ố O(1)
Câu l nh l p trong vịng g(n) l n thì s có th i gian th c hi n là O(g(n)).ệ ặ ầ ẽ ự ệ
O(Cg(n)) = O(g(n)) (C: h ng)ằ
Ví dụ:
1) Câu l nh:ệ for (i=1;i<=n;i++) // O(n)
P=P*i; // O(1)
có th i gian th c hi n là: O(n*1) = O(n).ờ ự ệ
2) for (i=1;i<=n;i++)
(11)for (j=1;j<=n;j++) x=x+1;
có th i gian th c hi n là: O(n*n*1) = O(nờ ự ệ 2).
Thông thường, đ xác đ nh đ ph c t p tính tốn c a m t thu t tốn, ngể ị ộ ứ ủ ộ ậ ười ta
đi tìm m t l nh/phép tốn có s l n th c hi n là nhi u nh t (l nh/phép toánộ ệ ố ầ ự ệ ề ấ ệ tích c c) t đó tính s l n này ự ố ầ đ ph c t p c a tính tốn.ộ ứ ủ
Có khi th i gian th c hi n m t thu t tốn cịn ph thu c vào đ c đi m c a dờ ự ệ ộ ậ ụ ộ ặ ể ủ ữ
li u. B y gi T(n) trong trệ ấ ường h p thu n l i nh t có th khác T(n) trongợ ậ ợ ấ ể trường h p x u nh t. Tuy nhiên, thông thợ ấ ấ ường người ta v n đánh giá đ ph cẫ ộ ứ t p tính tốn c a thu t tốn thơng qua T(n) trong trạ ủ ậ ường h p x u nh t.ợ ấ ấ
Ví dụ: Cho m t dãy g m có n ph n t m ng: V[0], V[1], , V[n1]. X là m tộ ầ ả ộ
giá tr cho trị ước
void timkiem(x) {
found=0;// gán giá trị cho found lúc ban đầu False i=0;
while ((i< n) && (!found)) if (v[i]==x)
{
cout << i; found=1; }
else i=i+1; if (found==0)
cout << “khơng có”; }
T(n) thu n l i = O(1)ậ ợ (X = V[0])
(12)CHƯƠNG 3: Đ QUY (RECURSION)Ệ 3.1. Đ i cạ ương:
Chương trình đ quy là chệ ương trình g i đ n chính nó.ọ ế
Ví dụ: M t hàm đ quy là m t hàm độ ệ ộ ược đ nh nghĩa d a vào chính nó.ị ự
Trong lý thuy t tin h c, ngế ọ ười ta thường dùng th thu t đ quy đ đ nh nghĩaủ ậ ệ ể ị các đ i tố ượng
Ví dụ: Tên bi n đế ược đ nh nghĩa nh sau:ị
M i ch cái là m t tên.ỗ ữ ộ
N u t là tên bi n thì t <ch cái>, t <ch s > cũng là tên bi n.ế ế ữ ữ ố ế
M t chộ ương trình đ quy ho c m t đ nh nghĩa đ quy thì khơng th g i đ nệ ặ ộ ị ệ ể ọ ế chính nó mãi mãi mà ph i có m t đi m d ng đ n m t trả ộ ể ế ộ ường h p đ c bi t nàoợ ặ ệ đó, mà ta g i là trọ ường h p suy bi n (degenerate case).ợ ế
Ví dụ: Cho s t nhiên n, ta đ nh nghĩa n! nh sau:ố ự ị n! =
1 0!
1)! (n * n
L i gi i đ quy: N u l i gi i c a m t bài tốn T nào đó đờ ả ệ ế ả ủ ộ ược th c hi n b ngự ệ ằ m t l i gi i c a bài tốn T' có d ng gi ng nh T, nh ng theo m t nghĩa nào đó T'ộ ả ủ ố ư ộ là "nh h n" T và T' có khuynh hỏ ướng ngày càng ti p c n v i trế ậ ường h p suyợ bi n.ế
Ví dụ: Cho dãy các ph n t m ng V[1], V[2], , V[n] đã đầ ả ượ ắc s p x p theoế
th t tăng d n, g i X là m t giá tr b t k Vi t thu t tốn tìm ki m đ in v tríứ ự ầ ọ ộ ị ấ ỳ ế ậ ế ể ị c a ph n t nào đó trong m ng có giá tr b ng X (n u có). Ngủ ầ ả ị ằ ế ượ ạc l i, thơng báo khơng có
void timkiem(d, c, x) {
if (d>c)
cout << “khong co”; else
{
g=(d+c)/ 2; if (x==V[g]) cout << g;
else if (x<V[g]) timkiem(d, g-1, x); else timkiem(g+1, c, x);
} }
Nh n xétậ :
Bài tốn tìm ki m ban đ u đế ầ ược tách thành các bài tốn tìm ki m v iế ph m vi nh h n cho đ n khi g p ph i các trạ ỏ ế ặ ả ường h p suy bi n. Chínhợ ế
(13)vi c phân tích đó, ngệ ười ta đã xem thu t tốn đ quy là thu t tốn th hi nậ ệ ậ ể ệ phương pháp "chia đ tr ".ể ị
N u th t c ho c hàm ch a l i g i đ n chính nó (ví d trên) thì đế ủ ụ ặ ứ ọ ế ụ ược g iọ là đ quy tr c ti p. Ngệ ự ế ượ ạc l i, có th t c ch a l i g i đ n th t c khácủ ụ ứ ọ ế ủ ụ mà th t c này ch a l i l i g i đ n nó thì đở ủ ụ ứ ọ ế ược g i là đ quy gián ti p,ọ ệ ế hay còn g i là đ quy tọ ệ ương h hay còn g i là Forward.ỗ ọ
Ví d :ụ
void Ba(int n) {
cout << n;
if (n>0) Ong(n-1); }
void Ong(int n); {
cout << n;
if (n>0) Ba(n-1); }
void main() {
Ong(3); }
K t qu :ế ả Ong
2 Ba Ong Ba
3.2. Phương pháp đ thi t k m t thu t toán đ quy:ể ế ế ộ ậ ệ
Tham s hoá bài toán.ố
Phân tích trường h p chung (đ a bài tốn dợ ướ ại d ng bài tốn cùng lo i nh ngạ có ph m vi gi i quy t nh h n theo nghiã d n d n s ti n đ n trạ ả ế ỏ ầ ầ ẽ ế ế ường h p suyợ bi n).ế
Tìm trường h p suy bi n.ợ ế
Ví dụ:
1) L p hàm GT(n) = n!ậ
long GT(n)
{ if (n==0) return 1;
else return n*GT(n-1); }
2) Dãy s Fibonaciố : F1 = F2 = 1;
Fn = Fn1 + F n2. (n 3)
long F(n)
(14)else return F(n-1)+F(n-2); }
Nh n xétậ :
Thông thu ng thay vì s d ng l i gi i đ quy cho m t bài tốn, ta có th thayờ ụ ả ệ ộ ể th b ng l i gi i không đ quy (kh đ quy) b ng phế ằ ả ệ ệ ằ ương pháp l p.ặ
Vi c s d ng thu t tốn đ quy có:ệ ụ ậ ệ
u đi m
Ư ể Khuy t đi mế ể
Thu n l i cho vi c bi u di n bài tốn.ậ ợ ệ ể ễ Có khi khơng đượ ố ưc t i u v th i gian.ề
G n (đ i v i chọ ố ương trình) Có th gây t n b nh ể ố ộ x y ra hi nả ệ
tượng tràn b nh ngăn x p (Stack) n uộ ế ế d li u l n.ữ ệ
Chính vì v y, trong l p trình ngậ ậ ười ta c tránh s d ng th t c đ quy n uố ụ ủ ụ ệ ế th y không c n thi t.ấ ầ ế
Bài t p:ậ
1) Vi t hàm lu th a float ế ỹ lt(float x, int n) cho ra giá tr xị n
2) Vi t chế ương trình nh p vào s nguyên r i đ o ngậ ố ả ượ ốc s đó l i (khơng đạ ược dùng phương pháp chuy n s thành xâu).ể ố
3) Vi t chế ương trình cho phép s n sinh và hi n th t t c các s d ng nh phânả ể ị ấ ả ố ị đ dài n (ộ có g m n ch s ).ồ ữ ố
Ví d 1ụ : Vi t th t c in xâu đ o ngế ủ ụ ả ượ ủc c a xâu X
Trước khi xây d ng hàm InNguoc thì ta xây d ng hàm tách chu i con t chu iự ự ỗ ỗ m trẹ ướ ịc t v trí là batdau và l y ấ soluong ký t ự
char *copy(char *chuoi,int batdau,int soluong) { int i; char *tam;
tam=(char *)malloc(100);
for(i=(batdau-1);i<strlen(chuoi)&& i<(batdau-1+soluong);i++) tam[i-(batdau-1)]=chuoi[i];
tam[i]=NULL; return tam; }
Cách 1:
Trường h p chung:ợ + In ký t cu i c a xâu X.ự ố ủ
(15)+ Đ o ngả ược ph n còn l i.ầ
Trường h p suy bi n: N u xâu r ng thì khơng làm gì h t.ợ ế ế ỗ ế
void InNguoc(X){
if (X[0] !=’’) {
cout << X[strlen(X)-1];
InNguoc(copy(X,0,strlen(x)-2); }
}
Cách 2:
Trường h p chung:ợ + Đ o ngả ược xâu X đã b ký t đ u tiên.ỏ ự ầ
+ In ký t đ u tiên c a X.ự ầ ủ
Trường h p suy bi n: N u xâu r ng thì khơng làm gì h t.ợ ế ế ỗ ế
void Innguoc(X){ if (X!=”“)
{
InNguoc(copy(X, 1,strlen(X)-2); cout << X[0];
} }
Ví d 2ụ : Bài tốn tháp Hà n i: Cho ba c c A, B, C; có n đĩa khác nhau độ ọ ược x pế
theo th t nh trên l n dứ ự ỏ ướ ằi n m trên c c A. ọ Yêu c u:ầ Chuy n ch ng đĩa t c cể ọ A sang c c C v i đi u ki n:ọ ề ệ
M i l n ch đỗ ầ ỉ ược chuy n m t đĩa.ể ộ
Khơng có trường h p đĩa l n đợ ược đ t trên đĩa nh ặ ỏ
Có th dùng c c B làm c c trung gian.ể ọ ọ
Tham s hoá bài toán: ố HaNoi(n, A, B, C) //char A, B, C
Trong đó: n: S đĩa.ố
A: C c ngu n c n chuy n đĩa đi.ọ ầ ể
B: C c trung gian.ọ
C: C c đích đ chuy n đĩa đ n.ọ ể ể ế
Chương trình chính nh sau:ư
void main() {
cin >> n;
A= 'A'; B= 'B'; C= 'C'; HaNoi(3, A, B, C);
}
Thu t toán đ quy:ậ ệ
Trường h p suy bi n:ợ ế
(16) Trường h p chung (n ợ 2):
Th v i n=2:ử + Chuy n đĩa th nh t t A sang B.ể ứ ấ
+ Chuy n đĩa th 2 t A sang C.ể
+ Chuy n đĩa th nh t t B sang C.ể ứ ấ
T ng quát:ổ + Chuy n (n 1) đĩa t A sang B (C làm trung gian).ể
+ Chuy n 1 đĩa t A sang C (B: trung gian)ể
+ Chuy n (n 1) đĩa t B sang C (A: trung gian).ể
Suy ra thu t toán đ quy:ậ ệ
void HaNoi(n, A, B, C) {
if (n==1) cout << A << “” << C; else
{
HaNoi(n -1, A, C, B); HaNoi(1, A, B, C);
HaNoi(n -1, B, A, C);
} }
3.3. Thu t toán quay lui:ậ
Ta có th dùng k thu t đ quy đ di n t thu t tốn quay lui. Bài tốn sể ỹ ậ ệ ể ễ ả ậ ử d ng thu t toán quay lui thụ ậ ường có d ng: Xác đ nh m t b g m n thành ph n: xạ ị ộ ộ ầ 1,
x2, , xn tho mãn đi u ki n B nào đó.ả ề ệ
Phương pháp c a thu t toán quay lui:ủ ậ
Gi s ta đã xác đ nh đả ị ược i1 thành ph n: xầ 1, x2, , xi1. Đ xác đ nh thànhể ị
ph n xầ i, ta duy t t t c các kh năng có th có c a nó.ệ ấ ả ả ể ủ
Ví dụ: xi có th có giá tr t 1 đ n 8; g i j là các giá tr có th có c a xể ị ế ọ ị ể ủ i, lúc đó
ta dùng câu l nh For nh sau: ệ For (j=1;j<8;j++)
Bây gi , v i m i kh năng j ta ln ki m tra xem j có đờ ỗ ả ể ược ch p nh n khơng?ấ ậ (li u b (xệ ộ 1, x2, …, xi) hi n t i có thỗ mãn đi u ki n B hay khơng?)ệ ề ệ
Nh v y, x y ra 2 trư ậ ả ường h p:ợ
N u ch p nh n j:ế ấ ậ
Xác đ nh xị i theo j: xi=j;
Sau đó, n u i cịn nh h n n thì ta ti n hành xác đ nh xế ỏ ế ị i+1
Ngượ ạc l i (i = n) thì ta được m t l i gi i.ộ ả
Ki m tra j ti p theo.ể ế
N u t t c các kh năng c a j khơng có kh năng nào đế ấ ả ả ủ ả ược ch p nh n thìấ ậ quay l i bạ ước trước đ xác đ nh l i xể ị i1. (C ch ho t đ ng trong b nhơ ế ộ ộ ớ
c a thu t tốn đ quy giúp có th th c hi n đủ ậ ệ ể ự ệ ược đi u này).ề
Vi c xác đ nh xệ ị i có th mơ t qua th t c đ quy sau:ể ả ủ ụ ệ
(17)void Try(i) //Thử xem xi nhận giá trị for (mỗi khả j xi)
{
if <Chấp nhận> {
<Xác định xi theo j>; // Ví dụ: x[i]=j; if (i==n) <Ghi nhận lời giải>;
else Try(i+1); }
}
Bài t p:ậ
1) Tìm t t c các hốn v c a m t m ng g m có n ph n t ấ ả ị ủ ộ ả ầ
(18)CHƯƠNG 4: M NG VÀ DANH SÁCH TUY N TÍNHẢ Ế 4.1. M ng và c u trúc l u tr c a m ng:ả ấ ư ữ ủ ả
M ng là c u trúc d li u đ n gi n và thông d ng trong nhi u ngôn ng l pả ấ ữ ệ ả ụ ề ữ ậ trình
M ng là m t t p có th t g m m t s c đ nh các ph n t có cùng quy cách.ả ộ ậ ứ ự ộ ố ố ị ầ
Ví dụ: Trong C, đ khai báo m t dãy s nguyên n ph n t : a[0], a[1], , a[n1]ể ộ ố ầ
(v i nớ 100), ta khai báo m ng a nh sau:ả
int a[100] ;
Lúc này, vi c truy xu t s thông qua các ph n t c a m ng, ký hi u:ệ ấ ẽ ầ ủ ả ệ a[0], a[1], a[99]
Ma tr n là m t m ng 2 chi u.ậ ộ ả ề
Ví dụ: float B[100][100];
Khi đó, B[i][j] là m t ph n t c a ma tr n B. Trong đó i là hàng cịn j là c t.ộ ầ ủ ậ ộ
Tương t ta cũng có m ng 3 chi u, m ng 4 chi u.ự ả ề ả ề
C u trúc l u tr :ấ ư ữ
Cách l u tr m ng thông thư ữ ả ường (đ i v i m i ngơn ng l p trình) là l u trố ọ ữ ậ ữ theo ki u k ti p.ể ế ế
Ví dụ: G i a là m ng 1 chi u g m có n ph n t , m i ph n t có đ dài là dọ ả ề ầ ỗ ầ ộ
(chi m d byte) và đế ượ ưc l u tr k ti p nh hình dữ ế ế ưới đây: d d
a0 a1 an1
Loc (a0): đ a ch ph n t aị ỉ ầ
đ a ch c a ph n t th aị ỉ ủ ầ ứ i:
Loc (ai) = Loc (a0) + d*i
L u ý:ư
Đ i v i m ng nhi u chi u, vi c t ch c l u tr cũng đố ả ề ề ệ ổ ứ ữ ược th c hi nự ệ tương t :ự
Ví dụ: int a[3][2];
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] Đ a ch c a ph n t aị ỉ ủ ầ ij:
Loc (a[i][j]) = Loc (a[0][0]) + d*(i*n + j)
(19)Trong đó, n là s c t c a ma tr n.ố ộ ủ ậ
Bài t p:ậ
1) Vi t cơng th c t ng qt đ tính đ a ch c a m t ph n t nào đó c a m tế ứ ổ ể ị ỉ ủ ộ ầ ủ ộ m ng n chi u (Loc a[iả ề 0, …, in1]), v i ch s các chi u này l n lớ ỉ ố ề ầ ượt là: b0 b'0,
b1 b'1, ,
bn1 b'n1; trong đó: i0 [b0 b'0], i1 [b1 b'1], …, in1 [bn1 b'n1]. Đ a ch này phị ỉ ụ
thu c vào đ a ch c a ch s đ u tiên a[bộ ị ỉ ủ ỉ ố ầ 0, b1, , bn1]. Cho d là đ dài c a m tộ ủ ộ
ph n t ầ
L u ýư : do các ph n t c a m ng thầ ủ ả ường đượ ưc l u tr k ti p nhau nên vi cữ ế ế ệ
truy nh p vào chúng nhanh, đ ng đ u v i m i ph n t ( u đi m). Trong lúcậ ề ọ ầ ể đó, nhược đi m c a vi c l u tr m ng là:ể ủ ệ ữ ả
+ Ph i khai báo ch s t i đa, do đó có trả ỉ ố ố ường h p gây lãng phí b nh ợ ộ
+ Khó khăn trong vi c th c hi n phép xoá / chèn m t ph n t trongệ ự ệ ộ ầ m ng.ả
2) Gi s trong b nh có m ng a g m n ph n t aả ộ ả ầ 0, a1, ,an1
Hãy vi t các hàm sau:ế
+ void Xoa(i): Xoá ph n t th i trong m ng này.ầ ứ ả
+ void ChenSau(i, x): Chèn sau ph n t th i m t ph n t có giá tr là x.ầ ứ ộ ầ ị
4.2. Danh sách tuy n tính (Linear list):ế
Đ nh nghĩa:ị
Danh sách tuy n tính là m t dãy có th t aế ộ ứ ự 1, a2, , an (n>=0). N u n=0 đế ược
g i là danh sách r ng. Ngọ ỗ ượ ạc l i: a1 được g i là ph n t đ u tiên, aọ ầ ầ n được g i làọ
ph n t cu i cùng, và n đầ ố ược g i là chi u dài c a danh sách.ọ ề ủ
Đ i v i danh sách tuy n tính, v i m i ph n t aố ế ỗ ầ i (i =1, n1) thì có ph n tầ ử
ti p theo là aế i+1 và v i m i ph n t aớ ỗ ầ i (i = 2 n) thì có ph n t đ ng trầ ứ ước là
ai –1
Danh sách tuy n tính khác c b n v i m ng m t chi u ch là ế ả ả ộ ề ỗ kích thước c a danh sách khơng c đ nhủ ố ị b i vì phép b sung và phép lo i b thở ổ ỏ ường xun tác đ ng lên m t danh sách. Ví d : Stack.ộ ộ ụ
Có nhi u cách đ l u tr m t danh sách tuy n tính:ề ể ữ ộ ế
+ L u tr theo đ a ch k ti p b ng m ng 1 chi u.ư ữ ị ỉ ế ế ằ ả ề
+ L u tr đ a ch b ng con tr (s d ng danh sách móc n i).ư ữ ị ỉ ằ ỏ ụ ố
+ L u tr ra file (s d ng b nh ngoài).ư ữ ụ ộ
(20)+ Phép ghép 2 ho c nhi u danh sách thành m t danh sách (xemặ ề ộ nh bài t p, làm trên m ng và tr ).ư ậ ả ỏ
0 M n1 n1
+ Phép tách (tách m t danh sách thành 2 danh sách).ộ
+ Sao chép m t danh sách ra nhi u danh sách (2 danh sách).ộ ề
+ C p nh t ho c s a đ i n i dung các ph n t c a danh sách.ậ ậ ặ ổ ộ ầ ủ
+ S p x p các ph n t trong danh sách theo th t n đ nh trắ ế ầ ứ ự ấ ị ước
+ Tìm ki m m t ph n t trong danh sách tho mãn m t đi u ki n choế ộ ầ ả ộ ề ệ trước
4.3. Ngăn x p (Stack):ế 4.3.1. Đ nh nghĩa:ị
Stack là m t ki u danh sách tuy n tính đ c bi t, trong đó phép b sung và lo iộ ể ế ặ ệ ổ b ch th c hi n m t đ u g i là đ nh Stack (đ u kia g i là đáy c a Stack).ỏ ỉ ự ệ ộ ầ ọ ỉ ầ ọ ủ
Nguyên t c b sung và lo i b đ i v i Stack đắ ổ ỏ ố ược g i là nguyên t c vào sauọ ắ ra trước (LIFO – Last In First Out)
4.3.2. L u tr Stack b ng m ng:ư ữ ằ ả
Vì Stack là m t danh sách tuy n tính nên có th s d ng m ng m t chi u độ ế ể ụ ả ộ ề ể t ch c m t Stack. Ch ng h n: s d ng m ng S đ l u tr dãy các ph n t :ổ ứ ộ ẳ ụ ả ể ữ ầ S[1], S[2], , S[n] (n g i là s ph n t c c đ i c a m ng S).ọ ố ầ ự ủ ả
G i T là ch s c a ph n t đ nh c a Stack. T đọ ỉ ố ủ ầ ỉ ủ ượ ục s d ng đ theo dõi v tríể ị đ nh c a Stack nên n u s d ng danh sách móc n i đ t ch c m t Stack thì Tỉ ủ ế ụ ố ể ổ ứ ộ được xem nh là m t con tr ch vào v trí đ nh c a Stack.ư ộ ỏ ỉ ị ỉ ủ
Giá tr c a T s tăng lên m t đ n v khi b sung m t ph n t vào danh sách vàị ủ ẽ ộ ị ổ ộ ầ s gi m b t 1 khi lo i b m t ph n t ra kh i Stack.ẽ ả ỏ ộ ầ ỏ
S[n] … S[T]
… S[2] S[1]
L u ý:ư
Khi T = n thì khơng th b sung thêm (hay nói cách khác là Stack đ y).ể ổ ầ
Khi T = 0 thì khơng th lo i b ph n t vì khi đó Stack r ng (hay Stack c n).ể ỏ ầ ỗ
Thu t toán b sung m t ph n t X vào Stack S có đ nh là T:ậ ổ ộ ầ ử ỉ
2