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]
Trang 1M 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 toán:ữ ễ ạ ậ
3 Ngôn ng di n đ t thu t toá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 TOÁ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 toá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:ụ ề ệ ử ụ ố
36
Trang 25.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 toá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
2
Trang 3CH ƯƠ 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 toá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 toá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 ngoài: ví d đĩa (disk).ư ữ ụ
1.3. Ngôn ng di n đ t thu t toán:ữ ễ ạ ậ
Ngôn ng di n đ t thu t toá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 ýư :
Các l nh c a chệ ủ ương trình dùng đ di n t thu t toánể ễ ả ậ
Trang 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.ặ ữ ấ ặ ể
4
Trang 5void main() /* Chuong trinh chuyen so he 10 thanh 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 2 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
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;
case gtn: Sn; [default : Sn+1;]
Trang 6 L nh l p ệ ặ : for, while, do 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 và cout gi ng nh C++.ố ư
<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.ế
{ if ((x % 4 == 0 && x % 100 != 0)||(x % 400 == 0))
return 1;
else return 0;
}
{ return(((x % 4 == 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) đ hoán đ i giá tr c a 2 bi n s a và b cho nhau.ế ể ổ ị ủ ế ố
{ tam=a;
a=b;
b=tam;
}
{ a= a+b;
b= a-b;
6
Trang 7a= a-b;
}
L u ý:ư Bên trong 1 chương trình con có th dùng l nh return; (thoát kh i chể ệ ỏ ươ ng trình con), exit(1) (thoát kh i chỏ ương trình chính)
Trang 8CH ƯƠ NG 2: THI T K VÀ PHÂN TÍCH THU T Ế Ế Ậ TOÁN
2.1. Thi t k thu t toán:ế ế ậ
Các bài toán ngày càng đa d ng và ph c t p, do đó thu t toá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ụ:
Quá trình module hoá bài toán được xem là nguyên 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 hoá 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
D
H ch ệ ươ ng trình
qu n lý sách ả
B sung thêm sách ổ S a thông tin ử
file d li u ữ ệ Xoá d ữ
li u ệ Xem v i ớ
m i b n ọ ả ghi
Tra
c u ứ
Th ẻ sách
Th ng kê ố
Theo mã
Theo ngày
nh p ậ
Trang 9Nh 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.ộ ệ ấ ề ờ
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 quá trình module hoá 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 toán, thu t toá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 đó). Quá 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 toán: ậ
Ch t lấ ượng c a m t chủ ộ ương trình hay thu t toá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 ố ư ệ ả ề ặ ờ ư ớ
Đây là m t yêu c u phân tích quan tr ng nh t cho m t thu t toá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 toán h c ngớ ụ ọ ười ta có th ch ng minh tính đúng đ nể ứ ắ
c a m t thu t toá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ú ý
Yê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 toán, ký hi u là T(n).ờ ự ệ ộ ậ ệ
T c đ x lý c a máy tính, b nh (RAM).ố ộ ử ủ ộ ớ
Ngôn ng đ vi t chữ ể ế ương trình
Trang 10Tuy 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.ể ờ ự ệ ủ ậ
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 toá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 toán theo “đ ph c t p tính toán c a thu t toán”.ờ ự ệ ậ ộ ứ ạ ủ ậ
2.2.3.1. Đ ph c t p tính toá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ế ờ ự ệ ộ ậ 2 (C: h ng), thì ta nóiằ
r ng: Đ ph c t p tính toán c a thu t toán này có c p là nằ ộ ứ ạ ủ ậ ấ 2 và ta ký hi u T(n) =ệ O(n2)
T ng quát: ổ T(n) = O(g(n)) thì ta nói đ ph c t p c a thu t toá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 toán c a m t thu t toá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 toán có th đự ế ộ ứ ạ ủ ộ ậ ể ược xác đ nh tị ừ
đ ph c t p t ng ph n c a thu t toá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))
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) thì đ ph c t p tính toá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)
có th i gian th c hi n là: O(n*1) = O(n).ờ ự ệ 2) for (i=1;i<=n;i++)
1