1
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP.HCM
KHOA CÔNG NGH THÔNG TIN
BỘ MÔN CÔNG NGHỆ PHẦN MỀM

Giáo trình
KỸ THUẬT LẬP TRÌNH NÂNG CAO
(Dành cho h Đại học)
TP.HCM, tháng 9 năm 2013
2
MỤC LỤC
CHƯƠNG 1. TỔNG QUAN KỸ THUẬT LP TRÌNH ............................................... 5
1.1 Tổng quan về kỹ thuật lập trình ..................................................................... 5
1.1.1 Phong cách lập trình .................................................................................. 5
1.1.2 Một số k thuật và phong cách lập trình căn bản. ....................................... 5
1.2 Phân tích đánh giá giải thut ........................................................................ 12
1.2.1 Sự cần thiết phân tích thuật giải ............................................................... 12
1.2.2 Thời gian thực hiện của chương trình ....................................................... 12
1.2.3 T suất tăng và độ phức tạp của thuật toán ............................................... 13
1.2.4 Cách nh độ phức tạp .............................................................................. 14
CHƯƠNG 2. KTHUẬT XLÝ MẢNG ................................................................ 22
2.1 Kỹ thuật xử lý mng một chiều .................................................................... 22
2.1.1 Thuật toán lặp tng quát ........................................................................... 24
2.1.2 Thuật toán nh tổng và tích...................................................................... 26
2.1.3 Thuật toán đếm ........................................................................................ 29
2.1.4 Thuật toán tìm phần tử đầu tiên ................................................................ 30
2.1.5 Thuật toán tìm tất cả các phần tử .............................................................. 30
2.1.6 Thuật toán tìm min, max .......................................................................... 31
2.1.7 Thuật toán sắp xếp ................................................................................... 33
2.2 Kỹ thuât xử lý mng hai chiều ..................................................................... 34
2.2.1 Mảng hai chiu (ma trận) ......................................................................... 34
2.2.2 Thuật toán cơ bản trên mảng hai chiều ..................................................... 36
2.2.3 Ma trận vuông .......................................................................................... 42
2.2.4 Một sối toán đặc biệt ........................................................................... 46
CHƯƠNG 3. KTHUẬT ĐỆ QUY .......................................................................... 51
3.1 Khái niệm .................................................................................................... 51
3.2 Các dạng đệ quy .......................................................................................... 52
3.2.1 Đệ quy tuyến tính (Linear Recursion) ...................................................... 52
3.2.2 Đệ quy nhị phân (Binary Recursion) ........................................................ 53
3.2.3 Đệ quy phi tuyến (NonLinear Recursion) ................................................. 54
3.2.4 Đệ quy lồng (Nested Recursion) .............................................................. 55
3.2.5 Đệ quy tương h (Mutual Recursion) ....................................................... 58
3.2.6 Những ưu nhược điểm của k thuật đệ quy .............................................. 59
3.3 Các bước tìm giải thuật đ quy cho một bài toán ......................................... 60
3.3.1 Thông s hóa bài toán .............................................................................. 60
3.3.2 Tìm các trường hợp cơ bản (phần cơ sở) cùng giải thuật tương ứng cho các
trường hợp này. .................................................................................................. 60
3.3.3 Phân rã bài toán tng quát theo phương thức đệ quy ................................ 60
3.4 Một sối toán đệ quy thông dng .............................................................. 61
3.4.1 Bài toán tìm tt cả hoán vị ca một dãy phần tử. ...................................... 61
3.4.2 Bài toán sp xếp mng bng phương pháp trn (Merge Sort) ................... 63
3
3.4.3 Bài toán chia thưởng ................................................................................ 65
3.4.4 Bài toán tháp Hà Nội................................................................................ 67
3.5 Khđệ quy .................................................................................................. 70
3.5.1 Khđệ quy đơn giản bng vòng lặp. ........................................................ 71
3.5.2 Khđệ quy dùng stack. ............................................................................ 73
CHƯƠNG 4. K THUT XLÝ CHUỖI ............................................................... 80
4.1 Một số khái niệm ......................................................................................... 80
4.1.1 Chui kí tự ............................................................................................... 80
4.1.2 Nhp/ xuất chuỗi tự .............................................................................. 80
4.1.3 Xâu con ................................................................................................... 81
4.2 Các thuật toán tìm kiếm chuỗi ..................................................................... 82
4.2.1 Thuật toán Brute Force ............................................................................ 82
4.2.2 Thuật tóan Knuth – Morris – Pratt............................................................ 84
4.2.3 Thuật tóan Boyer Moore .......................................................................... 86
CHƯƠNG 5. THIẾT KẾ THUẬT TOÁN .................................................................. 90
5.1 Kỹ thuật chia đtrị - Divide to Conquer ...................................................... 90
5.1.1 Khái niệm ................................................................................................ 90
5.1.2 Một số bài toán minh họa ......................................................................... 91
5.2 Kỹ thuật tham ăn Greedy Technique ......................................................... 95
5.2.1 Giới thiu bài toán tối ưu tổ hợp .............................................................. 95
5.2.2 Ni dung k thuật tham ăn. ..................................................................... 95
5.2.3 Một số bài toán minh họa ......................................................................... 95
5.3 Kỹ thuật nhánh cận - Branch and Bound ...................................................... 102
5.3.1 Giới thiu ............................................................................................... 102
5.3.2 Bài toán tìm đường đi của người giao hàng ............................................ 102
5.4 Kỹ thuật quy hoạch động - Dynamic programming ................................... 103
5.4.1 Giới thiu ............................................................................................... 103
5.4.2 Một số bài toán minh họa ....................................................................... 104
5.4.3 Bài toán ba lô. ........................................................................................ 107
TÀI LIỆU THAM KHẢO........................................................................................ 118
4
LỜI NÓI ĐẦU
“Algorithm + Data structure = Program”
(“Giải thuật + Cấu trúc dữ liệu = Chương trình”)
Câu nói ni tiếng của Niklaus Wirth, mt nhà khoa hc máy tính nổi tiếng, tác giả
ca ngôn ngữ lập trình Pascal, đã đặt tên cho mt cuốn sách của ông. Đây mt
trong những quyển sách nổi tiếng, được làm giáo trình giảng dạy các trường đại
học lớn. Qua đó chúng ta thấy vai trò quan trng của giải thuật và k thuật lập trình
đểy dựng các giải thuật nhằm tìm đáp án tối ưu nhất cho các bài toán lp trình.
Môn học Kỹ thuật lp trình nâng cao được bố trí sau 2 n học Kỹ thuật lập trình
Cấu trúc dữ liệu trong chương trình đào tạo cho sinh viên chuyên ngành Công
nghthông tin. Môn học nhằm giới thiệu cho sinh viên những kiến thức bản,
những kỹ thuật chủ yếu của việc phân tích và xây dng các giải thuật, đtìm ra các
cách gii ti ưu nhất thể cho bài toán. c kthuật được trình bày đây là
những k thuật bản, phổ biến được các nhà khoa hc tin học tổng kết và vận
dụng trong cài đặt các chương trình. Việc nắm vững các k thuật đó sẽ rất bổ ích
cho sinh viên khi phi giải quyết một vấn đ thực tế.
Ni dung giáo trình gồm các phần như sau:
- Chương 1: Tổng quan k thuật lập trình
- Chương 2: Xử lý cấu trúc mảng
- Chương 3: K thuật đệ qui
- Chương 4: Xử lý chuỗi
- Chương 5: Thiết kế thuật toán
Các vấn đ được trình y chi tiết với những dụ rõ ràng. Cui mỗi chương
phần bài tp được sắp xếp từ cơ bn đến nâng cao giúp sinh viên nắm vững và kiểm
tra kiến thức bằng việc giải các bài tập. Chúng i mong rằng các sinh viên ttìm
hiểu trước mỗi vn đề, kết hợp với bài ging trên lp ca giảng viên m i tập
để việc học môn này đạt hiệu quả.
Trong quá trình giảng dạy và biên soạn giáo trình này, chúng i đã nhận được
nhiu đóng góp quýu của các đồng nghiệp ở Bộ môn Công nghệ Phần mềm cũng
như các đồng nghiệp trong và ngoài Khoa Công ngh Thông tin. Chúng tôi xin cảm
ơn hy vọng rằng giáo trìnhy sẽ gp cho việc giảng dy và hc môn “K thuật
lập trình nâng cao” đạt hiệu qutt hơn. Chúng i hy vng nhận được nhiều ý kiến
đóng góp để giáo trình ngày càng hoàn thiện.
Nhóm tác gi
5
CHƯƠNG 1. TỔNG QUAN KỸ THUẬT LẬP TRÌNH
1.1 Tng quan về kỹ thuật lp trình
1.1.1 Phong cách lập trình
Một cơng trình nguồn được xem là tt không ch đưc đánh giá thông qua thuật gii
đúng và cấu trúc d liu thích hp, mà còn ph thuc vào phong cách k thut mã
hoá (coding) của người viết chương trình.
Nếu một người lp trình viết một chương trình dù thc hiện đúng yêu cầu đặt ra nhưng
ngun quá ln xn phong cách lp trình cu th, thì mã ngun này s y khó
khăn không ch cho những người khác muốn đọc hiu, mà còn cho chính ngưi lp
trình khi mun chnh sa hoc ci tiến.
Đôi khi ngưi mi lp trình không quan tâm đến vấn đ y do ban đu ch làm vic
với chương trình nh. Tuy nhiên, vấn đ phát sinh khi h phi làm vic vi d án ln
chương trình lúc y không còn đơn giản vài chc dòng lnh na. Nếu không rèn
luyn mt phong cách trang b mt s k thut lp trình tt thì ngưi lp trình đối
mt vi nhiều khó khăn…
Trong chương đu tiên xin gii thiu mt s k thut và phong cách lp trình cơ bn, ít
nhiu giúp cho người hc viết chương trình được tốt hơn.
1.1.2 Mt số kỹ thuật và phong cách lập trình căn bn.
1.1.2.1. Cách đt tên biến
Thông thường y theo ngôn ng i trưng lp trình, ngưi viết chương trình
thường chn cho mình mt phong cách nht quán trong việc đặt tên các đnh danh.
Mt s quy tc cần quan tâm khi đặt tên như sau:
Tên của định danh phải thể hiện được ý nghĩa: thông thường các biến nguyên n
i, j, k dùng làm biến chạy trong vòng lặp; x, y dùng làm biến lưu ta độ, hoặc dùng
làm biến đại diện cho các sbất kỳCòn những biến lưu trữ dliệu khác thì nên đặt
gợi nh, nhưng tránh dài dòng: biến đếm số lần dùng "count, dem, so_luong…", biến
lưu trọng lượng weight, trong_luong”, chiều cao “height” ; Nếu đặt quá ngắn gọn
như c cho biến đếm, hay w cho khối lượng thì sau y khi nhìn vào chương trình s rất
khó hiểu ý nghĩa của chúng. Ngược lại đặt tên quá dài như "the_first_number,
the_second_number,…" để chỉ các số bất kỳ, sẽ làm thừa, rườm trong chương
trình.
Tên phải xác định được kiểu dliệu lưu trữ: phong cách lập trình tt khi người
đọc nhìn vào một biến nào đó thì xác đnh ngay được kiểu dữ liệu tên đối tượng mà
biến đó lưu trữ. Cho nên tên biến thường là danh t (tên đối tượng) kèm theo tiền tố
mang ý nghĩa kiểu d liệu. Giả sử có biến đếm số lần thì ta thể đặt iNumber, trong
đó i kiểu của dliệu, strContent là kiểu chuỗi, CPoint lp Pointnhiu
pháp quy ước đặt tên biến, người lập trình thchọn cho mình mt quy ước thích
hợp. Có thể tham khảo một số quy ưc trong phần bên dưới.
Theo một quy ước cụ thể:
+ pháp Hungary: hình thc chung của cú pháp này thêm tin tchứa kiểu
dliệu vào tên biến. Bảng 1.1 bêni là mt số tiền tố quy ước được nhiều lp trình
viên sdụng. Các công ty phần mềm thường các quy ước về cách đặt tên biến cho