1
TRƯỜNG ĐẠI HC KIÊN GIANG
KHOA THÔNG TIN & TRUYN THÔNG
BÀI GING
Biên son: ThS. Hunh Minh Trí
Lưu hành nội b - Năm 2019
2
LỜI NÓI ĐẦU
Gii thuật lĩnh vc nghiên cu gn lin các lĩnh vc lp trình, tính toán, thiết
kế chương trình trong nhng lĩnh vực nghiên cu lâu đời ca khoa hc máy tính. Hu
hết các chương trình được viết ra, chy trên máy tính, ln hay nhỏ, dù đơn giản hay
phc tạp, đều phi s dng các cu trúc d liu tuân theo các trình t, logic, cách thc
làm vic theo nhng nguyên tc c th, chính các gii thut. Vic hiu biết v các cu
trúc d liu thut toán cho phép c lp trình viên, các nhà khoa hc máy tính
nn tng lý thuyết vng chc, nhiu la chọn hơn trong việc đưa ra các gii pháp
cho các bài toán thc tế. vy vic hc tp môn hc phân tích thiết kế thut toán
một điều rt quan trng.
Tài liu này da trên nhng kinh nghim nghiên cu tác gi đã đúc kết,
rút kinh nghim, thu thp trong quá trình ging dy nghiên cu, tham kho các tài
liu ging dy của các trường đại hc, các tác gi đồng ngip ti các khoa Công ngh
Thông tin của các trường Đại hc Hàng hi Vit nam, Đi hc Cần Thơ, Đại hc Công
nhip Tp H Chí Minh cùng vi s tham kho ca các tài liu ca các đồng nghip,
các tác gi trongngoài c, t đin trc tuyến Wikipedia. Vi các chương đưc
chia thành các ch đề khác nhau t c khái nim bản cho ti thut toán, tính độ
phc tạp, các phương pháp sp xếp, tìm kiếm, hy vng s cung cp cho các em sinh
viên, các bn đọc gi mt tài liu b ích. Mc đã rất c gng song vn không tránh
khi mt s thiếu sót, và vay mượn mt s thut ng, t ngũ của đồng nghip, hy
vng s đưc các bạn đồng nghip, các em sinh viên, các bạn độc gi ng h
góp ý chân thành đ tôi có th hoàn thiện hơn nữa tài liu này.
Xin gi li cảm ơn chân thành ti các bn bè đồng nghip và khoa Thông tin và
Truyền thông, Trường Đại hc Kiên Giang đã tạo điều kiện giúp đ để tài liu này có
th hoàn thành tt.
3
MC LC
CHƯƠNG 1: THUẬT TOÁN VÀ HIU QU CA THUT TOÁN .................. 1
S CN THIT PHI PHÂN TÍCH THUT TOÁN ........................................ 1
Thut toán (gii thut) - Algorithm
................................................................................. 1
Độ phc tp thut toán Algorithm Complexity ............................................................ 4
Tỷ suất tăng
độ phc tp thut toán
......................................................................... 6
Phân tích các chương trình ð quy ................................................................................ 11
Các hàm tiến trin khác
........................................................................... 14
Thiết kế thut toán. ..................................................................................... 14
Phương pháp Vét cn (Brute force)
............................................................................ 15
Phương pháp Quay lui (Back tracking / try and error)
............................................. 15
Phương pháp Chia để tr (Divide and Conquer)
....................................................... 18
Phương pháp tham lam (Greedy)
................................................................................ 26
Qui hoạch động (Dynamic Programming)
.................................................................. 35
Bài tp
......................................................................................................... 38
CHƯƠNG 2: TÌM KIM (SEARCHING)
......................................................... 62
Bài toán tìm kiếm
...................................................................................... 62
Tìm kiếm tun t (Sequential search)
................................................... 62
Tìm kiếm nh phân (binary search)
........................................................ 63
Sp xếp topo
.............................................................................................. 65
Bài tp
......................................................................................................... 70
CHƯƠNG 3: SẮP XP (SORTING) ...................................................................... 71
Bài toán sp xếp ......................................................................................... 71
Sp xếp gián tiếp
....................................................................................... 71
Các tiêu chun đánh giá mt thut toán sp xếp
................................ 72
Các phương pháp sp xếp cơ bn
........................................................ 73
Sp xếp chn (Selection sort) ......................................................................................... 73
Sp xếp đổi ch trc tiếp (Exchange sort) .................................................................... 74
Cài đặt ca thut toán: ........................................................................................ 75
Sp xếp chèn (Insertion sort) .......................................................................................... 75
Sp xếp ni bt (Bubble sort) ......................................................................................... 78
Cài đặt thut toán: ................................................................................................ 78
Sp xếp nhanh (Quick sort) ............................................................................................. 79
Sp xếp trn (merge sort) ................................................................................................ 83
Cu trúc d liu Heap, sp xếp vun đống (Heap sort). ................................................ 86
Các thut toán khác ......................................................................................................... 90
Bài tp .......................................................................................................... 92
1
CHƯƠNG 1: THUẬT TOÁN VÀ HIỆU QUẢ CỦA THUẬT TOÁN
SỰ CẦN THIẾT PHẢI PHÂN TÍCH THUẬT TOÁN
Trong khi giải m
t bài toán chúng ta th mt s gii thut khác nhau,
vấn đ cn phải đánh giá các gii thuật đó để la chn mt gii thut tt (nht).
Thông thưng thì ta s căn cứ vào các tiêu chun sau:
Gii thuật đúng đắn.
Gii thuật đơn giản.
Gii thut thc hin n
hanh.
Với yêu cầu (1), để kiểm tra tính đúng đắn của giải thuật chúng ta thể cài đặt
giải thuật đó và cho thực hiện trên máy với một số bộ dữ liệu mẫu rồi lấy kết quả thu được
so sánh với kết quả đã biết. Thực ra thì cách
làm này không chc chn bi vì có th gii
thuật đúng với tt c các b d liu chúng ta đã th nhưng lại sai vi mt b d liu
nào đó. Vả li cách làm này ch phát hin ra gii thut sai ch chưa chứng minh đưc
nó đúng. Tính đúng đắn ca gii thut cn phải được chng minh bng toán hc. Tt
nhiên điều này không đơn giản và do vy chúng ta s không đề cập đến đây.
Khi chúng ta viết một chương trình đ s dng mt vài ln thì yêu cu (2) là
quan trng nht. Chúng ta cn mt gii thut d viết chương trình để nhanh chóng
đưc kết qu, thi gian thc hiện chương trình không được đề cao vì sao thì chương
trình đó cũng chỉ s dng mt vài ln mà thôi.
Tuy nhiên khi một chương trình đưc s dng nhiu ln thì thì yêu cu tiết
kim thi gian thc hiện chương trình lại rt quan trọng đc biệt đối vi những chương
trình mà khi thc hin cn d liu nhp ln do
đó yêu cầu (3) sẽ được xem xét một cách
kĩ càng. Ta gọi nó là hiệu quả thời gian thực hiện của giải thuật.
Thut toán (gii thut) - Algorithm
1.1.1.1
Định nghĩa thut toán
Có rt nhiều các định nghĩa cũng như cách phát biu khác nhau v định nghĩa
ca thut toán. Theo như cun sách giáo khoa ni tiếng viết v thut toán
“Introduction to Algorithms” (Second Edition ca Thomas H. Cormen, Charles E.
Leiserson, Ronald L. Rivest và Clifford Stein) thì thuật toán được định nghĩa như sau:
“mt thut toán mt th tục tính toán xác đnh (well-defined) nhn các giá tr hoc
mt tp các giá tr gi input sinh ra ra mt vài giá tr hoc mt tp giá tr đưc
gọi là output”.
2
Nói mt cách khác các thut toán giống như các cách thức, qui trình đ
hoàn thành mt công vic c th xác định (well-defined) nào đó. thế mt đon
chương trình tính các phn t ca dãy s Fibonaci mt cài đặt ca mt thut toán c
th. Thm chí một hàm đơn giản đ cng hai s cũng mt thut toán hoàn chnh,
mặc dù đó là một thut toán đơn gin.
1.1.1.2
Đặc trưng ca thut toán
Tính đúng đắn: Thut toán cn đảm bo cho mt kết qu đúng sau khi thc
hiện đối vi các b d liu đầu vào. Đây th nói đặc trưng quan trng nht vi mt
thut toán.
Tính dng: thut toán cn phải đảm bo s dng sau mt s hu hạn bước.
Tính xác định: Các bước ca thut toán phải đưc phát biu ràng, c th,
tránh gây nhp nhng hoc nhm lẫn đối với người đọc và hiu, cài đặt thut toán.
Tính hiu qu: thuật toán đưc xem hiu qu nếu như có khả năng giải
quyết hiu qu bài toán đt ra trong thi gian hoc các điều kin cho phép trên thc tế
đáp ứng đưc yêu cu của ngưi dùng.
Tính ph quát: thuật toán đưc gi tính ph quát (ph biến) nếu
th gii quyết đưc mt lp các bài toán tương tự.
Ngoài ra mi thuật toán theo định nghĩa đu nhn các giá tr đầu vào được gi
chung là các giá tr d liu Input. Kết qu ca thuật toán (thưng là mt kết qu c th
nào đó tùy theo các bài toán và thut toán c thể) đưc gi là Output.
1.1.1.3
Biu din thut toán
Có nh
iều phương pháp biu din thut toán .Có th biu din thut toán bng
danh sách các ớc, các ớc được diễn đạt bng ngôn ng thông thường các
hiu toán hc. Có th biu din thut toán bng sơ đồ khi. Tuy nhiên, để đảm bo tính
xác định ca thut toán như đã trình bày trên, thut toán cn đưc viết trên các ngôn
ng lp trình. Một chương trình là s biu
diễn
ca mt thut toán trong ngôn ng lp
trình đã chọn. Thông thưng ta dùng ngôn ng lp trình Pascal, mt ngôn ng thường
đưc chọn để trình y các thut toán trong sách báo. Ngôn ng thut toán là ngôn ng
dùng để miêu t thuật toán .Thông thường ngôn ng thut toán bao gm ba loi: Ngôn
ng lit kê từng bước; Sơ đồ khi; Ngôn ng lp trình;
1.1.1.4
Phương pháp liệt kê từng bước
Ngôn ngữ liệt kê từng bước nội dung như sau:
Thut
toán: Tên thuật toán và chức năng.