Slide bài giảng môn Cấu trúc dữ liệu - giải thuật nội dung chương 2: Một số giải thuật quan trọng

Slide bài giảng môn Cấu trúc dữ liệu - giải thuật nội dung chương 2: Một số giải thuật quan trọng của Học viện Công nghệ Bưu chính Viễn thông với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!

lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Chương 2. Một s gii thut quan trng
2.1. Thut toán vét cn
2.2. Thut toán sinh (Generation Algorithm)
2.3. Thut toán qui (Recursive Algorithm
2.4. Thut toán quay lui (Back Track Alogorithm)
2.5. Thut toán tham lam (Greedy Algorithm)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
2.6. Thut toán chia tr (Divide and Conquer Algorithm)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
2.7. Thut toán qui hoch ng (Dynamic Algorithm)
2.8. Thut toán nhánh cn (Branch an Bound)
2.9. Thut toán tìm kiếm mu (Pattern Searching)
2.10. CASE STUDY
Chương 3. Stack – Queue Link List
3.1. Mt s thut toán dựa vào ngăn xếp
3.2. Mt s Thut toán da vào hàng i
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
3.3. Mt s Thut toán da trên danh sách liên kết
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
3.4. Kh qui dựa vào ngăn xếp
3.5. ng dng của ngăn xếp
3.6. ng dng ca hàng i
3.7. ng dng ca danh sách liên kết
3.8. CASE STUDY
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Chương 5. Các thuật toán trên th
5.1. Mt s thut toán trên th vô hướng
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
5.2. Mt s thut toán trên th có hướng
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
5.3. Mt s thut toán trên th Euler
5.4. Mt s thut toán trên th Hamilton
5.5. Mt s thut toán trên th y
5.6. Mt s thut toán trên th hai phía
5.7. Lung cc i trên mng
5.8. CASE STUDY
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
TÀI LIU THAM KHO:
[1] Robert Sedgewick, “Algorihms”, McGraw Hill Company,
2006, Vol 1, 2, 3, 4.
[2] N. Knuth, “The Art of Programming”, McGraw Hill
Company, 2006, Vol 1, 2, 3, 4.
[3] Robert Sedgewick, “Cẩm nang thuật toán”, Nhà xuất bn
khoa hc k thut Hà Ni, 2004, Vol 1, 2, 3, 4.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
[4] Lê Minh Hoàng, “Bài giảng các chuyên ề”, Nhà xuất bn
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
khoa hc k thut Hà Ni, 2008.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
YÊU CU:
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
1.1. Qui trình gii quyết vn bng máy tính
Xác nh yêu cu bài toán: Xem xét bài toán cn x vn gì? Gi thiết nào
ã ược biết trước và li gii cn t nhng yêu cu gì? Ví d thi gian, hay không
gian nh.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Tìm cu trúc d liu biu din bài toán: Cu trúc d liu phi biu din y
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
các ối tượng thông tin vào ca bài toán. Các thao tác trên cu trúc d liu phi
phù hp vi nhng thao tác ca thuật toán ược la chn. Cu trúc d liu phi
cài t ưc bng ngôn ng lp trình c th áp ng yêu cu bài toán.
Tìm thut toán: ng vi các cu trúc d liu ã ược la chn:
Cài t thut toán trên cu trúc d liu ã la chn.
Kim th chương trình cài t theo thut toán.
Tối ưu chương trình: Ci tiến chương trình tốt hơn.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
1.2. Thut toán và gii thut
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
}
1.2.2. Các ặc trưng của thut toán:
Mt thut toán cn tha mãn các tính chất dưới ây:
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Tính ơn ịnh. mỗi bước ca thuật toán, các thao tác sơ cấp phi hết sc rõ
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
ràng, không gây nên s ln xn, nhp nhằng, a nghĩa. Thực hin úng các
c ca thut toán trên tp d liu vào, ch cho duy nht mt kết qu ra.
Tính dng. Thuật toán không ược i vào quá trình vô hn. Phi dng li
cho kết qu sau mt s hu hạn các bước.
Tính úng. Sau khi thc hin tt c các bước ca thut toán theo úng qui trình
ã nh, ta phi nhận ược kết qu mong mun vi mi b d liu u vào. Kết
qu ó ược kim chng bng yêu cu ca bài toán.
Tính ph dng. Thut toán phi d sa i thích ứng ược vi bt k bài toán
nào trong lp các bài toán ng loi th làm vic trên nhiu loi d liu
khác nhau.
Tính kh thi. Thut toán phi d hiu, d cài t, thc hiện ược trên máy nh
vi thi gian cho phép.
1.2.3. Khái nim gii thut
Gii thut là khái nim m rng ca thuật toán, trong ó tính xác nhược làm mm
i. Ví d i ây s minh ha cho iu này.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Ví d. Tìm USCLN (a, b).
Int USCLN ( int a, int b) {
if ( a > b ) return ( USCLN( a-b, b));
else if ( a < b) return (USCLN( a, b-a))
; return(a);
}
Gi s ta tìm USCLN( 8, 12 ) = USCLN(8, 4); //Chưa xác nh =
USCLN (4,4); // Chưa xác ịnh
= 4.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Chính vì lý do trên khái nim gii thut ưc thay thế cho khái nim thut toán. Tuy
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
vậy, do thói quen người ta vn s dng ng nht các khái nim này. T nay v
sau, ta cũng sử dng chung khái nim thut toán và gii thut là ging nhau và u
có nghĩa: Algorithm, Method, Procedure, Proccess.
1.2.4. Phương pháp biểu din thut toán:
Thông thường, biu din mt thut toán ta có th s dụng các phương pháp sau:
Biu din bng ngôn ng t nhiên. Ngôn ng t nhiên là phương tiện
giao tiếp giữa con người vi con người. Ta có th s dng chính ngôn ng
này vào vic biu din thut toán.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Ngôn ng hình thc. Ngôn ng hình thức là phương tiện giao tiếp gia
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
con người và h thng máy tính. Ví d ngôn ng sơ ồ khi, ngôn ng ta t
nhiên, ngôn ng c t. Đc im chung ca các loi ngôn ng này là vic s
dng nó rt gn vi ngôn ng máy tính.
Ngôn ng máy tính. Là phương tiện giao tiếp gia máy tính và máy tính.
Trong trường hp này ta có th s dng bt k nôn ng lp trình nào mô t
thut toán.
Ghi chú. Trong các phương pháp biểu din thuật toán, phương pháp biểu din
bng ngôn ng hình thức ược s dng rng dãi vì nó gn vi ngôn ng t nhiên
và gn vi ngôn ng hình thc.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
1.3. Cu trúc d liu (Data Structure)
Cu trúc d liu ược hiểu phương pháp biểu din ối ng hành vi ca ối ng
thế gii thc trong h thống máy tính. Dưi ây là mt s khái niệm cơ bản v cu
trúc d liu.
1.3.1. Mt s thut ng và khái niệm cơ bản
Kiu (A type): là mt tên dùng ch tp các giá tr. d Boolean mt tên ch tp
hai giá tr TRUE, FALSE. Int mt tên dùng ch tp các s nguyên biu diễn ược
bng 2 byte.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Kiu d liu (A Data Type): mt tên thuc kiu (A Type) cùng vi các thao tác
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
trên kiu d liệu ó. Đối vi ngôn ng lp trình ta th hiu kiu d liệu như là một
biến thuc kiu cùng vi các phép toán trên nó. Ví d vi khai báo: int a, b;
Ta hiu a và b d liu kiu s nguyên (int) là mt kiu d liu. Khi ó, a b có th
thc hiện ược các phép toán s hc { +, -, *, /, %, >>, <<, &, |, ^} và các phép toán
logic { &&, ||, ! }.
Kiu trừu tưng( A Abtract Data Type): mô t thc tế các ối tưng thông qua các
kiểu. Như vy, kiu d liu trừu tượng có th hiu là s t hp ca các kiu d liu
cơ bản. Kiu d liu trừu tượng ược viết tt là ADT.
Cu trúc d liu (A Data Stucture): mt cài t c th ca các kiu d liu tru
ng. Trong ó, cu trúc d liu phn ánh không gian nh lưu tr d liu thuc kiu.
1.3.2. Phân loi các cu trúc d liu
Cu trúc S nguyên (integer): short int, long int
d liu
cơ
S thc (real): float, double.
bn
Ký t (character): char , wchar_t:
(base data structure)
Ngăn xếp (stack)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Cu trúc
d liu Hàng đi (queue): queue, priority queue, circular queue, dqueue.
(data
structure) Cu trúc Danh sách liên kết đơn: single linked list), d liu circular
single linked list.
ADT Danh sách liên kết kép: double linked list), (abtract circular double
linked list.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
data Cây (tree): Binary Tree, Binary Search Tree, structure)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Complete Binary Tree, AVL tree, B-Tree, RedBlack-tree….
Đ th (Graph): Directed Graph, Undirected
Graph, Euler Graph, Hamilton Graph, Bipartile
Graph, Complete Graph…
1.4. Độ phc tp tính toán
Mt bài toán th thc hin bng nhiu thut toán khác nhau. Chn gii thut nhanh
nht gii bài toán là mt nhu cu ca thc tế. Vì vy ta cn phi có s ước lưng c
th minh chng bng toán hc mc nhanh chm ca mi gii thut.
1.4.1. Khái nim phc tp thut toán
Thi gian thc hin mt gii thut bằng chương trình máy tính phụ thuc vào các
yếu t:
Kích thước d liu vào: D liu càng ln thì thi gian x lý càng chm.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Phn cng máy tính: máy có tc cao thc hiện nhanh hơn trên máy có tốc
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
thp. Tuy vy, yếu t này không ảnh hưởng ến quá trình xác nh thi gian thc
hin ca thut toán nếu xem xét thi gian thc hin thuật toán như mt hàm
ca dài d liu T(n).
Tng quát, cho hai hàm f(x), g(x) xác nh trên tp các s nguyên ng hoặc tp các
s thc vào tp các s thực. Hàm f(x) ược gi O(g(x)) nếu tn ti mt hng s C>0
và n0 sao cho:
|f(x)| ≤C.|g(x)| vớ mọi x≥n0.
g(x). Nếu f(x) thi gian thc hin ca mt thut toán thì ta nói gii thut ó cp
g(x) hay phc tp thut toán là O(g(x)).
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
1.4.3. Mt s tính cht ca phc tp thut toán:
•Vi P(n) là mt a thc bc k thì O(P(n)) = O(n
k
). Vì thế ta nói, mt thut toán có
phc tp cp a thc là O(n
k
).
•Với a, b hai s tùy ý f(n) mt hàm xác ịnh dương thì
log
a
f(n)=log
a
b.log
b
(f(n). vy phc tp thut toán cấp logarit ược hiu
O(log(f(n)) mà không cn quan tâm ến cơ số.
•Nếu phc tp thut toán hng số, nghĩa thời gian tính toán không ph
thuc vào dài d liệu ược ký hiu là O(1).
•Mt gii thut cp 2
n
, n!, n
n
ược gi gii thuật hàm mũ. Những gii thut
này tng có tc rt chm.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
•Đ phc tp tính toán ca mt on chương trình P chính bằng s ln thc hin
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
mt phép toán tích cc. Trong ó, phép toán tích cc trong mt oạn chương trình
là phép toán mà s ln thc hiện nó không ít hơn các phép toán khác.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
for (j=n; j >0 ; j = j / c ){
<Tp các ch th phc tp O(1)>;
}
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
1.4.5. Mt s thuật toán cơ bản
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Thuật toán Euclid tìm ước s chung ln nht ca hai s a, b.
cout<<coso[j]<<“ “;
}
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Thut toán cng hai s nguyên.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
1.5. Tính úng n ca thut toán da vào d liu
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Khi hoàn thành vic xây dng mt thut toán thì thut toán ó cn phi ược kim
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
nghiệm. Phương pháp kim nghim thut toán ph biến hiện nay thường ược s
dng trong tin hc kim nghim da vào d liu. Để th kim nghim thut toán
da vào d liu ta cn tiến hành xây dng các b d liu Test. Các b d liu Test
cn tha mãn:
Kiểm tra ược kết qu thc hin ca thut toán i vi d liu nh.
Kiểm tra ược kết qu thc hin ca thut toán i vi d liu ln.
Kiểm tra ược kết qu ca thut toán i với các trường hp c bit.
Kim tra ược phc tp ca thut toán da vào thi gian thc hin mi
test.
Kiểm tra ược k thut cài t thut toán của người lp trình.
Ví d 1. S dng cu trúc d liu thích hp, hãy viết chương trình chuyển
i s t nhiên n thành s h cơ số b (2 b 32).
D liu vào (Input) cho bi file data.in theo khuôn dng:
Dòng u tiên ghi li s t nhiên K là s ng các test (k 100).
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
K dòng kế tiếp ghi li mi dòng mt test. Mi test bao gm mt cp s
n, b. Hai s ược viết cách nhau mt vài khong trng.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Kết qu ra (Output): ghi li K dòng trong file ketqua.out, mi dòng ghi
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
li b ba s n, k, x. Trong ó x là s h cơ số b ưc chuyn i t n. Ví
d i ây minh ha cho file input và output ca bài toán.
Input.in Output.out
5 8 2 1000
8 2 32 16 20
32 16 255 16 FF
255 16 100 10 100
100 10 64 32 20
64 32
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
d 2. Hãy viết chương trình m số các s t nhiên N tha mãn ng thi nhng
iu kiện dưới ây (N 2
31
):
N là s có K ch s (K 15).
N là s nguyên t.
Đảo ngược các ch s của N cũng là một s nguyên t.
Tng các ch s của N cũng là một s nguyên t.
Mi ch s của N cũng là các số nguyên t ;
Thi gian thc hiện chương trình không quá 1sec.
D liu vào (Input) cho bi file data.in theo khuôn dng:
Dòng u tiên ghi li s t nhiên M là s ng các test (M 100).
M dòng kế tiếp ghi li mi dòng mt test. Mi test bao gm mt s K. Hai s
ược viết cách nhau mt vài khong trng.
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
Kết qu ra (Output): ghi li M dòng trong file ketqua.out, mi dòng ghi li b hai s
lOMoARcPSD|37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)
s N, X. Trong ó X là s các s có N ch s tha mãn yêu cu ca bài toán. Ví d
i ây minh ha cho file input và output ca bài toán.
Input.in Output.out
5 2 0
2 3 8
3 4 15
4 5 46
5 7 359
7
| 1/67

