Giáo trình Phân tích thiết kế và đánh giá thuật toán - Trường Đại học Hàng Hải

BỘ GIAO THÔNG VẬN TẢI  
TRƢỜNG ĐẠI HỌC HÀNG HẢI  
́ ́  
BỘ MÔN: KHOA HOC MAY TINH  
̣
KHOA: CÔNG NGHỆ THÔNG TIN  
BÀI GIẢNG  
PHÂN TÍCH THIẾT KẾ VÀ ĐÁNH GIÁ  
THUẬT TOÁN  
TÊN HỌC PHẦN : Phân tích thiết kế và đánh giá thuật toán  
MÃ HỌC PHẦN : 17208  
TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUY  
DÙNG CHO SV NGÀNH : CÔNG NGHỆ THÔNG TIN  
HẢI PHÕNG - 2010  
Tên học phần: Phân tich thꢃê  
Bộ môn phụ trách giảng dạy: Khoa học Máy tính  
Mã học phần: 17208  
́
t kê  
́
va đanh gꢃa thuât  
̣
toan  
Loại học phần: 2  
Khoa phụ trách: CNTT  
Tổng số TC: 3  
̀
́
́
́
́
TS tꢃết Lý thuyết Thực hành/Xemꢃna Tự học Bàꢃ tập lớn Đồ án môn học  
60 45 15  
0
0
0
Điều kiện tiên quyết:  
Sꢃnh vꢃên phảꢃ học xong các học phần sau mớꢃ đƣợc đăng ký học phần này:  
Kꢀ thuật lập trꢁnh, Câu truc dƣ lꢃêu, Toán rờꢃ rꢂc  
́
̣
́
̃
Mục tiêu của học phần:  
-
-
-
Cung cấp các kꢃến thức cơ bản vê  
Cung câp cac kꢃên thƣc vê chꢃên lƣơc  
Rèn luyện tƣ duy khoa học.  
̀
thuật toán, cấu trúc dữ lꢃệu.  
̣
xây dƣng va đanh gꢃa thuât toan  
́
́
́
̀
́
̣
̣
́
́
̀
́
́
Nội dung chủ yếu  
Gồm 4 phần:  
-
-
-
Các kꢃến thức cơ bản về thuật toán.  
Các kꢃến thức cơ bản về sắp xếp và tꢁm kꢃếm dữ lꢃệu.  
Các chꢃến lƣợc thꢃế t kê thuât toan : chꢃến lƣợc chꢃa để trị, chꢃến lƣợc quay luꢃ,  
́
̣
́
chꢃến lƣợc quꢃ hoꢂch động, chꢃến lƣợc tham lam  
̣
Kꢃên thƣc cơ ban vê đanh gꢃa đô phƣc tap thuât toan.  
́
-
́
̀
̣
̣
̉
́
́
́
́
Nội dung chi tiết của học phần:  
PHÂN PHỐI SỐ TIẾT  
TÊN CHƢƠNG MỤC  
TS LT TH/Xemina BT KT  
5
4
1
0
1
0
Chƣơng I. Các khái niệm cơ bản  
1.1. Gꢃớꢃ thꢃệu về thuật toán  
1.1.1 Kháꢃ nꢃệm về thuật toán.  
1.1.2. Các phƣơng pháp bꢃểu dꢃꢄn thuật toán  
1.1.3. Các ví dụ bꢃểu dꢃꢄn thuật toán sơ đồ khốꢃ  
1.2. Độ phức tꢂp thuật toán  
2
1
1.2.1. Các ký hꢃệu , hàm đánh gꢃá độ phức tꢂp  
thuât  
1.2.2. Các lớp thuật toán  
1.3. Môꢃ quan hê gꢃƣa câ  
thuât  
1.4. Môt  
Chƣơng II. Săp xêp va tim kiêm  
̣
toan  
́
0,5  
0,5  
́
̣
̣
́u truc dƣ lꢃêu va gꢃaꢃ  
́ ̀  
̃
̉
̃
̣
̣
số vi du  
̣
́
́
́
́
15  
7
0,5  
5
2
1
1
̀
̀
2.1. Bàꢃ toán sắp xếp  
2.1.1. Săp xêp trong  
2.1.2. Săp xêp ngoaꢃ  
2.1.3. Đanh gꢃa thuât  
́
́
́
́
̀
̣
toan să  
́
p xê  
2.2. Các thuật toán sắp xếp cơ bản  
2.2.1. Săp xêp chon (Selection Sort)  
2.2.2. Săp xêp đôꢃ chô trƣc  
2.2.3. Săp xêp chen (Insertion Sort)  
2.2.4. Săp xêp nôꢃ bot  
2.2.5. So sanh cac thuât  
́p  
́
́
́
3
2,5  
́
́
̣
̉
̃
́
́
̣
tꢃếp (Exchange Sort)  
́
́
́
́
̀
̉
̣
(Bubble Sort)  
toan săp xêp cơ ban  
̣
́
́
̉
́
́
́
i
PHÂN PHỐI SỐ TIẾT  
TÊN CHƢƠNG MỤC  
2.3. Săp xêp vun đông  
2.3.1. Câu truc Heap  
2.3.2. Thuât  
2.3.3. Thuât  
TS LT TH/Xemina BT KT  
́
́
́
2,5 1,5  
1
́
́
̣
̣
toan xây dƣn  
toan să  
̣
g câ  
p vun đống  
́u truc Heap  
́
́
́
́
p xê  
́
2.4. Tꢁm kꢃếm tuyến tính  
2.4.1. Bàꢃ toán tꢁm kꢃếm  
1
1
3
2.4.2. Thuât  
Chƣơng III. Đê  
3.1. Kháꢃ nꢃệm về đệ quy  
̣
toan tim kꢃếm tuyến tinh  
́
̀ ́  
́
̣ ̣  
qui va chiên lƣơc vet can  
̀ ́  
11  
6
1
2
1
0
̣
3.1.1. Gꢃảꢃ thuật đệ quy và thủ tục đệ quy  
3.1.2. Thꢃết kế gꢃảꢃ thuật đệ quy  
3.1.3. Hꢃệu lực của đệ quy.  
3.1.4. Đệ quy và quy nꢂp toán học.  
3.2. Chꢃê  
́
n lƣơc  
̣
vet can  
̣
(Bruteforce)  
0,5  
1
2
́
3.3. Chꢃên lƣơc  
́
̣
đê  
̣
quꢃ quay luꢃ (backtracking)  
3.3.1. Vector nghꢃêm  
̣
1
3.3.2. Thủ tục đệ quꢃ  
3.3.3. Các gꢃá trị đề cꢅ  
1
1
3.3.4. Đꢃê  
3.3.5. Môt  
Chƣơng IV. Chiên lƣơc  
4.1. Cơ sơ cua chꢃên lƣơc  
p xêp bă  
toan trôn haꢃ Run  
ng trôn  
p nhanh (Quick sort)  
n lƣơc phân hoac  
4.3.2. Quick sort  
4.4. Tꢁm kꢃếm nhị phân  
4.5. Thuât toán nhân số nguyên  
4.5.1. Thuât toan nhân tay  
4.5.2. Thuât  
4.6. Môt sô baꢃ toan khac  
Chƣơng V. Qui hoac  
5.1. Chꢃên lƣơc quꢃ hoac  
5.1.1. Các đꢃều kꢃện để áp dụng  
̀
u kꢃên  
̣
châ  
́
p nhân  
̣
0,5  
1
6
0,5  
1,5  
̉
̣
số baꢃ toan backtrackꢃng đꢃên hinh  
1
1
̀
́
̀
́
̉
chia đê tri  
̣
11  
3
1
1
̣
̉
́
̣
chꢃa đê trꢃ  
̣
̉
̉
4.2. Thuât  
4.2.1. Thuât  
4.2.2. Săp xê  
4.3. Săp xê  
4.3.1. Chꢃê  
̣
toan să  
́
́
̀
ng trôn  
̣
́
̣
̣
́
́
́
p bă  
̀
̣
́
́
1,5  
1
1
́
̣
̣
h
1
1
̣
̣
̣
́
́
̉
toan chꢃa đê trꢃ  
̣
̣
́
0,5  
6
1,5  
1
2
̀
́
́
12  
3
1
̣
h đôn  
̣
g
̣
́
̣
̣
h đôn  
g
5.1.2. Các bƣớc trong quꢃ hoꢂch động  
5.1.3. Các kꢃểu quꢃ hoꢂch động  
5.2. Bàꢃ toán dꢆy số Fꢃbonacꢃ  
1
0,5  
5.2.1. Thuât  
5.2.2. Thuât  
̣
̣
toan đê  
̣
quꢃ  
́
toan quꢃ hoach đông  
̣
̣
́
5.3. Bàꢃ toán dꢆy con chung dàꢃ nhất  
5.4. Bàꢃ toán nhân ma trận  
1
1,5  
1
4
0,5  
1
1
1
0,5  
1
1
5.5. Môt  
Chƣơng VI. Chiên lƣơc  
6.1. Nguyên tăc tham lam  
6.2. Bàꢃ toán đꢇꢃ tꢃền  
6.3. Bàꢃ toán sắp lịch các sự kꢃện  
6.3.1. Thuât toan đê quꢃ  
̣
số  
vi du  
́
̣
khac  
́
1
1
́
6
0
̣
tham lam  
́
2
1
̣
̣
́
ii  
PHÂN PHỐI SỐ TIẾT  
TÊN CHƢƠNG MỤC  
6.3.2. Thuât toan theo chꢃê  
6.4. So sanh chꢃê  
TS LT TH/Xemina BT KT  
̣
́
n lƣơc  
̣
tham lam  
n lƣơc  
́
́
n lƣơc  
̣
tham lam vơꢃ chꢃê  
́
̣
0,5  
1
́
́
̣ ̣  
quꢃ hoach đông  
Nhiệm vụ của sinh viên :  
Tham dự các buꢇꢃ thuyết trꢁnh của gꢃáo vꢃên, tự học, tự làm bàꢃ tập do gꢃáo vꢃên gꢃao,  
tham dự các bàꢃ kꢃểm tra định kỳ và cuốꢃ kỳ.  
Tài liệu học tập :  
Nguyꢄn Hữu Đꢃển, Giáo trình một số vấn đề về thuật toán, NXB Gꢃáo dục,  
-
2003  
-
Đꢃnh Mꢂnh Tƣờng. Cấu trúc dữ liệu và thuật toán. NXB Đꢂꢃ học Quốc gꢃa Hà  
nộꢃ. 2002.  
-
Nguyꢄn Quốc Lƣợng, Hoàng Đức Hảꢃ. Cấu trúc dữ liệu + giải thuật = chương  
trình. NXB Gꢃáo dục. 1996  
-
Richard Neapolitan và Kumarss Naimipour, Foundations of Algorithms Using  
C++ Pseudocode, Third Edition, Jones and Bartlett Publishers, 2004.  
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein,  
-
Introduction to Algorithms, Second Edition, MIT Press, 2001.  
Hình thức và tiêu chuẩn đánh giá sinh viên:  
-
-
Hꢁnh thức thꢃ cuốꢃ kỳ : Thꢃ vấn đáp.  
Sꢃnh vꢃên phảꢃ đảm bảo các đꢃều kꢃện theo Quy chế của Nhà trƣờng và của Bộ  
Thang điểm: Thang điểm chữ A, B, C, D, F  
Điểm đánh giá học phần: Z = 0,3X + 0,7Y.  
Bàꢃ gꢃảng này là tàꢃ lꢃệu chính thức và thống nhất của Bộ môn Khoa học Máy tính,  
Khoa Công nghệ Thông tꢃn và đƣợc dùng để gꢃảng dꢂy cho sinh viên.  
Ngày phê duyệt:  
/
/20  
Trƣởng Bộ môn: ThS. Nguyễn Hữu Tuân (ký và ghi rõ họ tên)  
iii  
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
MỤC LỤC  
iv  
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
v
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
LỜI NÓI ĐẦU  
Câu truc dƣ lꢃêu  
vơꢃ nhau va la môt  
́
̣
va các chꢃến lƣợc thꢃết kế thuật toán là các lꢋnh vực nghꢃên cứu gắn lꢃền  
̀
trong nhƣng linh vƣc nghꢃên cƣu lâu đơꢃ cua khoa hoc may tinh . Hầu hết  
̣ ̣  
̃
̉
́ ̀ ́  
̃
́
́
̃
̣
́
̀
̀
các chƣơng trꢁnh đƣợc vꢃết ra , chꢂy trên máy tính , dù lớn hay nhꢐ, dù đơn gꢃản hay phức tꢂp ,  
đều phảꢃ sꢅ dụng các cấu trúc dữ lꢃệu tuân theo các trꢁnh tự , cách thức làm vꢃệc nào đꢑ, chính  
̉
̣ ̣  
hꢃêu bꢃết về cac thuât toan và các chꢃên lƣợc xây dựng thuật toán cho  
́ ́  
là các gꢃảꢃ thuật . Vꢃêc  
phꢒp các lập trꢁnh vꢃên, các nha khoa hoc  
̣
may tinh co nê  
̀
n tang ly thuyê  
́
t vƣng chă  
́
c , cꢑ nhꢃều  
. Vꢁ vậy vꢃệc học tập  
̣
g.  
̉
̃
̀
́
́
́
́
lƣa  
̣
chon  
̣
hơn trong vꢃêc  
̣ ̣  
đƣa ra cac gꢃaꢃ phap cho cac baꢃ toan thƣc ́  
̉
́ ́ ́ ̀ ́  
tê  
môn hoc  
̣
Phân tich thꢃêt kê  
́
́
va danh gꢃa gꢃaꢃ thuât  
̣
là một đꢃê  
̀
u quan tron  
̉
̀
́
́
́
Tàꢃ lꢃệu này dựa trên những kꢃnh nghꢃệm và nghꢃên cứu mà tác gꢃả đꢆ đúc rút , thu thập  
trong quá trꢁnh gꢃảng dꢂy môn học Câu truc dƣ lꢃêu va gꢃaꢃ thuât tꢂꢃ khoa Công nghệ Thông  
tin, Đꢂꢃ học Hàng hảꢃ Vꢃệt nam , cùng vớꢃ sự tham khả o cua cac taꢃ lꢃêu cua cac đông nghꢃêp  
n Wꢃkꢃpedꢃa . Vớꢃ bây chƣơng đƣợc chꢃa  
cơ ban cho tớꢃ thuât toan săp xêp , tꢁm kꢃếm, các  
g, tham lam … hy vọng sẽ  
́
̣
̣
́
̃
̀
̉
̣
̀
̣
,
̉
̉
́
̀
́
̉
̉
̣
các tác gꢃả trong và ngoàꢃ nƣớc , tƣ đꢃên trƣc tuyế  
̀
thành các chủ đề khác nhau từ cac khaꢃ nꢃêm  
̣
̣
́
́
̉
́
́
́
̣ ̣ ̣ ̣ ̣  
chꢃến lƣơc thꢃết kế thuât toan nhƣ đê quꢃ , quay lui, quꢃ hoach đôn  
́
cung cấp cho các em sꢃnh vꢃên , các bꢂn độc gꢃả một tàꢃ lꢃệu bꢇ ích . Mꢊc dù đꢆ rất cố gắng  
song vẫn không tránh khꢐꢃ một số thꢃếu sꢑt, hy vọng sẽ đƣợc các bꢂn bè đồng nghꢃệp, các em  
sinh viên, các bꢂn độc gꢃả gꢑp ý chân thành để tôꢃ cꢑ thể hoàn thꢃện hơn nữa tàꢃ lꢃệu này.  
Xꢃn gꢅꢃ lờꢃ cảm ơn chân thành tớꢃ các bꢂn bè đồng nghꢃệp và Ban chủ nhꢃệm khoa  
Công nghệ Thông tꢃn đꢆ tꢂo đꢃều kꢃện gꢃúp đỡ để tàꢃ lꢃệu này cꢑ thể hoàn thành.  
Hải phòng, tháng 04 năm 2010  
Tác giả  
̃
Nguyên Hƣu Tuân  
̃
1
 
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
CHƢƠNG I: CÁC KHÁI NIỆM CƠ BẢN  
1. Thuât  
1.1. Đinh nghia thuât  
Cꢑ rất nhꢃều các định nghꢋa cꢓng nhƣ cách phát bꢃểu khác nhau về định nghꢋa của thuật  
̣
toan (giải thuật) - Algorithm  
́
̣
̣
toan  
́
̃
̉
toán. Theo nhƣ cuô  
́
n sach gꢃao khoa nôꢃ tꢃê  
́
ng vꢃê  
́
t vê  
̀
thuât  
̣
toan  
là “Introduction to  
́
́
́
Algorithms” (Second Edꢃtꢃon cua Thomas H . Cormen, Charles E . Leiserson, Ronald L .  
̉
Rꢃvest va Clꢃfford Steꢃn ) thꢁ thuật toán đƣợc định nghꢋa nhƣ sau : “môt  
̣
thuât  
̣ ̣  
p cac gꢃa trꢃ goꢃ la ꢃnput va  
̀ ̀  
̣ ̣  
toan la môt thu  
̉
́ ̀  
̀
tục tính toán xác định (well-defined) nhân  
̣
cac gꢃa trꢃ  
̣
̣
môt  
̣
tâ  
̣
́
́
́
́
sꢃnh ra ra môt vaꢃ gꢃa trꢃ hoăc môt tâp gꢃa trꢃ  
̣
̣
̣
̣
̣
̣
̣ ̣  
goꢃ  
̀
̀
́
́
̉
̀
̀
̀
̉
môt  
̣
công vꢃêc  
̣
cu  
̣
thê xac đꢃn  
̣
h (well-defined) nào đꢑ. Vꢁ thế một đoꢂn mꢆ chƣơng trꢁnh tính  
́
các phần tꢅ của dꢆy số Fꢃbonacꢃ là một càꢃ đꢊt của một thuật toán cụ thể . Thâm  
̣
chi môt ham  
̣
̀
́
̉
̣ ̣ ̣ ̣  
đơn gꢃan đê công haꢃ số cung la môt thuât toan hoan chinh , măc dù đꢑ là một thuật toán đơn  
̃
̀ ́ ̀  
̉
̉
gꢃản.  
1.2. Đꢀc trƣng của thuật toán  
Tính đúng đắn : Thuât toan cân phaꢃ đam bao cho môt  
ꢃ vơꢃ cac bô dƣ lꢃêu đâu vao . Đây co thê noꢃ la đăc  
̣
̀
̣
kê  
́
t qua đung sau khꢃ thƣc  
̣
hꢃên  
̣
̉
̉
̉
̉
́
́
̉
đô  
́
̣
̣
̀
̣
trƣng quan tron  
̣
g nhâ  
́
t đô  
́
ꢃ vơꢃ môt thuât  
̣
̣
́
́
̃
̀
́
́
̀
́
toán.  
Tính dừng: thuât  
̣ ̣ ̣  
toan cần phaꢃ đam bao se dƣng sau môt số hƣu han bƣơc.  
̉ ̉ ̉  
̃ ̃  
́ ̀ ́  
Tính xác định: Các bƣớc của thuật toán phảꢃ đƣợc phát bꢃểu rꢔ ràng , cụ thể, tránh gây  
̃
đô  
̉
̣
́ꢃ vơꢃ ngƣơꢃ đoc va hꢃêu, càꢃ đꢊt thuật toán.  
́ ̀ ̀  
nhâp  
̣
nhă  
Tính hꢃệu quả: thuât  
quả bàꢃ toán đꢊt ra trong thờꢃ gꢃan hoꢊc các đꢃều kꢃện cho phꢒp trên thực tế đáp ứn g đƣơc  
câu cua ngƣơꢃ dung.  
̀
ng hoăc  
̣
nhâ  
̀
m lân  
̣
toan đƣơc  
̣
xem la hꢃêu  
̣
qua nê  
́
u nhƣ no co kha năng gꢃaꢃ quyê  
́
t hꢃêu  
̣
̉
̉
̉
́
̀
́
́
̣
yêu  
̀
̉
̀
̀
̉ ̉  
̣ ̣ ̣  
toan đƣơc goꢃ la co tinh phố quat (phô bꢃến) nếu no co thê gꢃaꢃ  
̉
́ ̀ ́ ́ ́ ́  
́
Tính phꢇ quát : thuât  
quyê  
́
t đƣơc môt lơp cac baꢃ toan tƣơng tƣ.  
̣
̣
̣
́
́
̀
́
Ngoàꢃ ra mꢕꢃ thuật toán theo định nghꢋa đều nhận các gꢃá trị đầu vào đƣợc gọꢃ chung là  
̉
̣ ̣ ̣  
́t qua cua thuât toan (thƣơng la môt kết qua cu thê nao đo tuy theo  
̉ ̉ ̉  
́ ̀ ̀ ̀ ́ ̀  
các gꢃá trị dữ lꢃệu Input. Kê  
các bàꢃ toán và thuật toán cụ thể) đƣơc  
̣
̣
goꢃ la Output.  
̀
̉
̃
2. Biêu diên thuât toan  
̣
́
Thƣờng có hai cách biểu diꢄn một thuật toán, cách thứ nhất là mô tả các bƣớc thực hiện  
của thuật toán, cách thứ hai là sꢅ dụng sơ đồ giải thuật.  
2.1. Mô tả các bƣớc thực hiện  
Để biểu diꢄn thuật toán ngƣời ta mô tả chính xác các bƣớc thực hiện của thuật toán,  
ngôn ngữ dùng để mô tả thuật toán có thể là ngôn ngữ tự nhiên hoꢊc một ngôn ngữ lai ghép  
giữa ngôn ngữ tự nhiên với một ngôn ngữ lập trꢁnh nào đꢑ gọꢃ là các đoꢂn giả mã lệnh.  
2
           
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
Ví dụ: mô tả thuật toán tꢁm ƣớc số chung lớn nhất của hai số nguyên.  
Input: Hai số nguyên a, b.  
Output: Ƣớc số chung lớn nhất của a, b.  
Thuật toán:  
Bƣơc 1: Nê  
́
u a=b thì USCLN(a, b)=a.  
́
Bƣơc 2: Nêu a > b thì tìm USCLN của a-b và b, quay lꢂi bƣơc 1;  
́
́
́
Bƣơc 3: Nếu a < b thì tìm USCLN của a và b-a, quay lꢂi bƣơc 1;  
́
́
̀
2.2. Sử dụng sơ đô (lƣu đồ) giải thuật (flowchart)  
̉ ̉ ̉  
̃
̣ ̣ ̣ ̣  
trong nhƣng cach phô bꢃến đê bꢃêu dꢃên thuât toan la sƣ dung sơ đồ thuât toan  
̃
́ ́ ̀ ́  
̉
Môt  
(Algorithm Flowchart).  
̉
̣ ̣ ̣ ̣  
g cac ky hꢃêu hinh khốꢃ cơ ban đê tao thanh môt mô ta mang  
̉ ̉  
́ ́ ̀  
̀
Sơ đô thuât toan sƣ dun  
tính hꢁnh thức (cách này rꢔ ràng hơn so vớꢃ vꢃệc mô tả các bƣớc thực hꢃện thuật toán  
thuât toan. Chúng ta cꢑ thể hꢁnh dung vꢃệc sꢅ dụng sơ đồ gꢃảꢃ thuật để mô tả thuật toán gꢃống  
nhƣ dung cac ban ve đê mô ta câ  
̀
̣
̉
́
) của  
̣
́
̉
́
u truc cua cac toa nha.  
̉
̃
̉
̉
̀
́
́
́
̀
̀
Các khốꢃ cơ bản của một sơ đồ thuật toán  
Bắt đầu  
1
Câu lệnh  
3
4
Đꢃều kiện  
Đ
Kết thúc  
2
S
5
Nhập xuất dữ liệu  
́
Khôi 1: Khô  
́
ꢃ bă  
ꢃ kêt thuc thuât  
Khối 3: Thƣc hꢃên  
̣
đƣơng ra;  
́t đầu thuât toan, chꢖ cꢑ duy nhất một đƣờng ra;  
̣
́
́
Khôi 2: Khô  
́
́
̣
toan, cꢑ thể cꢑ nhꢃều đƣờng vào;  
́
́
̣
̣ ̣  
câu lệnh (cꢑ thể là một hoꢊc nhꢃều câu lệnh); gồm môt đƣơng vao va  
̀ ̀ ̀  
môt  
̀
̉
̉
̉
Khối 4: Rẽ nhánh, kꢃêm tra bꢃêu thƣc đꢃều kiện (bꢃêu thƣc Boolean), nếu bꢃểu thức đung  
́
́
́
̣ ̣  
thuât toan se đꢃ theo nhanh Đúng (True), nếu bꢃểu thức saꢃ thuât toan se đꢃ theo nhanh Saꢃ  
́ ́ ́ ́  
̃ ̃  
(False).  
3
 
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
́
Khôi 5: Các câu lệnh nhập và xuất dữ lꢃệu.  
3. Độ phức tạp thuật toán – Algorithm Complexity  
3.1. Các tiêu chí đánh giá thuật toán  
Thông thƣờng để đánh gꢃá mức độ tốt, xấu và so sánh các thuật toán cùng loꢂi, có thể  
̉
dựa trên haꢃ tꢃêu chuân:  
+ Thuât toan đơn gꢃan, dê  
+ Dựa vào thời gian thực hiện và tài nguyên mà thuật toán sꢅ dụng để thực hiện trên các  
bộ dữ liệu.  
̣
̣
hꢃêu, dê caꢃ đăt.  
̃ ̃  
̉
̀
̉
́
Trên thực tế các thuật toán hiệu quả thì không dꢄ hiểu, các càꢃ đꢊt hiệu quả cꢓng không  
dꢄ dàng thực hiện và hiểu đƣợc một cách nhanh chóng. Và một đꢃều có vẻ nghịch lý là các  
thuật toán càng hiệu quả thì càng khó hiểu, càꢃ đꢊt càng phức tꢂp lꢂi càng hiệu quả (không  
phảꢃ lúc nào cꢓng đúng). Vꢁ thế để đánh giá và so sánh các thuật toán ngƣờꢃ ta thƣờng dựa  
trên độ phức tꢂp về thời gian thực hiện của thuật toán, gọꢃ là độ phức tꢂp thuật toán  
(algorithm complexity). Về bản chất độ phức tꢂp thuật toán là một hàm ƣớc lƣợng (có thể  
không chính xác) số phép tính mà thuật toán cần thực hiện (từ đꢑ dꢄ dàng suy ra thời gian  
thực hiện của thuật toán) đối với một bộ dữ liệu ꢃnput cꢑ kích thƣớc N. N có thể là số phần tꢅ  
của mảng trong trƣờng hợp bài toán sắp xếp hoꢊc tìm kiếm, hoꢊc có thể là độ lớn của số trong  
bài toán kiểm tra số nguyên tố chẳng hꢂn.  
̣ ̣ ̣  
3.2. Đanh gia thơi gian thƣc hiên thuât toán  
́
́
̀
Để minh họa việc đánh gꢃá độ phức tꢂp thuật toán ta xem xét ví dụ về thuật toán sắp xếp  
chọn (selection sort) và sắp xếp đꢇi chꢕ trực tiếp (exchange sort) nhƣ sau:  
Cài đꢊt của thuật toán sắp xếp chọn:  
for(i=0;i<n;i++)  
{
min_idx = i;  
for(j=i+1;j<n;j++)  
if(a[j]<a[min_idx])  
min_idx = j;  
if(min_idx!=i)  
{
temp = a[i];  
a[i] = a[min_idx];  
a[min_idx] = temp;  
}
4
     
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
}
Số phép tính thuật toán cần thực hiện đƣợc tính nhƣ sau:  
(N-1) + (N-2) + … + 2 + 1 = N*(N-1)/2.  
Phân tích chi tiết hơn thꢁ N*(N-1)/2 là số phép toán so sánh cần thực hiện, còn số lần  
thực hiện đꢇi chꢕ hai phần tꢅ (số nguyên) tốꢃ đa của thuật toán là N.  
Càꢃ đꢊt của thuật toán sắp xếp đꢇi chꢕ trực tiếp:  
for(i=0;i<n;i++)  
for(j=i+1;j<n;j++)  
if(a[j] < a[i])  
{
temp = a[i];  
a[i] = a[j];  
a[j] = temp;  
}
̣ ̣  
Tƣơng tự đối với thuật toán sắp xếp chọn ta có số phep toan thƣc hꢃên la: (N-1) + (N-2)  
́ ́ ̀  
+ …+2 +1 = N*(N-1)/2. Chi tiết hơn, N*(N-1)/2 là số lần so sánh thuật toán thực hiện, và  
cꢓng là số lần đꢇi chꢕ hai phần tꢅ (hai số nguyên) tốꢃ đa của thuật toán.  
Trong trƣờng hợp trung bình, thuật toán sắp xếp chọn cꢑ xu hƣớng tốt hơn so với sắp  
xếp đꢇi chꢕ trực tiếp vì số thao tác đꢇi chꢕ ít hơn, còn trong trƣờng hợp tốt nhất thꢁ nhƣ nhau,  
trƣờng hợp tồi nhất thì chắc chắn thuật toan sắp xếp chọn tốt hơn, do đꢑ cꢑ thể kết luận thuật  
́
toán sắp xếp chọn nhanh hơn so với thuật toán sắp xếp đꢇi chꢕ trực tiếp.  
3.3. Các đꢁnh nghꢂa hình thức về độ phức tạp thuật toán  
Gọꢃ f, g la cac ham không gꢃam đꢃn  
̣
h nghia trên tâp  
̣
cac sô  
́
nguyên dƣơng . (chú ý là tất  
cả các hàm thờꢃ gꢃan đều thꢐa mꢆn các đꢃều kꢃện này ). Chúng ta nꢑꢃ rꢗng hàm f(N) là O(g(N))  
(đoc la: f la O lơn cua g) nêu nhƣ tôn taꢃ môt hăng sô c va N0:  
̉
̀
́
̀
́
̃
̣
́
̀
̣
̣
̀
́
̉
̀
̀
́
̀
N N0; f (N) c.g(N)  
Phát bꢃểu thành lờꢃ nhƣ sau : f(N) là O(g(N)) nê  
́
̣ ̣  
u tồn taꢃ c sao cho hầu hết phần đồ thꢃ  
của hàm f nꢗm dƣớꢃ phần đồ thị của hàm c *g. Chú ý là hàm f tăng nhꢃều nhất là nhanh b ꢗng  
hàm c*g.  
Thay vi noꢃ f (N) là O(g(N)) chúng ta thƣờng vꢃết là f (N) = O(g(N)). Chú ý rꢗng đẳng  
́
̀
thƣc nay không co tinh đô  
́
ꢃ xƣng co nghia la chung ta co thê  
́
vꢃê  
́
t ngƣơc  
̣
laꢃ  
̣
O(g(N)) = f(N)  
́
̀
́
́
́
̀
́
́
́
̃
̉
nhƣng không thê suy ra g(N) = O(f(N)).  
Định nghꢋa trên đƣợc gọꢃ là ký hꢃệu O lớn (big-O notation) và thƣờng đƣợc sꢅ dụng để  
chꢖ định các chꢊn trên của hàm tăng.  
5
 
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
̣ ̣ ̣  
Chăng han đốꢃ vơꢃ vi du về sắp xếp bằng chon  
ta cꢑ f(N) = N*(N-1)/2 = 0.5N2 – 0.5N  
́
́
̉
chúng ta cꢑ thể vꢃết là f(N) = O(N2). Cꢑ nghꢋa là hàm f không tăng nhanh hơn ham N2.  
̀
Chú ý rꢗng thậm chí hàm f chính xác cꢑ công thức nhƣ thế nào không cho chúng ta câu  
̣ ̣  
trả lờꢃ chính xác của câu hꢐꢃ “Chƣơng trꢁnh cꢑ thơꢃ gꢃan thƣc hꢃên la bao lâu trên may tinh cua  
̉
̀ ́  
́
̀
tôi?”. Nhƣng đꢃê  
toán là hàm bậc haꢃ . Nê  
chƣơng trinh se tăng lên xâ  
̀
u quan tron  
̣
g la qua đo chung ta bꢃê  
́
t đƣơc  
̣
ham thơꢃ gꢃan thƣc  
̣
hꢃên  
̣
cua thuât  
̣
̉
̀
́
́
̀
̀
́
u chung ta tăng kich thƣơc ꢃnput lên 2 lâ  
̀
n, thơꢃ gꢃan thƣc  
̣
̣
hꢃê n cua  
̉
́
́
̀
́
́
p xi 4 lâ  
̀
n không phu  
̣
thuôc  
̣
vao tô  
́
c đô  
̣
cua may.  
̉
́
̃
̀
̉
̀
Chăn  
̣
trên f(N) = O(N2) cho chung ta kê  
́
t qua gâ  
̀
n nhƣ thê  
́
– nꢑ đảm bảo rꢗng độ tăng của  
̉
́
hàm thờꢃ gꢃan nhꢃều nhất là bậc haꢃ.  
̉
Do đo chung ta se sƣ dun  
̣
g ky phap O lơn đê mô ta thơꢃ gꢃan thƣc  
̣
hꢃên  
(và đôꢃ khꢃ cả bộ nhớ mà thuật toán sꢅ dụng). Đốꢃ vớꢃ thuật toán trong ví dụ 2 chúng ta cꢑ thể  
nꢑꢃ “độ phức tꢂp thờꢃ gꢃan của thuật toán là O(N2) hoăc n gọn là “thuật toán là O(N2)”.  
ngă  
̣ ̣  
cua thuât toan  
̉
́
́
́
̃
̉
́
́
́
̉
̀
̣
́
Tƣơng tƣ chung ta co cac đꢃnh nghia (omega)và (theta):  
Chúng ta nꢑꢃ rꢗng hàm f(N) là (g(N)) nêu nhƣ g(N) = O(f(N)), hay nꢑꢃ cách khác hàm  
f tăng it nhât la nhanh băng ham g.  
̣
̣
́
́
́
̃
́
́
̀
̀
̀
́
Và nꢑꢃ rꢗng hàm f (N) là  
(g(N)) nếu nhƣ f (N) = O(g(N)) và g(N) = O(f(N)), hay noꢃ  
́
cách khác cả haꢃ hàm xấp xꢖ nhƣ nhau về độ tăng.  
̉
Hꢃên nhꢃên la cach vꢃê  
́
t
là để chꢖ ra chꢊn dƣớꢃ và  
của một hàm. Còn cꢑ nhꢃều gꢃớꢃ hꢂn khác nữa nhƣng đây là các gꢃớꢃ hꢂn mà chúng ta hay gꢊp  
nhât.  
là để chꢖ ra một gꢃớꢃ hꢂn chꢊt chẽ  
̀
́
́
̣ ̣  
Môt vai vi du:  
̀
́
0.5N2 – 0.5N = O(N2)  
47 N*log(N) = O(N*log(N))  
N*log(N) + 1000047N =  
Tât ca cac ham đa thƣc bâc  
Độ phức tꢂp thờꢃ gꢃan c ủa thuật toán sắp xếp chọn và sắp xếp đꢇꢃ chꢕ  
(N2)  
Nêu môt thuât  
̣
Môꢃ thuât toan sắp xếp dƣa trên so sanh cꢑ độ phức tꢂp tốꢃ ƣu là  
́
(N*log(N))  
́
̣
k đê  
̀
u la O(Nk)  
̉
́
̀
́
̀
̣
trƣc tꢃếp là  
́
̣
̣
toan la O(N2) thꢁ nꢑ cꢓng là O(N5)  
́ ̀  
̃
̣
́
(N*log(N))  
Thuât  
̣
toan să  
́
p xê  
́
p MergeSort co sô  
́
thao tac so sanh la N *log(N). Do  
́
́
́
́
̀
đo đô  
̣
phƣc tap  
̣
thơꢃ gꢃan cua MergeSort la  
(N*log(N)) cꢑ nghꢋa là MergeSort là  
̉
́
́
̀
̀
̣ ̣ ̣  
tꢃêm cân vơꢃ thuât toan sắp xếp tốꢃ ƣu.  
́ ́  
Khꢃ xem xet so sánh các thuật toán cùng loꢂꢃ ngƣờꢃ ta thƣờng xꢒt độ phức tꢂp của thuật  
́
toán trong các trƣờng hợp: trung binh (average case), trƣơng hơp  
̣
xâ  
́
u nhâ  
́
t (the worst case) và  
̀
̀
̣
trƣơng hơp tốt nhất (the best case).  
̀
6
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
3.4. Các lớp thuật toán  
Khꢃ chung ta noꢃ vê đô phƣc tap  
dụng các ký hꢃệu hꢁnh thức  
f(N) = (N) chúng ta sẽ nꢑꢃ thuật toán là tuyến tính (linear). Cꢑ thể tham khảo thêm:  
f(N) = 1: hăng sô (constant)  
(log(N)): logarit  
(N): tuyên tinh (linear)  
(N*log(N)): N log N  
̀
̣
̣
thơꢃ gꢃan/ không gꢃan nhơ cua môt  
̣
thuât  
̣
toan thay vi sƣ  
̉
̉
́
́
́
̀
́
́
̀
(f(n)) chúng ta cꢑ thể đơn gꢃản đề cập tớꢃ lớp của hàm f . Ví dụ  
̀
́
f(N) =  
f(N) =  
f(N) =  
f(N) =  
f(N) =  
́
́
(N2): bâc  
(N3): bâc  
̣
haꢃ (quadratic)  
̣
3 (cubic)  
f(N) = O(Nk) vơꢃ k la môt  
̣
sô  
(bN): hàm mꢓ (exponential)  
Đốꢃ vớꢃ các bàꢃ toán đồ thị độ phức tꢂp  
thƣơc cua đô thꢃ”  
Xác định thờꢃ gꢃan thực hꢃện từ một gꢃớꢃ hꢂn tꢃệm cận  
Đốꢃ vớꢃ hầu hết các thuật toán chúng ta cꢑ thể gꢊp các hꢗng số bị che đꢃ bởꢃ cách vꢃết O  
b thƣơng la kha nho . Chăng han nêu đô phƣc tap thuât toan la  
(N2) thꢁ chúng ta sẽ  
thơꢃ gꢃan la 10N2 chƣ không phaꢃ la 107N2.  
́ nguyên dƣơng: đa thƣc (polynomial)  
́
̀
́
f(N) =  
(V+E) cꢑ nghꢋa là “tuyến tính đốꢃ vớꢃ kích  
̀
̣
.
̉
́
hoăc  
̣
̣
́
̣
̣
̣
̀
̉
̀
̀
́
́
́
mong muô  
́
̣ ̣  
n chinh xac đô phƣc tap  
́ ́  
́
̉
̀
̀
́
̀
Cꢑ nghꢋa là nếu hꢗng số là lớn thꢁ thƣờng là theo một cách nào đꢑ lꢃên quan tớꢃ một vàꢃ  
ng sô cua baꢃ toan. Trong trƣơng hơp nay tôt nhât l à gán cho hꢗng đꢑ một cáꢃ tên và đƣa nꢑ  
vào ký hꢃệu tꢃệm cận của hꢗng số đꢑ.  
hă  
̀
́
̣
́
́
̉
̀
́
̀
̀
Ví dụ: bàꢃ toán đếm số lần xuất hꢃện của mꢕꢃ ký tự trong một xâu cꢑ N ký tự . Môt  
̣
thuât  
̣
̉
toán cơ bản là duyệt qua toàn bộ xâu đốꢃ vớꢃ mꢕ ꢃ ky tƣ  
̣
đê thƣc  
̣
hꢃên  
u nhâ  
ꢃ vơꢃ N . Nhƣng se la tô  
̣
đê  
́
m xem ky tƣ  
̣
đo xuâ  
́t  
́
́
́
hꢃên  
̣
bao nhꢃêu lâ  
̀
n . Kích thƣớc của bảng chữ cáꢃ là cố định (nhꢃê  
̀
́t la 255 đốꢃ vơꢃ ngôn  
̀ ́  
ngƣ lâp  
̣
trinh C ) do đo thuât  
̣
toan la tuyê  
́
n tinh đô  
́
́
t hơn nê  
́
u vꢃê  
́t la đô  
̣
̀
̃
́
́
̀
́
̃
̀
̀
́
phƣc tap  
̣
cua thuât  
̣
toan la  
(S*N) trong đo S la sô  
́
phâ  
̀
n tƣ cua bang chƣ caꢃ sƣ dun  
̣
g . (Chú ý  
̉
̉
̉
̉
̃
̉
́
́
̀
́
̀
́
là cꢑ một thuật toán tốt hơn để gꢃảꢃ bàꢃ toán này vớꢃ độ phức tꢂp là  
Trong các cuôc thꢃ lâp trinh môt thuât toan thƣc hꢃên 1000000000 phꢒp nhân cꢑ thể  
không thoa man rang buôc thơꢃ gꢃan. Chúng ta cꢑ thể tham khảo bảng sau để bꢃết thêm:  
(S + N).  
̣
̣
̣
̣
̣
̣
́
̀
̣
̉
̃
̀
̀
Độ phức tạp  
Giá trꢁ N lớn nhất  
100 000 000  
40 000 000  
10 000  
(N)  
(N log N)  
(N2)  
500  
(N3)  
7
 
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
90  
20  
11  
(N4)  
(2N)  
(N!)  
Thơi gian thƣc  
̣
hiên  
̣
cua cac thuât  
̣
toan co đô  
̣
phƣc tap  
̣
khac nhau  
̀
̉
́
́
́
́
́
O(Log(N))  
10-7 giây  
O(N)  
10-6 giây  
10-5 giây  
10-4 giây  
3 phút  
O(N*Log(N))  
O(N2)  
O(N6)  
O(2N)  
1014 năm  
10142 năm  
O(N!)  
̣
Chꢃ ý về phân tich thuât toan.  
́
́
̉
̣ ̣  
́t đê noꢃ về đô phƣc tap  
́ ́  
Thông thƣơng khꢃ chung ta trinh bay môt  
̣
thuât  
. Tuy nhꢃên trên thƣc  
big-O – các kꢃểu khác không cꢑ nhꢃều gꢃá trị lắm , vꢁ cách này rất dꢄ gꢔ và cꢓng đƣợc nhꢃều  
̣
toan cach tô  
́
t nhâ  
̀
́
̀
́
́
̀
thơꢃ gꢃan cua no la sƣ dun  
̣
g cac chăn  
̣
̣
tế chung ta hay dung ky phap  
̉
̉
̀
́
̀
́
́
̀
́
́
̉
̣
́n va hꢃêu ro hơn . Nhƣng đƣng quên la bꢃg-O la chăn trên va thƣơng thi chung ta  
̀ ̀ ̀ ̀ ̀ ̀ ́  
̃
̀
ngƣơꢃ bꢃê  
́
t đê  
̀
sẽ tꢁm môt chꢊn trên càng nhꢐ càng tô  
́
t.  
Ví dụ: Cho môt mang đa đƣơc sắp A . Hꢆy xác định xem trong mảng A cꢑ haꢃ phần tꢅ  
̣
̣
̉
̃
nào mà hꢃệu của chúng bꢗng D hay không. Hꢆy xem đoꢂn mꢆ chƣơng trꢁnh sau:  
int j=0;  
for (int i=0; i<N; i++)  
{
while ( (j<N-1) && (A[i]-A[j] > D) )  
j++;  
if (A[i]-A[j] == D)  
return 1;  
}
̉
Râ  
n, môꢃ lâ  
thuật toán là O(N) vꢁ trong cả thờꢃ gꢃan thực hꢃện của thuật toán lệnh tăng j không chꢂy nhꢃều  
hơn N lân.  
́
t dê  
̃
đê noꢃ ră  
̀
ng thuât  
̣
toan trên la O(N2): vòng lꢊp whꢃle bên trong đƣợc gọꢃ đến N  
́ ̀  
́
lầ  
̃
̀
n tăng j lên tô  
́
ꢃ đa N lâ  
̣
̀n . Nhƣng môt phân tich tốt hơn se cho chung ta thấy rằng  
̃
́
́
̀
8
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
Nê  
́
u chung ta noꢃ ră  
̀
ng thuât  
̣
toan la O(N2) chúng ta vẫn đúng nhƣng nếu nꢑꢃ là thuật  
́
́
́
̀
̣ ̣  
toán là O(N) thꢁ chúng ta đꢆ đƣa ra đƣơc thông tꢃn chinh xac hơn về thuât toan.  
́ ́  
́
́
4. Câu truc dƣ liêu  
̣
– Data structure  
́
̃
Niklaus Wirth, một lập trình viên và nhà khoa học máy tính, ngƣời phát minh ra ngôn  
ngữ lập trꢁnh Pascal đꢆ từng nói một câu nói nꢇi tiếng trong lꢋnh vực lập trꢁnh: Chƣơng trꢁnh  
(Programs) = Cấu trúc dữ liệu (Data Structures) + Giải thuật (Algorithms). Câu nói này nói  
lên bản chất của việc lập trꢁnh là đꢃ tꢁm một cấu trúc dữ liệu phù hợp để biểu diꢄn dữ liệu của  
bài toán và từ đꢑ xây dựng giải thuật phù hợp với cấu trúc dữ liệu đꢆ chọn. Ngày nay với sự  
phát triển của các kꢀ thuật lập trình, câu nói của Wirth không hẳn còn đúng tuyệt đối nữa  
nhƣng nꢑ vẫn phản ánh sự gắn kết và tầm quan trọng của các cấu trúc dữ liệu và giải thuật.  
Cấu trúc dữ liệu đƣợc sꢅ dụng để biểu diꢄn dữ liệu còn các giải thuật đƣợc sꢅ dụng để thực  
hiện các thao tác trên các dữ liệu của bài toán nhꢗm hoàn thành các chức năng của chƣơng  
trình  
5. Các chiến lƣꢄc thiết kế thuật toán.  
̉
Không co môt  
̣
phƣơng phap nao co thê gꢃup chung ta xây dƣn  
̣
g
(thꢃết kế) nên cac thuâ  
̣
́
́
́
̀
́
́
́
toán cho tất cả các loꢂꢃ bàꢃ toán . Các nhà khoa h ọc máy tính đꢆ nghꢃên cƣu va đƣa ra cac  
́
̀
́
chꢃê  
́
n lƣơc  
5.1. Duyệt toàn bộ (Exhausted search)  
Chꢃến lƣợc duyệt toàn bộ là chꢃến lƣợc mà mꢕꢃ lập trꢁnh vꢃên phảꢃ nghꢋ đến đầu tꢃên khꢃ  
̣ ̣ ̣ ̣  
thꢃết kế cac gꢃaꢃ thuât chung nhất ap dung cho cac loaꢃ baꢃ toan khac nhau.  
̉
́ ́ ́ ̀ ́ ́  
gꢃảꢃ quyết bất cứ bàꢃ toán nào. Trong phƣơng pháp duyệt toàn bộ, chúng ta sẽ xem xꢒt tất cả  
các ứng cꢅ vꢃên thuộc một không gꢃan cꢑ thể cꢑ của bàꢃ toán để xem đꢑ cꢑ phảꢃ là nghꢃệm của  
bàꢃ toán hay không. Phƣơng pháp này yêu cầu cꢑ một hàm kꢃểm tra xem một ứng cꢅ vꢃên nào  
đꢑ cꢑ phảꢃ là nghꢃệm của bàꢃ toán hay không. Mꢊc dù dꢄ hꢃểu song phƣơng pháp này không  
phảꢃ là dꢄ thực hꢃện, và đꢊc bꢃệt là không hꢃệu quả đốꢃ vớꢃ các bàꢃ toán mà kích thƣớc ꢃnput  
lớn. Cꢑ nhꢃều phƣơng pháp cảꢃ tꢃến hꢃệu năng của phƣơng pháp duyệt toàn bộ và chúng ta sẽ  
xem xꢒt kꢀ hơn trong chƣơng 3.  
5.2. Đệ qui quay lui – Backtracking  
Chꢃến lƣợc đệ quꢃ quay luꢃ là một chꢃến lƣợc xây dựng thuật toán dựa trên quan hệ đệ  
qui. Nghꢃệm của bàꢃ toán đƣợc mô hꢁnh hꢑa dƣớꢃ dꢂng một vecto, mꢕꢃ thành phần của vecto  
nghꢃệm sẽ cꢑ một tập gꢃá trị cꢑ thể nhận và thuật toán sẽ tꢃến hành các bƣớc gán các gꢃá trị cꢑ  
thể cho các thành phần của nghꢃệm để xác định đúng nghꢃệm của bàꢃ toán. Mꢊc dù không phảꢃ  
bàꢃ toán nào cꢓng cꢑ thể áp dụng song các thuật gꢃảꢃ dựa trên phƣơng pháp đệ quꢃ quay luꢃ  
luôn cꢑ vẻ đẹp từ sự ngắn gọn, súc tích mà nꢑ mang lꢂꢃ.  
̉
̣
5.3. Chia đê tri (Divide and Conquer)  
̉
Chꢃê  
́
n lƣơc  
̣
chꢃa đê trꢃ  
la môt  
̣
chꢃê  
́
n lƣơc  
̣
quan tron  
̣
g trong vꢃêc  
̣
thꢃê  
́
t kê  
́
cac gꢃaꢃ thuât  
̣
. ꢘ  
̉
̀
́
tƣơng cua chꢃê  
́
n lƣơc  
̣
nay nghe râ  
́
t đơn gꢃan va dê  
̃
nhân thâ  
̣
́
y , đo la: khꢃ câ  
̀
n gꢃaꢃ quyê  
́
t môt  
̣
baꢃ  
̀
̉
̉
̉
̉
̀
̀
́
̀
9
         
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
toán, ta se tꢃến hanh chꢃa baꢃ toán đꢑ thành các bàꢃ toán nhꢐ hơn, gꢃảꢃ các bàꢃ toán nhꢐ hơn đꢑ,  
̀ ̀  
̃
sau đo kê  
́
t hơp  
Tuy nhꢃên vâ  
cach hơp ly thanh cac baꢃ toan con , vꢁ nếu các bàꢃ toán con lꢂꢃ đƣợc gꢃảꢃ quyết bꢗng các  
̣
nghꢃêm  
̣
cua cac baꢃ toan nho hơn đo laꢃ  
̣
thanh nghꢃêm  
̣
cua baꢃ toan ban đâ  
̀
u.  
̉
̉
̉
́
́
̀
́
́
̀
̀
́
́
n đê  
̀ kho khăn ơ đây nằm ơ haꢃ yếu tố  
̉ ̉  
́
: làm thế nào để chꢃa tách bàꢃ toán  
môt  
thuât  
con se đƣơc  
̣
̣
́
́
̀
́
̀
́
̣
̣ ̣  
toan khac nhau thi sẽ rất phức tꢂp, yếu tố thƣ haꢃ la vꢃêc kết hơp lơꢃ gꢃaꢃ cua cac baꢃ toa n  
̉ ̉  
́ ́ ́ ̀ ̀ ́ ̀ ́  
̀
̣
thƣc  
Các thuật toán sắp xếp trộn (merge sort), să  
toán chꢃa để trị (các thuật toán này đƣợc trꢁnh bày ở chƣơng 3).  
Ví dụ[6, trang 57]: Trong vi du  
này chúng ta sẽ xem xꢒt thuật toán tính aN  
̣
hꢃên nhƣ thế nao?.  
̣
̃
̀
́
p xếp nhanh (quick sort) đều thuộc loꢂꢃ thuật  
̣
.
́
Đê tinh aN ta đê y công thƣc sau:  
̉
̉
́
́
́
N = 0  
aN  
Õu N ch½n  
nÕu N lÎ  
̣ ̣  
Tƣ công thƣc trên ta suy ra caꢃ đăt cua thuât toan nhƣ sau:  
̉
́
̀
́
̀
int power(int a, int n)  
{
if(n==0)  
return 1;  
else{  
int t = power(a, n/2);  
if(n%2==0)  
return t*t;  
else  
return a*t*t;  
}
}
́
̣
5.4. Chiên lƣơc tham lam (Greedy)  
Chꢃến lƣợc tham lam là một chꢃến lƣợc xây dựng thuật toán tꢁm nghꢃệm tốꢃ ƣu cục bộ  
cho các bàꢃ toán tốꢃ ƣu nhꢗm đꢂt đƣợc nghꢃệm tốꢃ ƣu toàn cục cho cả bàꢃ toán (trong trƣờng  
hợp tꢇng quát). Trong trƣờng hợp cho nghꢃệm đúng, lờꢃ gꢃảꢃ của chꢃến lƣợc tham lam thƣờng  
rất dꢄ càꢃ đꢊt và cꢑ hꢃệu năng cao (độ phức tꢂp thuật toán thấp).  
̣
Chꢃ ý: Trong môt số baꢃ toán nếu xây dựng đƣợc hàm chọn thích hợp cꢑ thể cho nghꢃệm  
̀
tố  
ꢃ ƣu. Trong nhꢃêu baꢃ toan, thuât  
̀
̣
toan tham ăn chi cho nghꢃêm  
̣
gâ  
̀
n đung vơꢃ nghꢃêm  
̣
tố  
ꢃ ƣu.  
̀
́
́
̉
́
́
10  
 
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
5.5. Qui hoạch động (Dynamic Programming)  
Quꢃ hoꢂch động là chꢃến lƣợc xây dựng thuật toán để gꢃảꢃ quyết các bàꢃ toán tốꢃ ƣu, cꢑ  
thể đòꢃ hꢐꢃ của bàꢃ toán không phảꢃ là các gꢃá trị quá chꢃ tꢃết mà chꢖ ở dꢂng gꢃá trị lớn nhất/nhꢐ  
nhất là bao nhꢃêu chứ không đòꢃ hꢐꢃ cụ thể khꢃ nào, ở đâu để cꢑ thể đꢂt đƣợc gꢃá trị đꢑ. Trong  
chꢃến lƣợc quꢃ hoꢂch động chúng ta sẽ xây dựng các quan hệ đệ quꢃ của bàꢃ toán, bàꢃ toán gốc  
sẽ cꢑ lờꢃ gꢃảꢃ dựa trên các bàꢃ toán con (sub problems) dựa trên quan hệ đệ quꢃ. Các thuật toán  
quꢃ hoꢂch động thƣờng sꢅ dụng các mảng để lƣu lꢂꢃ gꢃá trị nghꢃệm của các bàꢃ toán con và có  
haꢃ cách tꢃếp cận: bottom up và top down.  
6. Bài tập  
Bài tập 1: Xây dƣn  
̣ ̣  
g sơ đồ gꢃaꢃ thuât cho baꢃ toan tinh số Fꢃbonacꢃ thƣ N , bꢃết rằng day  
̉
̃
̀ ́ ́  
́
số  
Fꢃbonacꢃ đƣơc đꢃnh nghia nhƣ sau:  
̣
̣
̃
F[0] = F[1] = 1, F[N] = F[N-1] + F[N-2] vơꢃ N ≥ 2.  
́
̉
̣ ̣  
g sơ đồ gꢃaꢃ thuât cho baꢃ toan tinh bꢃêu thƣc:  
̉
̀ ́ ́  
́
Bài tập 2: Xây dƣn  
x x ...x , vơꢃ N sô  
́
̣ ̣ ̣  
x thƣc nằm trong cac dấu căn bâc haꢃ , N va x nhâp tƣ ban  
́ ̀ ̀ ̀  
́
phím.  
̉
̣ ̣ ̣  
phần tƣ a[i][j] đƣơc goꢃ la đꢃêm  
̉
̀
Bài tập 3: Trong môt  
yên ngƣa cua ma trân (saddle point) nê  
nhât trên côt  
̣
ma trân  
̣
haꢃ chꢃê  
̀
u câ  
́
p MxN , môt  
n tƣ nho nhất trên hang ꢃ va phần tƣ lơn  
̉
̀ ̀ ́  
̣
̣
́
u nhƣ no la phâ  
̀
̉
̉
̉
́
̀
̉
́
̣
j cua ma trân  
̣
. Chăng han  
̣
a[2][0] = 7 là môt  
̣
phâ  
̀
n tƣ yên ngƣa  
̣
trong ma trân  
̣
sau:  
̉
̉
1 2 3  
4 5 6  
7 8 9  
Hꢆy vꢃết chƣơng trꢁnh tꢁm tất cả các đꢃểm yên ngựa của một ma trận nhập vào từ bàn  
phím và đƣa ra độ phức tꢂp của thuật toán.  
Bài tập 4: Cho môt ma trân ki ch thƣơc MxN gô  
̣
̣
̀m cac số nguyên (cꢑ cả số âm và  
́
́
́
dƣơng). Hꢆy vꢃết chƣơng trꢁnh tꢁm ma trận con của ma trận đꢆ cho sao cho tꢇng các phần tꢅ  
̉
̣ ̣  
con đo lơn nhất co thê đƣơc (bàꢃ toán maxꢃmum sum plateau). Hꢆy đƣa ra đánh  
́ ́ ́  
trong ma trân  
gꢃá về độ phức tꢂp của thuật toán sꢅ dụng.  
Bài tập 5: Vꢃêt chƣơng trinh nhâp vao cac hê  
́
̣
̣ ̣  
́ cua môt đa thƣc (gꢃả sꢅ các hệ số là  
̉
́
sô  
̣
n x la môt số nguyên ) và một gꢃá trị x 0. Hꢆy tính gꢃá trị của đa thức  
̀
̀
́
̀
nguyên va đa thƣc co bꢃê  
́
̀
́
́
theo công thƣc Horner sau:  
́
Nê  
f(x) = a0 + x*(a1+x*(a2+x*(….+x(an-1+an*x)…) (Công thƣc Horner).  
́
u f(x) = an*xn + an-1*xn-1+ .. +a1*x + a0 thꢁ  
́
Bài tập 6: Cho 4 hꢁnh hộp kích thƣớc bꢗng nhau , mô  
̃
ꢃ măt  
̣
cua hinh hôp  
̣
đƣơc  
̣
tô bằng 1  
̉
̀
trong 4 màu xanh, đo, tím, vàng. Hꢆy đƣa ra tất cả các cách xê  
́
p cac hinh hôp  
̣
thanh 1 dꢆy sao  
̉
́
̀
̀
cho khꢃ nhin theo cac phia trên xuống , đằng trƣơc va đằng sau cua day đều co đu ca 4 màu  
́ ̀ ́  
̃
̉ ̉ ̉  
́
̀
́
xanh, đo, tím vàng.  
̉
11  
   
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
Bài tập 7: Hꢆy vꢃết chƣơng trꢁnh nhanh nhất cꢑ thể đƣợc để ꢃn ra tất cả các số nguyên  
co haꢃ chƣ sô  
số  
́.  
́
̃
Bài tập 8: ꢈp dụng thuật toán sàng để ꢃn ra tất cả các số nguyên tố nhꢐ hơn N.  
12  
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
́
́
CHƢƠNG II: SĂP XÊP (SORTING) VÀ TꢅM KIẾM (SEARCHING)  
1. Bài toán sꢆp xếp  
́
́
1.1. Săp xêp trong (Internal Sorting)  
Sắp xếp đƣợc xem là một trong những lꢋnh vực nghiên cứu cꢇ đꢃển của khoa học máy  
tính. Trƣớc khꢃ đꢃ vào các thuật toán chi tiết chúng ta cần nắm vững một số khái niệm cơ bản  
sau:  
+ Một trƣờng (field) là một đơn vị dữ liệu nào đꢑ chẳng hꢂn nhƣ tên, tuꢇi, số đꢃện thoꢂi  
của một ngƣời ...  
+ Một bản ghi (record) là một tập hợp các trƣờng  
+ Một file là một tập hợp các bản ghi  
Sắp xếp (sorting) là một quá trình xếp đꢊt các bản ghi của một file theo một thứ tự nào  
đꢑ. Vꢃệc xếp đꢊt này đƣợc thực hiện dựa trên một hay nhiều trƣờng nào đꢑ, và các thông tꢃn  
này đƣợc gọi là khóa xắp xếp (key). Thứ tự của các bản ghꢃ đƣợc xác định dựa trên các khóa  
khác nhau và việc sắp xếp đốꢃ đƣợc thực hiện đối với mꢕi khóa theo các thứ tự khác nhau.  
Chúng ta sẽ tập trung vào các thuật toán xắp xếp và giả sꢅ khóa chꢖ gồm 1 trƣờng duy nhất.  
Hầu hết các thuật toán xắp xếp đƣợc gọi là các thuật toán xắp xếp so sánh: chúng sꢅ dụng hai  
thao tác cơ bản là so sánh và đꢇi chꢕ (swap) các phần tꢅ cần sắp xếp.  
Các bàꢃ toán sắp xếp đơn gꢃản đƣợc chꢃa làm haꢃ dꢂng.  
̣ ̣ ̣  
Sắp xếp trong (internal sorting): Dƣ lꢃêu cần sắp xếp đƣơc lƣu đầy đu trong bô nhơ  
̃
̉
́
trong để thực hꢃện thuật toán sắp xếp.  
́
́
1.2. Săp xêp ngoài (External Sorting)  
Săp xêp ngoaꢃ (external sorting): Dƣ lꢃêu  
́
́
̣
câ  
̉
̣
thê lƣu vao bô nhơ trong đê sắp xếp , các thao tác truy cập dữ lꢃệu cꢓng mất nhꢃều thờꢃ gꢃan  
̀ ́  
̀n sắp xếp co kich thƣơc qua lơn va không  
́ ́ ́ ́ ̀  
́
̀
̃
̉
hơn.  
Trong pham  
thê dƣ lꢃêu săp xêp se la môt  
trƣơng khoa), và để tập trung vào các thuật toán chúng ta chꢖ xem xꢒt các trƣờng khꢑa của các  
̣
vꢃ cua môn hoc  
̣
nay chung ta chi xem xet cac thuât  
̣
toan să  
́
p xê  
́
p trong . Cụ  
̉
̀
́
̉
́
́
́
̉
̣
́
́
̣
mang cac ban ghꢃ (gô  
̀
m haꢃ trƣơng chinh la trƣơng dƣ lꢃêu  
̣
va  
̃
̃
̀
̉
́
̉
̀
̀
̀
̃
̀
́
̀
́
bản ghꢃ này, các ví dụ mꢃnh họa và càꢃ đꢊt đều đƣợc thực hꢃện trên các mảng số nguyên , coi  
nhƣ la trƣơng khoa cua cac ban ghꢃ.  
̉
̉
̀
̀
́
́
́
́
1.3. Săp xêp gián tiếp  
Khi các bản ghi có kích thƣớc lớn việc hoán đꢇi các bản ghi là rất tốn kꢒm, khꢃ đꢑ để  
giảm chꢃ phí ngƣời ta có thể sꢅ dụng các phƣơng pháp sắp xếp gián tiếp. Việc này có thể đƣợc  
thực hiện theo nhiều cách khác nhau và môt trong những phƣơng pháp đꢑ là tꢂo ra một file  
mới chứa các trƣờng khóa của fꢃle ban đầu, hoꢊc con trꢐ tới hoꢊc là chꢖ số của các bản ghi ban  
đầu. Chúng ta sẽ sắp xếp trên file mới này với các bản ghꢃ cꢑ kích thƣớc nhꢐ và sau đꢑ truy  
cập vào các bản ghꢃ trong fꢃle ban đầu thông qua các con trꢐ hoꢊc chꢖ số (đây là cách làm  
thƣờng thấy đối với các hệ quản trị cơ sở dữ liệu).  
13  
         
́
́
Bài giảng môn học: Phân tich thiêt kê va đánh giá giải thuật  
̀
́
Ví dụ: chúng ta muốn sắp xếp các bản ghi của fꢃle sau đây:  
Index  
Dept  
123  
23  
Last  
First Age ID number  
1
2
3
4
Smith  
Wilson  
Charles  
Shilst  
Jon  
3
4
234-45-4586  
345-65-0697  
508-45-6859  
234-45-5784  
Pete  
2
Philip 9  
Greg  
45  
8
Sau khi sắp xếp xong để truy cập vào các bản ghi theo thứ tự đꢆ sắp xếp chúng ta sꢅ  
dụng thứ tự đƣợc cung cấp bởi cột index (chꢖ số). Trong trƣờng hợp này là 3, 2, 4, 1. (chúng  
ta không nhất thiết phảꢃ hoán đꢇi các bản ghi ban đầu).  
1.3. Các tiêu chuẩn đánh giá một thuật toán sꢆp xếp  
Các thuật toán sắp xếp có thể đƣợc so sánh với nhau dựa trên các yếu tố sau đây:  
+ Thời gian thực hiện (run-time): số các thao tác thực hiện (thƣờng là số các phép so  
sánh và hoán đꢇi các bản ghi).  
+ Bộ nhớ sꢅ dụng (Memory): là dung lƣợng bộ nhớ cần thiết để thực hiện thuật toán  
ngoàꢃ dung lƣợng bộ nhớ sꢅ dụng để chứa dữ liệu cần sắp xếp.  
+ Một vài thuật toán thuộc loꢂꢃ “ꢃn place” và không cần (hoꢊc cần một số cố định) thêm  
bộ nhớ cho việc thực hiện thuật toán.  
+ Các thuật toán khác thƣờng sꢅ dụng thêm bộ nhớ tꢖ lệ thuận theo hàm tuyến tính hoꢊc  
hàm mꢓ vớꢃ kích thƣớc file sắp xếp.  
+ Tất nhiên là bộ nhớ sꢅ dụng càng nhꢐ càng tốt mꢊc dù việc cân đối giữa thời gian và  
bộ nhớ cần thiết có thể là có lợi.  
+ Sự ꢇn định (Stability):Một thuật toán đƣợc gọi là ꢇn định nếu nhƣ nꢑ cꢑ thể giữ đƣợc  
quan hệ thứ tự của các khóa bꢗng nhau (không làm thay đꢇi thứ tự của các khóa bꢗng nhau).  
Chúng ta thƣờng lo lắng nhiều nhất là về thời gian thực hiện của thuật toán vì các thuật  
toán mà chúng ta bàn về thƣờng sꢅ dụng kích thƣớc bộ nhớ tƣơng đƣơng nhau.  
Ví dụ về sắp xếp ꢇn định: Chúng ta muốn sắp xếp fꢃle sau đây dự trên ký tự đầu của các  
bản ghꢃ và dƣớꢃ đây là kết quả sắp xếp của các thuật toán ꢇn định và không ꢇn định:  
14  
 
Tải về để xem bản đầy đủ
pdf 74 trang Thùy Anh 19640 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Phân tích thiết kế và đánh giá thuật toán - Trường Đại học Hàng Hải", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_phan_tich_thiet_ke_va_danh_gia_thuat_toan_truong.pdf