Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (572.64 KB, 20 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
... 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 tố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:ụ ề ệ ử ụ ố
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
... 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
... 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
... 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
... 71
Tài li u Tham kh oỆ Ả
... 74
Theo Niklaus Wirth: Thu t tốn + C u trúc d li u = Chậ ấ ữ ệ ương trình.
<i>Ví dụ: Cho 1 dãy các ph n t , có th bi u di n d</i>ầ ử ể ể ễ ướ ạ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:<b>ộ ố ấ</b> <b>ề</b>
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ố ớ ỗ ữ ậ ị ẽ ộ ộ ấ ủ ữ
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:<b>ữ ễ</b> <b>ạ</b> <b>ậ</b>
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++.ế ằ ữ ự ữ
<i>1.3.1. C u trúc c a m t ch<b>ấ</b></i> <i><b>ủ</b></i> <i><b>ộ</b></i> <i><b>ươ</b>ng trình chính:</i>
void main()
{
S1;
S2;
...
Sn;
}
L u ýư :
Đ đ 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.ặ ữ ấ ặ ể
<i>Ví dụ</i>:
void 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;
}
}
<i>1.3.2. Các ký t :<b>ự</b></i>
<i> </i> 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.
<i>1.3.3. Các câu l nh:<b>ệ</b></i>
<i> L nh gánệ</i> : 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;
<i> L nh ghépệ</i> :
l nh).ệ
<i> L nh ifệ</i> : 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>;
<i> L nh switchệ</i> : Theo c u trúc sau:ấ
switch (<biểu thức>)
{
case gt1: S1;
case gt2: S2;
...
}
<i>L nh l pệ</i> <i>ặ</i> : for, while, do ... while: Tương t nh các l nh l p c aự ư ệ ặ ủ
C.
<i>L nh nh yệ</i> <i>ả</i> : goto n (n: s hi u/nhãn c a chố ệ ủ ương trình).
<i>L nh vào raệ</i> : cin và cout gi ng nh C++.ố ư
<i>1.3.4. Ch<b>ươ</b>ng trình con: </i>
<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 ý<b>ư</b> : 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><b>ị ủ</b> đ gán k t qu cho hàmể ế ả .
Sau đây là ví d v hàm có tr v giá tr .ụ ề ả ề ị
<i>Ví dụ</i>: 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.ế
<i>Cách 1: </i><b>int namnhuan(x)</b>
{ if ((x % 4 == 0 && x % 100 != 0)||(x % 400 == 0))
return 1;
else
return 0;
}
<i>Cách 2: </i><b>int namnhuan(x)</b>
{ 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).ị ả ề ọ ủ ụ
<i>Ví dụ</i>: Vi t hàm Hoandoi(a, b) đ hốn đ i giá tr c a 2 bi n s a và b cho nhau.ế ể ổ ị ủ ế ố
<i>Cách 1:</i> void hoandoi(&a, &b) //a và b là các tham biến
{ tam=a;
a=b;
b=tam;
}
<i>Cách 2:</i> void hoandoi(&a, &b)
{ a= a+b;
b= a-b;
a= a-b;
}
<i>2.1.1. Module hố thu t tốn:<b>ậ</b></i>
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 tốn l n thành các bàiớ
<i>Ví dụ:</i>
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.ạ ư ệ
<i>Ví dụ: Ch</i>ươ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, ...ấ ả ề
<i>Yêu c u:ầ</i>
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ổ <sub>S a thơng tin </sub>ử
file d li uữ ệ Xoá d
ữ
li uệ Xem v i <sub>m i b n </sub>ọ ảớ
ghi
Tra
c uứ
Th ẻ
sách
Th ng kêố
Theo
mã
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.ộ ệ ấ ề ờ
<i>2.1.2. Ph<b>ươ</b>ng pháp tinh ch nh t ng b<b>ỉ</b></i> <i><b>ừ</b></i> <i><b>ướ</b>c:</i>
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 tố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 hốế
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: <b>ậ</b>
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 .ố ư ệ ả ề ặ ờ ư ớ
<i>2.2.1. Tính đúng đ n:<b>ắ</b></i>
Đây là m t 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.ủ ộ ậ
<i>2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu :<b>ẫ</b></i> <i><b>ữ</b></i> <i><b>ơ</b></i> <i><b>ả</b></i> <i><b>ệ</b></i> <i><b>ả</b></i>
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.ầ ề ờ ộ ả ọ ẹ
<i>2.2.3. Phân tích th i gian th c hi n thu t toán:<b>ờ</b></i> <i><b>ự</b></i> <i><b>ệ</b></i> <i><b>ậ</b></i>
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).ố ộ ử ủ ộ ớ
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.ể ờ ự ệ ủ ậ
<i>Ví dụ:</i>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 tốn theo “đ ph c t p tính tốn c a thu t tốn”.ờ ự ệ ậ ộ ứ ạ ủ ậ
<i>2.2.3.1. Đ ph c t p tính tốn c a thu t toán:ộ</i> <i>ứ ạ</i> <i>ủ</i> <i>ậ</i>
N u th i gian th c hi n m t thu t tốn là T(n) = Cnế ờ ự ệ ộ ậ 2 <sub>(C: h ng), thì ta nói</sub><sub>ằ</sub> <sub> </sub>
r ng: Đ ph c t p tính tốn c a thu t tốn này có c p là nằ ộ ứ ạ ủ ậ ấ 2 <sub>và ta ký hi u T(n) =</sub><sub>ệ</sub> <sub> </sub>
O(n2<sub>).</sub>
<i>T ng qt:ổ</i> 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).ộ ứ ạ ủ ậ ấ
<i>2.2.3.2. Xác đ nh đ ph c t p c a thu t toán:ị</i> <i>ộ</i> <i>ứ ạ</i> <i>ủ</i> <i>ậ</i>
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:ộ ứ ạ ừ ầ ủ ậ ụ ể ộ ố ắ
<i> Quy t c tính t ngắ</i> <i>ổ</i> :
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))).
<i>Ví dụ</i>: g1(n) = n2, g2(n) = n3. Suy ra: T(n) = O(n3).
L u ý<b>ư</b> : g1(n) g2(n) ( n n0) O(g1(n) + g2(n)) = O(g2(n))
<i>Ví dụ:</i> O(n + log2n) = O(n)
<i> Quy t c nhân:ắ</i>
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 tốn làệ ặ ộ ứ ạ
O(g1(n).g2(n)).
L u ý:<b>ư</b>
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)ằ
<i>Ví dụ:</i>
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++)
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<sub>).</sub>
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.ợ ấ ấ
<i>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</i>ộ ồ ầ ử ả ộ
giá tr cho trị ước.
void timkiem(x)
{
found=0;// gán giá trị cho found lúc ban đầu là 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])
Chương trình đ quy là chệ ương trình g i đ n chính nó.ọ ế
<i>Ví dụ: M t hàm đ quy là m t hàm đ</i>ộ ệ ộ ượ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.
<i>Ví dụ: Tên bi n đ</i>ế ượ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).ợ ế
<i>Ví dụ: Cho s t nhiên n, ta đ nh nghĩa n! nh sau:</i>ố ự ị ư 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.ế
<i>Ví dụ: Cho dãy các ph n t m ng V[1], V[2], ..., V[n] đã đ</i>ầ ử ả ượ ắ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ợ ế
vi c phân tích đó, ngệ ười ta đã xem thu t toán đ quy là thu t toá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.ỗ ọ
<i>Ví d :ụ</i>
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);
<i>K t qu :ế</i> <i>ả</i> 3 Ong
2 Ba
1 Ong
0 Ba
3.2. Ph<b>ươ</b>ng pháp đ thi t k m t thu t toán đ quy:<b>ể</b> <b>ế ế ộ</b> <b>ậ</b> <b>ệ</b>
Tham s hố bài tố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.ợ ế
<i>Ví dụ:</i>
<i>1) L p hàm GT(n) = n!ậ</i>
long GT(n)
{ if (n==0) return 1;
else return n*GT(n-1);
}
2) <i>Dãy s Fibonaciố</i> : F1 = F2 = 1;
Fn = Fn1 + F n2. (n 3)
long F(n)
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
<b>Ư</b> <b>ể</b> Khuy t đi m<b>ế</b> <b>ể</b>
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). <sub>Có th gây t n b nh </sub>ể ố ộ ớ 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.ấ ầ ế
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 ).ồ ữ ố
<i>Ví d 1ụ</i> <i>: Vi t th t c in xâu đ o ng</i>ế ủ ụ ả ượ ủ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à <i>batdau và l y </i>ấ <i>soluong ký t .</i>ự
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;
}
<i>Cách 1:</i>
Trường h p chung:ợ + In ký t cu i c a xâu X.ự ố ủ
+ Đ 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);
}
}
<i>Cách 2:</i>
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);
}
}
<i>Ví d 2ụ</i> <i>:</i> 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 hố bài tố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:ợ ế
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 tốn quay lui:<b>ậ</b>
Ta có th dùng k thu t đ quy đ di n t thu t toán quay lui. Bài toán sể ỹ ậ ệ ể ễ ả ậ ử
d ng thu t tố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 đó.ả ề ệ
<i>Phương pháp c a thu t tốn quay lui:ủ</i> <i>ậ</i>
<i></i> 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ó.ệ ấ ả ả ể ủ
<i>Ví dụ</i>: 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 luôn 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:ể ả ủ ụ ệ
void Try(i) //Thử xem xi sẽ nhận giá trị nào
for (mỗi khả năng j của x<i>i</i>)
{
if <Chấp nhận>
{
<Xác định xi theo j>; // Ví dụ: x[i]=j;
if (i==n) <Ghi nhận một lời giải>;
else Try(i+1);
}
}
1) Tìm t t c các hốn v c a m t m ng g m có n ph n t .ấ ả ị ủ ộ ả ồ ầ ử
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.ả ộ ậ ứ ự ồ ộ ố ố ị ầ ử
<i>Ví dụ: Trong C, đ khai báo m t dãy s nguyên n ph n t : a[0], a[1],..., a[n1]</i>ể ộ ố ầ ử
(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.ậ ộ ả ề
<i>Ví dụ: float B[100][100]</i>;
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.ự ả ề ả ề
<i>C u trúc l u tr :ấ</i> <i>ư</i> <i>ữ</i>
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.ể ế ế
<i>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</i>ọ ả ề ồ ầ ử ỗ ầ ử ộ
(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ị ỉ ầ ử 0
đ a ch c a ph n t th aị ỉ ủ ầ ử ứ i:
Loc (ai) = Loc (a0) + d*i
L u ý:<b>ư</b>
Đ 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 :ự
<i>Ví dụ</i>: 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)
Trong đó, n là s c t c a ma tr n.ố ộ ủ ậ
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 .ầ ử
<i>L u ýư</i> <i>: do các ph n t c a m ng th</i>ầ ử ủ ả ườ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 xố / chèn m t ph n t trongệ ự ệ ộ ầ ử
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):<b>ế</b>
<i>Đ nh nghĩa:ị</i>
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).ư ữ ử ụ ộ ớ
+ 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 1 ... M ... n1
0 1 ... 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):<b>ế</b>
<i>4.3.1. Đ nh nghĩa:<b>ị</b></i>
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).
<i>4.3.2. L u tr Stack b ng m ng:<b>ư</b></i> <i><b>ữ</b></i> <i><b>ằ</b></i> <i><b>ả</b></i>
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 ý:<b>ư</b>
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).ể ạ ỏ ầ ử ỗ ạ
<i>Thu t toán b sung m t ph n t X vào Stack S có đ nh là T:ậ</i> <i>ổ</i> <i>ộ</i> <i>ầ ử</i> <i>ỉ</i>
2