Preview text:

lOMoARcPSD| 37054152
Chương 2. Một số giải thuật quan trọng 2.1. Thuật toán vét cạn
2.2. Thuật toán sinh (Generation Algorithm)
2.3. Thuật toán ệ qui (Recursive Algorithm
2.4. Thuật toán quay lui (Back Track Alogorithm)
2.5. Thuật toán tham lam (Greedy Algorithm)
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
2.6. Thuật toán chia ể trị (Divide and Conquer Algorithm)
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
2.7. Thuật toán qui hoạch ộng (Dynamic Algorithm)
2.8. Thuật toán nhánh cận (Branch an Bound)
2.9. Thuật toán tìm kiếm mẫu (Pattern Searching) 2.10. CASE STUDY
Chương 3. Stack – Queue – Link List
3.1. Một số thuật toán dựa vào ngăn xếp
3.2. Một số Thuật toán dựa vào hàng ợi
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
3.3. Một số Thuật toán dựa trên danh sách liên kết
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
3.4. Khử ệ qui dựa vào ngăn xếp
3.5. Ứng dụng của ngăn xếp
3.6. Ứng dụng của hàng ợi
3.7. Ứng dụng của danh sách liên kết 3.8. CASE STUDY
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Chương 5. Các thuật toán trên ồ thị
5.1. Một số thuật toán trên ồ thị vô hướng
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
5.2. Một số thuật toán trên ồ thị có hướng
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
5.3. Một số thuật toán trên ồ thị Euler
5.4. Một số thuật toán trên ồ thị Hamilton
5.5. Một số thuật toán trên ồ thị ầy ủ
5.6. Một số thuật toán trên ồ thị hai phía
5.7. Luồng cực ại trên mạng 5.8. CASE STUDY
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152 TÀI LIỆU THAM KHẢO:
[1] Robert Sedgewick, “Algorihms”, McGraw Hill Company, 2006, Vol 1, 2, 3, 4.
[2] N. Knuth, “The Art of Programming”, McGraw Hill
Company, 2006, Vol 1, 2, 3, 4.
[3] Robert Sedgewick, “Cẩm nang thuật toán”, Nhà xuất bản
khoa học kỹ thuật Hà Nội, 2004, Vol 1, 2, 3, 4.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
[4] Lê Minh Hoàng, “Bài giảng các chuyên ề”, Nhà xuất bản
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
khoa học kỹ thuật Hà Nội, 2008.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152 YÊU CẦU:
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
1.1. Qui trình giải quyết vấn ề bằng máy tính
Xác ịnh yêu cầu bài toán: Xem xét bài toán cần xử lý vấn ề gì? Giả thiết nào
ã ược biết trước và lời giải cần ạt những yêu cầu gì? Ví dụ thời gian, hay không gian nhớ.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Tìm cấu trúc dữ liệu biểu diễn bài toán: Cấu trúc dữ liệu phải biểu diễn ầy ủ
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
các ối tượng thông tin vào của bài toán. Các thao tác trên cấu trúc dữ liệu phải
phù hợp với những thao tác của thuật toán ược lựa chọn. Cấu trúc dữ liệu phải
cài ặt ược bằng ngôn ngữ lập trình cụ thể áp ứng yêu cầu bài toán.
Tìm thuật toán: ứng với các cấu trúc dữ liệu ã ược lựa chọn:
Cài ặt thuật toán trên cấu trúc dữ liệu ã lựa chọn.
Kiểm thử chương trình cài ặt theo thuật toán.
Tối ưu chương trình: Cải tiến ể chương trình tốt hơn.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
1.2. Thuật toán và giải thuật
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152 }
1.2.2. Các ặc trưng của thuật toán:
Một thuật toán cần thỏa mãn các tính chất dưới ây:
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Tính ơn ịnh. Ở mỗi bước của thuật toán, các thao tác sơ cấp phải hết sức rõ
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
ràng, không gây nên sự lộn xộn, nhập nhằng, a nghĩa. Thực hiện úng các
bước của thuật toán trên tập dữ liệu vào, chỉ cho duy nhất một kết quả ra.
Tính dừng. Thuật toán không ược rơi vào quá trình vô hạn. Phải dừng lại và
cho kết quả sau một số hữu hạn các bước.
Tính úng. Sau khi thực hiện tất cả các bước của thuật toán theo úng qui trình
ã ịnh, ta phải nhận ược kết quả mong muốn với mọi bộ dữ liệu ầu vào. Kết
quả ó ược kiểm chứng bằng yêu cầu của bài toán.
Tính phổ dụng. Thuật toán phải dễ sửa ổi ể thích ứng ược với bất kỳ bài toán
nào trong lớp các bài toán cùng loại và có thể làm việc trên nhiều loại dữ liệu khác nhau.
Tính khả thi. Thuật toán phải dễ hiểu, dễ cài ặt, thực hiện ược trên máy tính với thời gian cho phép.
1.2.3. Khái niệm giải thuật
Giải thuật là khái niệm mở rộng của thuật toán, trong ó tính “xác ịnh” ược làm mềm
i. Ví dụ dưới ây sẽ minh họa cho iều này.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152 Ví dụ. Tìm USCLN (a, b). Int USCLN ( int a, int b) {
if ( a > b ) return ( USCLN( a-b, b));
else if ( a < b) return (USCLN( a, b-a)) ; return(a); }
Giả sử ta tìm USCLN( 8, 12 )
= USCLN(8, 4); //Chưa xác ịnh =
USCLN (4,4); // Chưa xác ịnh = 4.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Chính vì lý do trên khái niệm giải thuật ược thay thế cho khái niệm thuật toán. Tuy
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
vậy, do thói quen người ta vẫn sử dụng ồng nhất các khái niệm này. Từ nay về
sau, ta cũng sử dụng chung khái niệm thuật toán và giải thuật là giống nhau và ều
có nghĩa: Algorithm, Method, Procedure, Proccess.
1.2.4. Phương pháp biểu diễn thuật toán:
Thông thường, ể biểu diễn một thuật toán ta có thể sử dụng các phương pháp sau: •
Biểu diễn bằng ngôn ngữ tự nhiên. Ngôn ngữ tự nhiên là phương tiện
giao tiếp giữa con người với con người. Ta có thể sử dụng chính ngôn ngữ
này vào việc biểu diễn thuật toán.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152 •
Ngôn ngữ hình thức. Ngôn ngữ hình thức là phương tiện giao tiếp giữa
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
con người và hệ thống máy tính. Ví dụ ngôn ngữ sơ ồ khối, ngôn ngữ tựa tự
nhiên, ngôn ngữ ặc tả. Đặc iểm chung của các loại ngôn ngữ này là việc sử
dụng nó rất gần với ngôn ngữ máy tính. •
Ngôn ngữ máy tính. Là phương tiện giao tiếp giữa máy tính và máy tính.
Trong trường hợp này ta có thể sử dụng bất kỳ nôn ngữ lập trình nào ể mô tả thuật toán.
Ghi chú. Trong các phương pháp biểu diễn thuật toán, phương pháp biểu diễn
bằng ngôn ngữ hình thức ược sử dụng rộng dãi vì nó gần với ngôn ngữ tự nhiên
và gần với ngôn ngữ hình thức.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
1.3. Cấu trúc dữ liệu (Data Structure)
Cấu trúc dữ liệu ược hiểu là phương pháp biểu diễn ối tượng và hành vi của ối tượng
ở thế giới thực trong hệ thống máy tính. Dưới ây là một số khái niệm cơ bản về cấu trúc dữ liệu.
1.3.1. Một số thuật ngữ và khái niệm cơ bản
Kiểu (A type): là một tên dùng ể chỉ tập các giá trị. Ví dụ Boolean là một tên chỉ tập
hai giá trị TRUE, FALSE. Int là một tên dùng ể chỉ tập các số nguyên biểu diễn ược bằng 2 byte.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Kiểu dữ liệu (A Data Type): là một tên thuộc kiểu (A Type) cùng với các thao tác
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
trên kiểu dữ liệu ó. Đối với ngôn ngữ lập trình ta có thể hiểu kiểu dữ liệu như là một
biến thuộc kiểu cùng với các phép toán trên nó. Ví dụ với khai báo: int a, b;
Ta hiểu a và b có dữ liệu kiểu số nguyên (int) là một kiểu dữ liệu. Khi ó, a và b có thể
thực hiện ược các phép toán số học { +, -, *, /, %, >>, <<, &, |, ^} và các phép toán logic { &&, ||, ! }.
Kiểu trừu tượng( A Abtract Data Type): mô tả thực tế các ối tượng thông qua các
kiểu. Như vậy, kiểu dữ liệu trừu tượng có thể hiểu là sự tổ hợp của các kiểu dữ liệu
cơ bản. Kiểu dữ liệu trừu tượng ược viết tắt là ADT.
Cấu trúc dữ liệu (A Data Stucture): là một cài ặt cụ thể của các kiểu dữ liệu trừu
tượng. Trong ó, cấu trúc dữ liệu phản ánh không gian nhớ lưu trữ dữ liệu thuộc kiểu.
1.3.2. Phân loại các cấu trúc dữ liệu dữ liệu
Cấu trúc Số nguyên (integer): short int, long int
Số thực (real): float, double. bản
Ký tự (character): char , wchar_t: (base data structure) Ngăn xếp (stack)
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152 Cấu trúc
dữ liệu Hàng đợi (queue): queue, priority queue, circular queue, dqueue. (data
structure) Cấu trúc Danh sách liên kết đơn: single linked list), dữ liệu circular single linked list.
ADT Danh sách liên kết kép: double linked list), (abtract circular double linked list.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
data Cây (tree): Binary Tree, Binary Search Tree, structure)
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Complete Binary Tree, AVL tree, B-Tree, RedBlack-tree….
Đồ thị (Graph): Directed Graph, Undirected
Graph, Euler Graph, Hamilton Graph, Bipartile Graph, Complete Graph…
1.4. Độ phức tạp tính toán
Một bài toán có thể thực hiện bằng nhiều thuật toán khác nhau. Chọn giải thuật nhanh
nhất giải bài toán là một nhu cầu của thực tế. Vì vậy ta cần phải có sự ước lượng cụ
thể ể minh chứng bằng toán học mức ộ nhanh chậm của mỗi giải thuật. 1.4.1. Khái niệm
ộ phức tạp thuật toán
Thời gian thực hiện một giải thuật bằng chương trình máy tính phụ thuộc vào các yếu tố:
• Kích thước dữ liệu vào: Dữ liệu càng lớn thì thời gian xử lý càng chậm.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
• Phần cứng máy tính: máy có tốc ộ cao thực hiện nhanh hơn trên máy có tốc ộ
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
thấp. Tuy vậy, yếu tố này không ảnh hưởng ến quá trình xác ịnh thời gian thực
hiện của thuật toán nếu xem xét thời gian thực hiện thuật toán như một hàm
của ộ dài dữ liệu T(n).
Tổng quát, cho hai hàm f(x), g(x) xác ịnh trên tập các số nguyên dư ng hoặc tập các
số thực vào tập các số thực. Hàm f(x) ược gọi là O(g(x)) nếu tồn tại một hằng số C>0 và n0 sao cho:

|f(x)| ≤C.|g(x)| vớ mọi x≥n0.
g(x). Nếu f(x) là thời gian thực hiện của một thuật toán thì ta nói giải thuật ó có cấp
g(x) hay ộ phức tạp thuật toán là O(g(x)).
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
1.4.3. Một số tính chất của ộ phức tạp thuật toán:
•Với P(n) là một a thức bậc k thì O(P(n)) = O(nk). Vì thế ta nói, một thuật toán có
ộ phức tạp cấp a thức là O(nk).
•Với a, b là hai cơ số tùy ý và f(n) là một hàm xác ịnh dương thì
logaf(n)=logab.logb(f(n). Vì vậy ộ phức tạp thuật toán cấp logarit ược ký hiệu là
O(log(f(n)) mà không cần quan tâm ến cơ số.
•Nếu ộ phức tạp thuật toán là hằng số, nghĩa là thời gian tính toán không phụ
thuộc vào ộ dài dữ liệu ược ký hiệu là O(1).
•Một giải thuật có cấp 2n, n!, nn ược gọi là giải thuật hàm mũ. Những giải thuật
này thường có tốc ọ rất chậm.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
•Độ phức tạp tính toán của một oạn chương trình P chính bằng số lần thực hiện
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
một phép toán tích cực. Trong ó, phép toán tích cực trong một oạn chương trình
là phép toán mà số lần thực hiện nó không ít hơn các phép toán khác.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
for (j=n; j >0 ; j = j / c ){
<Tập các chỉ thị có ộ phức tạp O(1)>; }
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
1.4.5. Một số thuật toán cơ bản
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Thuật toán Euclid tìm ước số chung lớn nhất của hai số a, b. cout<}
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Thuật toán cộng hai số nguyên.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
1.5. Tính úng ắn của thuật toán dựa vào dữ liệu
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Khi hoàn thành việc xây dựng một thuật toán thì thuật toán ó cần phải ược kiểm
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
nghiệm. Phương pháp kiểm nghiệm thuật toán phổ biến hiện nay thường ược sử
dụng trong tin học là kiểm nghiệm dựa vào dữ liệu. Để có thể kiểm nghiệm thuật toán
dựa vào dữ liệu ta cần tiến hành xây dựng các bộ dữ liệu Test. Các bộ dữ liệu Test cần thỏa mãn:
• Kiểm tra ược kết quả thực hiện của thuật toán ối với dữ liệu nhỏ.
• Kiểm tra ược kết quả thực hiện của thuật toán ối với dữ liệu lớn.
• Kiểm tra ược kết quả của thuật toán ối với các trường hợp ặc biệt.
• Kiểm tra ược ộ phức tạp của thuật toán dựa vào thời gian thực hiện mỗi test.
• Kiểm tra ược kỹ thuật cài ặt thuật toán của người lập trình.
Ví dụ 1. Sử dụng cấu trúc dữ liệu thích hợp, hãy viết chương trình chuyển
ổi số tự nhiên n thành số ở hệ cơ số b (2 b 32).
Dữ liệu vào (Input) cho bởi file data.in theo khuôn dạng:
• Dòng ầu tiên ghi lại số tự nhiên K là số lượng các test (k 100).
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
• K dòng kế tiếp ghi lại mỗi dòng một test. Mỗi test bao gồm một cặp số
n, b. Hai số ược viết cách nhau một vài khoảng trống.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Kết quả ra (Output): ghi lại K dòng trong file ketqua.out, mỗi dòng ghi
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
lại bộ ba số n, k, x. Trong ó x là số ở hệ cơ số b ược chuyển ổi từ n. Ví
dự dưới ây minh họa cho file input và output của bài toán. Input.in Output.out 5 8 2 1000 8 2 32 16 20 32 16 255 16 FF 255 16 100 10 100 100 10 64 32 20 64 32
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Ví dụ 2. Hãy viết chương trình tìm số các số tự nhiên N thỏa mãn ồng thời những
iều kiện dưới ây (N 231):
• N là số có K chữ số (K 15). • N là số nguyên tố.
• Đảo ngược các chữ số của N cũng là một số nguyên tố.
• Tổng các chữ số của N cũng là một số nguyên tố.
• Mỗi chữ số của N cũng là các số nguyên tố ;
• Thời gian thực hiện chương trình không quá 1sec.
Dữ liệu vào (Input) cho bởi file data.in theo khuôn dạng:
• Dòng ầu tiên ghi lại số tự nhiên M là số lượng các test (M 100).
• M dòng kế tiếp ghi lại mỗi dòng một test. Mỗi test bao gồm một số K. Hai số
ược viết cách nhau một vài khoảng trống.
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
Kết quả ra (Output): ghi lại M dòng trong file ketqua.out, mỗi dòng ghi lại bộ hai số
Downloaded by Jiisaa Miliana (milihisa22@gmail.com) lOMoARcPSD| 37054152
số N, X. Trong ó X là số các số có N chữ số thỏa mãn yêu cầu của bài toán. Ví dự
dưới ây minh họa cho file input và output của bài toán. Input.in Output.out 5 2 0 2 3 8 3 4 15 4 5 46 5 7 359 7
Downloaded by Jiisaa Miliana (milihisa22@gmail.com)