48
 1  B GIÁO DC VÀ ĐÀO TO TRƯỜNG ĐẠI HC PHƯƠNG ĐÔNG KHOA CÔNG NGH THÔNG TIN -------------------------- BÀI GING MÔN HC PHÂN TÍCH VÀ THIT K THUT TOÁN HÀ NI, 2008

1PTTKTT_Ch123

Embed Size (px)

Citation preview

Page 1: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 1/48

 

1

 

BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC PHƯƠNG ĐÔNGKHOA CÔNG NGHỆ THÔNG TIN

--------------------------

BÀI GIẢNG MÔN HỌC

PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN

H NỘI, 2008

Page 2: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 2/48

 

2

Mục lụcMục lục..................................................................................................................................2

Lời nói đầu............................................................................................................................4

Chương I: Mở đầu về thiết kế, đánh giá thuật toán và kiến thức bổ trợ ..........................5

Gi ới thiệu chươ ng ............................................................................................................5 

1.1. Khái ni ệm thuật toán .................................................................................................5 

1.1.1. Khái niệm về thuật toán ............................................................................................5

1.1.2. Các yêu cầu về thuật toán ........................................................................................6

1.2. Thi ết kế thuật toán .....................................................................................................7 

1.3. Tính đúng đắn của thuật toán...................................................................................7 

1.4. Phân tích thu ật toán ..................................................................................................8 

1.5. Đánh giá hi ệu quả của thuật toán.............................................................................8 

1.6. Các phươ ng pháp bi ểu diễn thuật toán ...................................................................8 

1.6.1. Phương pháp liệt kê từng bước ...............................................................................9

1.6.2. Phương pháp sơ đồ ..................................................................................................9

1.7. M ột số cấu trúc dữ liệu cơ bản ...............................................................................10 

1.7.1. Danh sách ...............................................................................................................10

1.7.2. Đồ thị .......................................................................................................................12

1.7.3. Cây ..........................................................................................................................121.7.4. Tập hợp ...................................................................................................................15

1.8. Ngôn ng ữ tựa Pascal ...............................................................................................16 

1.8.1. Bảng chữ cái và ký tự chủ yếu ...............................................................................16

1.8.2. Một số câu lệnh chính .............................................................................................16

Bài t ập chươ ng ...............................................................................................................20 

Chương II: Độ phức tạp tính toán và tính hiệu quả của thuật toán ................................21

2.1 T ỔNG QUAN ..............................................................................................................21

2.1.1. Mục tiêu ...................................................................................................................21

2.1.2. Kiến thức cơ bản cần thiết ......................................................................................21

2.1.3. Nội dung cốt lõi........................................................................................................21

2.2. S Ự CẦN THIẾT PHẢI PHÂN TÍCH THUẬT TOÁN ....................................................21

2.3 TH  ỜI GIAN THỰC HIỆN CỦA CHƯƠ NG TRÌNH..................................................22 

2.3.1. Thời gian thực hiện chương trình. ..........................................................................22

2.3.2 Ðơn vị đo thời gian thực hiện...................................................................................22

2.3.3. Thời gian thực hiện trong trường hợp xấu nhất. ....................................................23

Page 3: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 3/48

 

3

2.4. T Ỷ SUẤT TĂNG V  À ÐỘ PHỨC TẠP CỦA GIẢI THUẬT ...........................................23

2.4.1. Tỷ suất tăng.............................................................................................................23

2.4.2. Khái niệm độ phức tạp của giải thuật .....................................................................23

2.5. CÁCH TÍNH ÐỘ PHỨC TẠP .....................................................................................24

2.5.1. Qui tắc cộng ............................................................................................................24

2.5.2. Qui tắc nhân ............................................................................................................24

2.5.3. Qui tắc tổng quát để phân tích một chương trình ..................................................24

2.5.4. Ðộ phức tạp của chương trình có gọi chương trình con không đệ qui..................26

2.6. PHÂN TÍCH CÁC CH ƯƠ NG TRÌNH ÐỆ QUY ...........................................................27 

2.6.1. Thành lập phương trình đệ quy ..............................................................................28

2.6.2. Giải phương trình đệ quy ........................................................................................31

2.7. T ỔNG KẾT CHƯƠ NG...............................................................................................37 

BÀI T  ẬP CHƯƠ NG..........................................................................................................37 

Chương III: Phương pháp “Tham lam” ............................................................................39

3.1. Đặc trưng của chiến lược tham lam ..........................................................................39

3.1.1 Bài toán t ối ư u t ổ hợ  p............................................................................................39

3.1.2 N ội dung k ĩ thuật tham ăn .....................................................................................39

3.1.3. Đặc tính l ự a chọn tham lam.................................................................................40 

3.1.4. C ấ u trúc con t ối ư u...............................................................................................40 

3.2. Sơ đồ chung của phương pháp.................................................................................40

3.2.1. Đặc điểm chung c ủ a thu ật toán tham lam...........................................................40 

3.2.2. S ơ đồ thu ật toán ...................................................................................................41

3.2.3. Chứng minh tính đúng đắ n ..................................................................................42 

3.3. Bài toán tr ả tiền của máy rút tiền tự động ATM ........................................................42

3.4. Bài toán về các đoạn thẳng không giao nhau...........................................................43

3.5. Bài toán cái túi.............................................................................................................46

Page 4: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 4/48

 

4

Mục lụcLời nói đầu

Học phần “Thuật toán và đánh giá độ phức tạp thuật toán” được viết cho sinh viênkhoa CNTT sau khi đã học xong các học phần: CẤU TRÚC DỮ LIỆU VÀ GIẢITHUẬT, LẬP TR ÌNH NÂNG CAO, TOÁN R ỜI RẠC... Học phần tr ình bày các k ỹ

thuật thiết kế giải thuật nâng cao, phương pháp phân tích đánh giá giải thuật, các giảithuật cơ bản, các giải thuật đồ thị, và một số các giải thuật cơ bản khác như chia để trị,qui hoạch động, thuật toán tham lam và các thuật toán trên đồ thị.

Page 5: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 5/48

 

5

Chương I: Mở đầu về thiết kế, đánh giá thuật toán và kiếnthức bổ trợ

Gi ới thiệu chương 

Có nhiều bài toán tổng quát xuất hiện trong toán học rời rạc. Chẳng hạn tìm số lớnnhất trong một dãy số nguyên cho trước, liệt kê hết tất cả các tập hợp con của một tậphợp cho trước, xếp lại một dãy số nguyên theo thứ tự tăng dần hoặc giảm dần... Khiđược giao một bài toán như vậy, thì tr ước hết chúng ta phải xây dựng một mô hìnhdịch bài toán đó sang ngữ cảnh toán học. Các cấu trúc được dùng trong những mô hìnhnày chủ yếu là các cấu trúc tập hợp, dãy, hàm, hoán vị, tổ hợp ... và cấu trúc đồ thị là

 phần chúng ta sẽ học trong chương sau.

Lập được mô hình toán học thích hợp mới chỉ là bước bắt đầu của quá tr ình giải. Đểhoàn tất quá tr ình này còn cần phải có một phương pháp sử dụng mô hình để đi tới lờigiải. Bước này đòi hỏi phải thích hợp với công cụ máy tính chúng ta dùng. Cái đòi hỏi

ở đây là những bước đi cụ thể theo đúng thủ tục đòi hỏi của máy tính và cấu trúc dữliệu của ta để đi tới lời giải bài toán ban đầu. Một dãy các bước như vậy được gọi làthuật toán. Ta sẽ đưa ra cách mô tả thuật toán theo sơ đồ cũng như theo thuật ngữ lậptrình.

Một vấn đề quan trọng của thuật toán là ta phải đánh giá và so sánh được các thuậttoán với nhau. Nói chung tiêu chuẩn để đánh giá một thuật toán là tốt hay không chủyếu dựa trên độ phức tạp của nó, tức là dựa tr ên số thời gian cần dùng để thực hiện nó.Trong phần sau, chúng ta sẽ đưa ra các bước cần thực hiện để đánh giá độ phức tạpcủa thuật toán. Khái niệm độ phức tạp này chưa phải là khái niệm dựa tr ên khái niệm

chính xác về thuật toán xây dựng trên cơ sở máy tính Turing trừu tượng.1.1. Khái ni ệm thuật toán

1.1.1. Khái niệm về thuật toán

Thuật toán (algorithm) là một trong những khái niệm quan trọng trong lĩnh vực tinhọc. Thuật ngữ thuật toán được xuất phát từ nhà toán học Arập Abu Ja’far Mohammedibn Musa al Khowarizmi (khoảng năm 825). Tuy nhiên lúc bấy giờ và trong nhiều thếk ỷ sau, nó không mang nội dung như ngày nay chúng ta quan niệm. Thuật toán nổitiếng nhất có từ thời cổ Hy lạp là thuật toán Euclid, thuật toán tìm ước chung lớn nhất

của hai số nguyên. Có thể mô tả thuật toán đó như sau:Thuật toán Euclid.

Input: m, n nguyên dương

Output: g (ước chung lớn nhất của m và n)

Phương pháp:

Bước 1: Tìm r, phần dư của m cho n

Bướ c 2: Nếu r = 0, thì g:=n (gán giá tr ị của n cho g),và dừng lại. Trong trường

hợp ngược lại (r 0), thì m:=n; n:=r và quay lại bước 1.

Page 6: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 6/48

 

6

Chúng ta có thể quan niệm các bước cần thực hiện để làm một món ăn, được mô tảtrong các sách dạy chế biến món ăn, là một thuật toán. Cũng có thể xem các bước cầntiến hành để gấp đồ chơi bằng giấy ,được tr ình bày trong sách dạy gấp đồ chơi bằnggiấy là một thuật toán. Phương pháp cộng nhân các số nguuyên, chúng ta đã được họcở cấp I cũng là các thuật toán.

Vì vậy ta có định ngh ĩa không hình thức về thuật toán như sau:

Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính xác các phép toán,hoặc hành động cần thực hiện ... để cho ta lời giải của b ài toán.

1.1.2. Các yêu cầu về thuật toán

Định nghĩa tr ên về thuật toán tất nhiên còn chứa nhiều điều chưa r õ ràng. Để hiểu đầyđủ ý nghĩa của khái niệm thuật toán, chúng ta đưa ra 5 đặc trưng sau đây của thuậttoán.

1. InputMỗi thuật toán đều có một số (có thể bằng không) các dữ liệu vào (input). Đó là cácgiá tr ị cần đưa vào khi thuật toán bắt đầu làm việc. Các dữ liệu này cần được lấy từ cáctập hợp giá trị cụ thể nào đó. Chẳng hạn, trong thuật toán Euclid ở tr ên, các số m và nlà các dữ liệu lấy từ tập các số nguyên dương.

2. Output

Mỗi thuật toán cần có một hoặc nhiều dữ liệu ra (output). Đó là các giá tr ị có quan hệhoàn toàn xác định với các dữ liệu vào, và là k ết quả của sự thực hiện thuật toán.Trong thuật toán Euclid, có một dữ liệu ra đó là ƯSCLN g, khi thuật toán dừng lại

(trường hợp r=0) thì giá tr ị của g là ướ c chung lớn nhất của m và n.3. Tính xác định

Ở mỗi bước, các bước thao tác phải hết sức r õ ràng, không gây nên sự nhập nhằng. Nói rõ hơn là trong cùng một điều kiện hai bộ xử lý cùng thực hiện một thuật toán phảicho cùng một kết quả như nhau.  Nếu biểu diễn thuật toán bằng phương pháp thôngthường không có gì đảm bảo được người đọc hiểu đúng ý của người viết thuật toán. Đểđảm bảo đòi hỏi này, thuật toán cần được mô tả trong các ngôn ngữ lập tr ình (ngônngữ máy, hợp ngữ hoặc ngôn ngữ bậc cao như Pascal...). Trong các ngôn ngữ này cácmệnh đề được tạo theo các qui tắc cú pháp nghiêm ngặt và chỉ có một ngh ĩa duy nhất.

4. Tính khả thi/đa năng

Tất cả các phép toán có mặt trong thuật toán phải đủ đơn giản . Điều đó có nghĩa l à,các phép toán phải sao cho, ít nhất về nguyên tắc có thể thực hiện bởi con người chỉ

 bằng giấy trắng và bút chì trong một khoảng thời gian hữu hạn. Chẳng hạn, trong thuậttoán Euclid ta chỉ cần thực hiện các phép chia các số nguyên, các phép gán và các

 phép so sánh r=0 hay r  0. Điều quan tr ọng nữa là thuật toán phải có tính đa năng làmviệc được với tất cả các tập hợp dữ liệu có thể của đầu vào.

5. Tính dừng

Page 7: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 7/48

 

7

Với mọi bộ dữ liệu vào thoả mãn các điều kiện của dữ liệu vào (tức là được lấy ra từcác tập của dữ liệu vào), thuật toán phải dừng lại sau một số hữu hạn bước thực hiện.Ví dụ, thuật toán Euclid thoả mãn điều kiện này. Bởi vì giá tr ị của r luôn nhỏ hơn n(khi thực hiện bước 1), nếu r <>0 thì giá tr ị của n ở bước i (ký hiệu là ni) sẽ là giá tr ịcủa r i-1 ở bước i-1, ta phải có bất đẳng thức n>r =n1>r 1 = n2 > r 2. Dãy số nguyên dươngnày giảm dần và cần phải kết thúc ở 0, do đó sau một số hữu hạn bước nào đó giá trịcủa r phải = 0 và thuật toán phải dừng lại.

Với một vấn đề đặt ra, có thể có một hoặc nhiều thuật toán giải. Một vấn đề có thuậttoán giải gọi là vấn đề giải được (bằng thuật toán). Chẳng hạn, tìm nghiệm của hệ phương tr ình tuyến tính là vấn đề giải được. Một vấn đề không tồn tại thuật toán gọi làvấn đề không giải được (bằng thuật toán). Một trong những thành tựu suất xắc nhấtcủa toán học thế kỷ 20 là đã tìm ra những vấn đề không giải được bằng thuật toán.Chẳng hạn thuật toán chắc thắng cho người thứ hai của cờ ca rô hoặc thuật toán xácđịnh xem một máy Turing có dừng lại sau n bước không, đềulà những vấn đề không

tồn tại thuật toán giải được.1.2. Thi ết kế thuật toán

Để giải một bài toán trên máy tính điện tử (MTĐT), điều trước tiên là chúng ta phải cóthuật toán. Một câu hỏi đặt ra là làm thế nào để tìm ra được thuật toán cho một bàitoán đã đặt ra? Lớp các bài toán được đặt ra từ các ngành khoa học kỹ thuật, từ cácl ĩnh vực hoạt động của con người là hết sức phong phú và đa dạng. Các thuật toán giảicác lớp bài toán khác nhau cũng rất khác nhau. Tuy nhiên, có một số kỹ thuật thiết kếthuật toán chung như: Chia để trị (divide-and-conque), phương pháp tham ăn (greedymethod), qui hoạch động (dynamic programming)... Việc nắm được các chiến lượcthiết k ế thuật toán này là hết sức quan trọng và cần thiết vì nó giúp cho ta dễ tìm ra cácthuật toán mới cho các bài toán mới được đưa ra.

1.3. Tính đúng đắn của thuật toán

Khi một thuật toán được làm ra, ta cần phải chứng minh r ằng, thuật toán khi được thựchiện sẽ cho ta kết quả đúng với mọi dữ liệu vào hợp lệ. Điều này gọi là chứng minhtính đúng đắn của thuật toán. Việc chứng minh tính đúng đắn của thuật toán l à mộtcông việc không dễ dàng. Trong nhiều trường hợp, nó đòi hỏi ta phải có tr ình độ vàkhả năng tư duy toán học tốt.

Sau đây ta sẽ chỉ ra rằng, khi thực hiện thuật toán Euclid, g sẽ là ước chung lớn nhấtcủa hai số nguyên dương bất kỳ m, n. Thật vậy, khi thực hiện bước 1, ta có m = qn + r,trong đó q là số nguyên nào đó. Nếu r = 0 thì n là ước của m và hiển nhiên n (do đó g)là ước chung lớn nhất của m và n. Nếu r  0 thì một ước chung bất kỳ của m và n cũnglà ước chung của n và r (vì r=m-qn). Ngược lại một ước chung bất kỳ của n và r cũnglà ước chung của m và n (vì m = qn + r). Do đó ước chung lớn nhất của n và r cũng làước chung lớn nhất của ma và n. Vì vậy, khi thực hiện lặp lại bước 1, với sự thay đổigiá tr ị của m bởi n, và sự thay đổi giá trị của n bởi r, cho tới khi r=0 ta nhận được giátr ị của g là ước chung lớn nhất của các giá tr ị m và n ban đầu.

Page 8: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 8/48

 

8

1.4. Phân tích thu ật toán

Giả sử, vớ i một số bài toán nào đó chúng ta có một số thuật toán giải. Một câu hỏi mớ ixuất hiện là, chúng ta cần chọn thuật toán nào trong số các thuật toán đó để áp dụng.Việc phân tích thuật toán, đánh giá độ phức tạ p của thuật toán là nội dung của phầndưới đây sẽ giải quyết vấn đề này.

1.5. Đánh giá hiệu quả của thuật toán

Khi giải một vấn đề, chúng ta cần chọn trong số các thuật toán, một thuật toán màchúng ta cho là “tốt” nhất .Vậy ta cần lựa chọn thuật toán dựa trên cơ sở nào? Thôngthường ta dựa tr ên hai tiêu chuẩn sau đây:

1.  Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương tr ình)

2.  Thuật toán sử dụng tiết kiệm nhất các nguồn tài nguyên của máy tính, và

đặc biệt chạy nhanh nhất có thể được.Khi ta viết một chương tr ình chỉ để sử dụng một số ít lần, và cái giá của thời gian viếtchương tr ình vượt xa cái giá của chạy chương trình thì tiêu chuẩn (1) là quan tr ọngnhất. Nhưng có trường hợp ta cần viết các chương tr ình (hoặc thủ tục, hàm) để sử dụngnhiều lần, cho nhiều người sử dụng, khi đó giá của thời gian chạy chương tr ình sẽ vượtxa giá viết nó. Chẳng hạn, các thủ tục sắp xếp, tìm kiếm được sử dụng rất nhiều lần,

 bởi rất nhiều người trong các bài toán khác nhau. Trong tr ường hợp này ta cần dựatrên tiêu chuẩn 2. Ta sẽ cài đặt thuật táon có thể sẽ rất phức tạp, miễn là chương tr ìnhnhận được chạy nhanh hơn so với các chương tr ình khác.

Tiêu chuẩn 2 được xem là tính hiệu quả của thuật toán. Tính hiệu quả của thuật toán bao gồm hai nhân tố cơ bản:

Dung lượng không gian nhớ cần thiết để lưu giữ các giữ liệu vào, các k ết quả tính toántrung gian và các k ết quả của thuật toán.

Thời gian cần thiết để thực hiện thuật toán (ta gọi là thời gian chạy). Chúng ta chỉ quantâm đến thời gian thực hiện thuậ toán, có nghĩa là ta nói đến đánh giá thời gian thựchiện. Một thuật toán có hiệu quả được xem là thuật toán có thời gian chạy ít hơn so vớ icác thuật toán khác.

1.6. Các phương pháp biểu diễn thuật toán

Có nhiều phương pháp biểu diễn thuật toán .Có thể biểu diễn thuật toán bằng danhsách các bước, các bước được diễn đạt bằng ngôn ngữ thông thường và các ký hiệutoán học. Có thể biểu diễn thuật toán bằng sơ đồ khối. Tuy nhiên, để đảm bảo tính xácđịnh của thuật toán như đã trình bày trên, thuật toán cần được viết tr ên các ngôn ngữlập tr ình. Một chương tr ình là sự biểu diễn của một thuật toán trong ngôn ngữ lập tr ìnhđã chọn. Thông thường ta dùng ngôn ngữ lập tr ình Pascal, một ngôn ngữ thường đượcchọn để tr ình bày các thuật toán trong sách báo.

 Ngôn ngữ thuật toán là ngôn ngữ dùng để miêu tả thuật toán .Thông thường ngôn ngữthuật toán bao gồm ba loại:

Page 9: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 9/48

 

9

+ Ngôn ngữ liệt kê từng bước;

+ Sơ đồ khối;

+ Ngôn ngữ lập tr ình;

1.6.1. 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:

Thuật toán: Tên thuật toán và chức năng.

Vào: Dữ liệu vào với tên kiểu.

Ra: Các dữ liệu ra với tên kiểu.

Biến phụ (nếu có) gồm tên kiểu.

Hành động là các thao tác với các lệnh có nhãn là các số tự nhiên.

Ví d ụ. Để giải phương trình bậc hai ax2

+ bx +c = 0, ta có thể mô tả thuật toán bằngngôn ngữ liệt kê như sau:

Bước 1: Xác định các hệ số a, b, c.

Bước 2: Kiểm tra xem các hệ số a, b, c có khác 0 hay không?

 Nếu a=0 quay lại thực hiện bước 1.

Bước 3: Tính biểu thức = b2 – 4*a*c.

Bước 4: Nếu <0 thông báo phương tr ình vô nghiệm và chuyển sang bước 8.

Bước 5: Nếu =0, tính x1=x2= và chuyển sang bước 7.

Bước 6: Tính x1= , x2= và chuyển sang bước 7.

Bước 7: Thông báo các nghiệm x1, x2.

Bước 8: Kết thúc thuật toán.

1.6.2. Phương pháp sơ đồ

Phương pháp dùng sơ đồ khối mô tả thuật toán là dùng mô tả theo sơ đồ tr ên mặt phẳng các bước của thuật toán. Sơ đồ khối có ưu điểm là r ất trực giác dễ bao quát.

Để mô tả thuật toán bằng sơ đồ khối ta cần dựa vào các nút sau đây:

 Nút thao tác: Biểu diễn bằng hình chữ nhật,

 Nút điều khiển: Được biểu diễn bằng hình thoi, trong đó ghi điềukiện cần kiểm tra trong quá tr ình tính toán.

Page 10: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 10/48

 

10

 Nút khởi đầu, kết thúc: Thường được biểu diễn bằng hình tròn thểhiện sự bắt đầu hay kết thúc quá tr ình.

Cung: Đoạn nối từ nút này đến nút khác và có mũi tên chỉ hướng.

1.7. M ột số cấu trúc dữ liệu cơ bản

1.7.1. Danh sách

Khái niệm: Danh sách là một tập sắp thứ tự các phần tử cùng một kiểu. Đối với danhsách, người ta có một số thao tác: Tìm một phần tử trong danh sách, chèn một phần tửvào danh sách, xoá một phần tử khỏi danh sách, sắp xếp lại các phần tử trong danhsách theo một trật tự nào đó v.v...

Các phương pháp biểu diễn danh sách trong máy tính:

- Mảng một chiều

- Danh sách nối đơn

- Danh sách nối kép

Page 11: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 11/48

 

11

- Danh sách nối vòng một hướng

- Danh sách nối vòng hai hướng

Các phép toán cơ bản tr ên danh sách

Để thiết lập kiểu dữ liệu trừu tượng danh sách (hay ngắn gọn là danh sách) ta phải địnhngh ĩa các phép toán trên danh sách. Và như chúng ta sẽ thấy trong toàn bộ giáo tr ình,khôngc ó một tập hợp các phép toán nào thích hợp cho mọi ứng dụng (application). Vìvậy ở đây ta sẽ định nghĩa một số phép toán cơ bản nhất trên danh sách. Để thuận tiệncho việc định nghĩa ta giả sử rằng danh sách gồm các phần tử có kiểu là kiểu phần tử(elementType); vị trí của các phần tử trong danh sách có kiểu là kiểu vị trí và vị trí sau

 phần tử cuối cùng trong danh sách L là ENDLIST(L). Cần nhấn mạnh rằng khái niệmvị trí (position) là do ta định nghĩa, nó không phải là giá tr ị của các phần tử trong danhsách. Vị trí có thể là đồng nhất với vị trí lưu trữ phần tử hoặc không.

Các phép toán được định nghĩa tr ên danh sách là:

INSERT_LIST(x,p,L): xen phần tử x ( kiểu ElementType ) tại vị trí p (kiểu position) trong danh sách L. Tức là nếu danh sách là a1, a2, . , ap-1, ap,.. , an thì saukhi xen ta có k ết quả a1, a2. . . ap-1, x, ap, . . . , an. Nếu vị trí p không tồn tại trongdanh sách thì phép toán không được xác định.

LOCATE(x,L): thực hiện việc định vị phần tử có nội dung x đầu tiên trong danh sáchL. Locate tr ả kết quả là vị trí (kiểu position) của phần tử x trong danh sách. Nếu xkhông có trong danh sách thì vị trí sau phần tử cuối cùng của danh sách đượctr ả về, tức là ENDLIST(L).

RETRIEVE(p,L): lấy giá tr ị của phần tử ở vị trí p (kiểu position) của danh sách L;nếu vị trí p không có trong danh sách thì k ết quả không xác định (có thể thông báolỗi).

DELETE_LIST(p,L): chương tr ình con thực hiện việc xoá phần tử ở vị trí p (kiểu position) của danh sách. Nếu vị trí p không có trong danh sách thì phép toán khôngđược định nghĩa và danh sách L sẽ không thay đổi

NEXT(p,L): cho k ết quả là vị trí của phần tử (kiểu position) đi sau phần tử p; nếu p là phần tử cuối cùng trong danh sách L thì NEXT(p,L) cho k ết quả làENDLIST(L): Next không xác định nếu p không phải là vị trí của một phần tửtrong danh sách.

PREVIOUS(p,L): cho k ết quả là vị trí của phần tử đứng trước phần tử p trongdanh sách. Nếu p là phần tử đầu tiên trong danh sách thì Previous(p,L) không xácđịnh. Previous cũng không xác định trong trường hợp p không phải là vị trí của

 phần tử nào trong danh sách.

FIRST(L): cho k ết quả là vị trí của phần tử đầu tiên trong danh sách. Nếu danhsách r ỗng thì ENDLIST(L) được trả về.

EMPTY_LIST(L): cho k ết quả TRUE nếu danh sách có rỗng, ngược lại nó chogiá tr ị FALSE.

Page 12: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 12/48

 

12

MAKENULL_LIST(L): khởi tạo một danh sách L rỗng.

Trong thiết kế các giải thuật sau này chúng ta dùng các phép toán tr ừu tượng đãđược định nghĩa ở đây như là các phép toán nguyên thủy.

1.7.2. Đồ thị

1.7.2.1. Các định nghĩa

Một đồ thị G bao gồm một tậ p hợ  p V các đỉnh và một tậ p hợ  p E các cung, kýhiệu G=(V,E). Các đỉnh còn đượ c gọi là nút (node) hay điểm (point). Các cung nốigiữa hai đỉnh, hai đỉnh này có thể trùng nhau. Hai đỉnh có cung nối nhau gọi là haiđỉnh k ề (adjacency). Một cung nối giữa hai đỉnh v, w có thể coi như là một cặ p điểm(v,w). Nếu cặ p này có thứ tự thì ta có cung có thứ tự, ngượ c lại thì cung không có thứtự. Nếu các cung trong đồ thị G có thứ tự thì G gọi là đồ thị có hướ ng (directedgraph). Nếu các cung trong đồ thị G không có thứ tự thì đồ thị G là đồ thị vô hướ ng

(undirected graph).1.7.2.2. Biểu diễn đồ thị

Biểu diễn đồ thị bằng ma tr ận k ề

Biểu diễn đồ thị bằng danh sách các đỉnh k ề:

1.7.2.3. Các phép duyệt đồ thị

Duyệt theo chiều sâu (depth-first search)

Duyệt theo chiều r ộng (breadth-first search)

1.7.3. Cây1.7.3.1. Các thuật ngữ cơ bản tr ên cây

Cây là một tậ p hợ  p các phần tử gọi là nút (nodes) trong đó c ó một nút đượ c phân biệtgọi là nút gốc (root). Trên tậ p hợ  p các nút này có một quan hệ, gọi là mối quan hệcha - con (parenthood), để xác định hệ thống cấu trúc trên các nút. Mỗi nút, tr  ừ nútgốc, có duy nhất một nút cha. Một nút có thể có nhiều nút con hoặc không có nút connào. Mỗi nút biểu diễn một phần tử trong tậ p hợ  p đang xét và nó có thể có một kiểunào đó bất k ỳ, thườ ng ta biểu diễn nút bằng một kí tự, một chuỗi hoặc một số ghitrong vòng tròn. Mối quan hệ cha con đượ c biểu diễn theo qui ướ c nút cha ở  dòng 

trên nút con ở dòng d ướ i và đượ c nố i bở i một đ oạn thẳ ng . Một cách hình thức ta cóthể định ngh ĩ a cây một cách đệ qui như sau:

1.7.3.2. Định nghĩa

Một nút đơ n độc là một cây. Nút này cũng chính là nút gốc của cây.

Giả sử ta có n là một nút đơ n độc và k cây T1,.., Tk vớ i các nút gốc tươ ng ứng làn1,.., nk thì có thể xây dựng một cây mớ i bằng cách cho nút n là cha của các nútn1,.., nk. Cây mớ i này có nút gốc là nút n và các cây T1,.., Tk đượ c gọi là các cây con.Tậ p r ỗng cũng đượ c coi là một cây và gọi là cây r ỗng kí hiệu. Ví dụ: xét mục lục củamột quyển sách. Mục lục này có thể xem là một cây

Page 13: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 13/48

 

13

Cây mục lục một quyển sách

 Nút gốc là sách, nó có ba cây con có gốc là C1, C2, C3. Cây con thứ 3 c ó gốc C3 làmột nút đơ n độc trong khi đó hai cây con kia (gốc C1 và C2) có các nút con.

 Nếu n1,.., nk  là một chuỗi các nút trên cây sao cho ni là nút cha của nút ni+1, vớ ii=1..k-1, thì chuỗi này gọi l à một đườ ng đ i trên cây (hay ngắn gọn là đườ ng đi ) từ n1

đến nk . Độ dài đườ ng đ i đượ c định ngh ĩa bằng số nút trên đườ ng đi tr ừ 1. Như vậy độdài đườ ng đi từ một nút đến chính nó bằng không.

 Nếu có đườ ng đi từ nút a đến nút b thì ta nói a là tiề n bố i (ancestor) của b, còn bgọi là hậu duệ (descendant) của nút a. Rõ ràng một nút vừ a là tiề n bố i vừ a là hậu

duệ của chính nó. Tiền bối hoặc hậu duệ của một nút khác vớ i chính nó gọi là tiền bối hoặc hậu duệ thực sự. Trên cây nút g ố c không có tiền bối thực sự. Một nút khôngcó hậu duệ thực sự gọi là nút lá (leaf). Nút không phải là lá ta còn gọi là nút trung 

 gian (interior). Cây con của một cây là một nút cùng vớ i tất cả các hậu duệ của nó.

Chiề u cao của một nút  là độ dài đườ ng đi lớ n nhất từ nút đó tớ i lá. Chiề u cao của

cây là chiều c a o của nút gốc. Độ sâu của một nút là độ dài đườ ng đi từ nút gốc đến nútđó. Các nút có cùng một độ sâu i ta gọi là các nút có cùng một mức i. Theo định ngh ĩ anày thì nút gốc ở mức 0, các nút con của nút gốc ở mức 1.

1.7.3.3. Các thứ tự duyệt cây quan trọng

Duyệt cây là một qui tắc cho phép đi qua lần lượ t tất cả các nút của cây mỗi nút đúngmột lần, danh sách liệt kê các nút (tên nút hoặc giá tr  ị chứa bên trong nút) theo thứ tựđi qua gọi là danh sách duyệt cây. Có ba cách duyệt cây quan tr  ọng:  Duyệt tiề n t ự (preorder), duyệt trung t ự  (inorder), duyệt hậu t ự  (posorder). Có thể định ngh ĩ a các

 phép duyệt cây tổng quát một cách đệ qui như sau:

Cây r ỗng thì danh sách duyệt cây là r  ỗng và nó đượ c coi là biểu thức duyệt tiền tự,trung tự, hậu tự của cây.

Cây chỉ có một nút thì danh sách duyệt cây gồm chỉ một nút đó và nó đượ c coi là biểu thức duyệt tiền tự, trung tự, hậu tự của cây.

 Ngượ c lại: giả sử cây T có nút gốc là n và có các cây con là T1,..,Tn thì:o Biểu thức duyệt tiền tự của cây T là liệt kê nút n k  ế tiế p là biểu thức

duyệt tiền tự của các cây T1, T2, .., Tn theo thứ tự đó.o Biểu thức duyệt trung tự của cây T là biểu thức duyệt trung tự của cây T1

k ế tiế p là nút n r ồi đến biểu thức duyệt trung tự của các cây T2,.., Tn theothứ tự đó.

o Biểu thức duyệt hậu tự của cây T là biểu thức duyệt hậu tự của các cây

Page 14: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 14/48

 

14

T1, T2,.., Tn theo thứ tự đó r ồi đến nút n.

Ví dụ cho cây như trong hình

Biểu thức duyệt tiền tự: A B C D E F H K L

Trung tự: C B E D F A K H L

Hậu tự: C E F D B K L H A

1.7.3.4. Các phép toán trên cây

Hàm PARENT(n,T) cho nút cha của nút n trên cây T, nếu n là nút gốc thì hàmcho giá tr ị NULL. Trong cài đặt cụ thể thì NULL là một giá tr  ị nào đó do ta chọn,nó phụ thuộc vào cấu trúc dữ liệu mà ta dùng để cài đặt cây.

Hàm LEFTMOST_CHILD(n,T) cho nút con trái nhất của nút n trên cây T, nếun là lá thì hàm cho giá tr ị NULL.

Hàm RIGHT_SIBLING(n,T) cho nút anh em ruột phải nút n trên cây T, nếu nkhông có anh em ruột phải thì hàm cho giá tr ị NULL.

Hàm LABEL_NODE(n,T) cho nhãn tại nút n của cây T.

Hàm ROOT(T) tr ả ra nút gốc của cây T. Nếu Cây T r ỗng thì hàm tr ả về NULL.

Hàm CREATEi(v,T1,T2,..,Ti),vớ i i=0..n, thủ tục tạo c â y mớ i c ó n ú t gốc l à n đượ c

gán nhãn v và có i cây con T1,..,Ti. Nếu n= 0 thì thủ tục tạo cây mớ i chỉ gồm có1nút đơ n độc là n có nhãn v. Chẳng hạn, giả sử ta có hai cây con T1 và T2, tamuốn thiết lậ p cây mớ i vớ i nút gốc có nhãn là v thì lờ i gọi thủ tục sẽ làCREATE2(v,T1,T2).

1.7.3.5. Cài đặt cây

Cài đặt cây bằng mảng

Biểu diễn cây bằng danh sách các con

Biểu diễn theo con trái nhất và anh em ruột phải:

1.7.3.6. Cây nhị phân (Binary Trees)Định ngh ĩ a: Cây nhị  phân là cây r ỗng hoặc là cây mà mỗi nút có tối đa hai nút con.Hơ n nữa các nút con của cây đượ c phân biệt thứ tự rõ ràng, một nút con gọi là nút contrái và một nút con gọi là nút con phải. Ta qui ướ c vẽ nút con trái bên trái nút cha vànút con phải bên phải nút cha, mỗi nút con đượ c nối vớ i nút cha của nó bở i mộtđoạn thẳng.1.7.3.7. Cây tìm kiếm nhị phân (Binary Search Trees)

Định ngh ĩa: Cây tìm kiếm nhị phân (TKNP) là cây nhị phân mà khoá tại mỗi nút câylớn hơn khoá của tất cả các nút thuộc cây con bên trái và nhỏ hơn khoá của tất cả các

nút thuộc cây con bên phải. Lưu ý: dữ liệu lưu trữ tại mỗi nút có thể r ất phức tạp như

Page 15: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 15/48

 

15

là một record chẳng hạn, trong trườ ng hợ  p này khoá của nút đượ c tính dựa trên mộttrường nào đó, ta gọi là trườ ng khoá. Trườ ng khoá phải chứa các giá tr ị có thể so sánhđượ c, tức là nó phải lấy giá tr ị từ một tậ p hợ  p có thứ tự.

1.7.4. Tập hợp

1.7.4.1. Định nghĩa

Tậ p hợ  p là một khái niệm cơ bản trong toán học. Tậ p hợp được dùng để môhình hoá hay biểu diễn một nhóm bất k ỳ các đối tượ ng trong thế giớ i thựccho nên nó đóng vai tr ò r ất quan tr ọng trong mô hình hoá cũng như trongthiết k ế các giải thuật.

Khái niệm tậ p hợ  p cũng như trong toán học, đó là sự tậ p hợ  p các thành viên(members) hoặc phần tử (elements). Tất cả các phần tử của tậ p hợ  p là khácnhau. Tậ p hợ  p có thể có thứ tự hoặc không có thứ tự, tức là, có thể có quanhệ thứ tự xác định trên các phần tử của tậ p hợ  p hoặc không. Tuy nhiên,trong chương này, chúng ta giả sử r ằng các phần tử của tậ p hợ  p có thứ tựtuyến tính, tức là, trên tậ p hợ  p S có quan hệ < và = thoả mản hai tính chất:

Vớ i mọi a,b S thì a<b hoặc b<a hoặc a=b

Vớ i mọi a,b,c S, a<b và b<c thì a<c

1.7.4.2. Các phép toán cơ bản tr ên kiểu dữ liệu tập hợp

Cũng như các kiểu dữ liệu tr ừu tượ ng khác, các phép toán k ết hợ  p vớ i môhình tậ p hợ  p sẽ tạo thành một kiểu dữ liệu tr ừu tượ ng là r ất đa dạng. Tùytheo nhu cầu của các ứng dụng mà các phép toán khác nhau sẽ được định

ngh ĩa tr ên tậ p hợ  p. Ở đây ta đề cập đến một số phép toán thườ ng gặ p nhấtnhư sau:

Thủ tục UNION(A,B,C) nhận vào 3 tham số là A,B,C; Thực hiện phép toán lấyhợ  p của hai tậ p A và B và tr ả ra k ết quả là tậ p hợ  p C = A B.

Thủ tục INTERSECTION(A,B,C) nhận vào 3 tham số là A,B,C; Thực hiện phép toánlấy giao của hai tậ p A và B và tr ả ra k ết quả là tậ p hợ  p C = A B.

Thủ tục DIFFERENCE(A,B,C) nhận vào 3 tham số là A,B,C; Thực hiện phéptoán lấy hợ  p của hai tậ p A và B và tr ả ra k ết quả là tậ p hợ  p C = A\B

Hàm MEMBER(x,A) cho k ết quả kiểu logic (đúng/sai) tùy theo x có thuộcA hay không. Nếu x A thì hàm cho k ết quả là 1 (đúng), ngượ c lại cho k ết quả 0(sai).

Thủ tục MAKENULLSET(A) tạo tậ p hợ  p A tậ p r ỗng

Thủ tục INSERTSET(x,A) thêm x vào tậ p hợ  p A

Thủ tục DELETESET(x,A) xoá x khỏi tậ p hợ  p A

Thủ tục ASSIGN(A,B) gán A cho B ( tức là B:=A )

Hàm MIN(A) cho phần tử bé nhất trong tậ p A

Page 16: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 16/48

 

16

Hàm EQUAL(A,B) cho k ết quả TRUE nếu A=B ngượ c lại cho k ết quả FALSE

1.7.4.3. Cài đặt tập hợp

Cài đặt tậ p hợ  p bằng vector Bit

Cài đặt bằng danh sách liên k ết1.8. Ngôn ng ữ tựa Pascal 

1.8.1. Bảng chữ cái và ký tự chủ yếu

 Ngôn ngữ tựa Pascal được sử dụng dùng để mô tả các bước của thuật toán. Nó có đặcđiểm là giúp mô tả thuật toán gần gũi với một chương tr ình máy tính và làm mô tảthuật toán trở nên chính xác hơn. Dưới đây là liệt kê một số câu lệnh chính được sửdụng để mô tả thuật toán dùng ngôn ngữ lập tr ình Pascal:

Ký tự và biểu thức

Các ký tự la tinh: A, a... Z, z. Chữ số: 0…9.

Các phép toán số học: +, - , *, /

Các phép toán quan hệ : < , >, =,

Giá tr ị logic: T (true), F (false)

Phép toán logic: and, or, not

Hằng đó là các giá tr ị cụ thể nào đó

Tên biến: Là một dãy kí tự mà kí tự đầu phải là chữ cái.

Có hai loại biến chính:

Loại integer (biến nguyên). Ví dụ Var  bien: integer;

Loại Real (biến thực) .Ví dụ var bien real;

Biến chỉ số. Ví dụ A. Ở đây i là các biến nguyên.

Biểu thức là k ết hợp các hằng, biến và các phép toán.

1.8.2. Một số câu lệnh chính

Đầu chương tr ình program (tên chương tr ình) .Tên chương tr ình có cấu trúc giống tên biến .

Ví dụ. Program giai_pt;

...............................

Các thủ tục và hàm

Câu lệnh Procedure (function). Mô tả thuật toán trong ngôn ngữ phỏng Pascal, được bắt đầu bằng câu lệnh procedure (function), trong đó ta đặt tên cho thuật toán và mô tảdanh sách biến của thuật toán. Chẳng hạn, câu lệnh

Page 17: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 17/48

 

17

Function max(a,b,c);

Cho biết tên của thuật toán là max và các biến là a, b, c

Procedure move(n,A,B,C);

Cho biết tên thuật toán được mô tả là move với các biến là n, A, B, C;Các bước của thuật toán được mô tả trong thân thủ tục (hàm) được bắt đầu bởiBegin và k ết thúc bởi end.

Ví dụ. Function max(a,b,c);

Begin

........ (thân hàm)

End;

Procedure move(n,A,B,C);

Begin

......... (thân thủ tục)

end;

Câu lệnh gán

Câu lệnh gán được dùng để gán giá trị cho các biến Vế trái của câu lệnh gán là tên của biến , còn vế phải là biểu thức của các hằng , biến đã gán giá tr ị hoặc các hàm đã đượcđịnh nghĩa. Ký

hiệu

:=được sử dụng để biểu diễn phép gán.

Ví dụ.

Variable := exp;

Max := a;

x := số lớn nhất trong các số a,b,c…

Khối câu lệnh

Các câu lệnh có thể nhóm lại thành một khối. Để mô tả khối lệnh ta sử dụng Begin vàend

Ví dụ.

Begin

Câu lệnh 1;

Câu lệnh 2;

..................

Câu lệnh n;

End;

Page 18: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 18/48

 

18

Các câu lệnh trong khối được thực hiện tuần tự. Dưới đây thuật ngữ câu lệnh đượcdùng để chỉ chung một câu lệnh cũng như một khối câu lệnh.

Chú giải. Để diễn giải thêm nội dung của các đoạn lệnh có thể dùng câu diễn giải. Cácdòng diễn giải được đặt trong dấu hoặc ()

Ví dụ. (*a là số phần tử lớn nhất trong danh sách L*) k là số phần tử của danh sách L

Câu lệnh điều kiện.

Câu lệnh đơn giản là

If  điều kiện then câu lệnh;

Khi thực hiện câu lệnh, điều kiện sẽ được kiểm tra, nếu nó được thoả mãn thì câu lệnhsẽ được thực hiện.

 Nhiều khi ta cần thực hiện một thao tác nào đó khi điều kiện được thực hiện còn nếungược lại ta phải thực hiện một thao tác khác. Khi đó ta có thể thực hiện câu lệnh phứctạp hơn sau đây:

If điều kiện then câu lệnh 1

else câu lệnh 2;

Các câu lệnh lặp.

Các câu lệnh sau đây sẽ được sử dụng

For biến := giá tr ị đầu to giá trị cuối do câu lệnh;

Tại đầu vòng lặp, biến được sẽ gán cho giá tr ị đầu, nếu giá trị đầu nhỏ hơn hơnhoặc bằng giá trị cuối và câu lệnh được thực hiện với giá trị này của biến. Tiếp đến giátr ị của biến sẽ tăng lên 1và câu lệnh sẽ được thực hiện với giá trị mới của  biến. Quátrình sẽ được tiếp tục cho đến khi biến bằng giá tr ị cuối. Sau khi thực hiện câu lệnh với

 biến bằng giá trị cuối sẽ chuyển sang thực hiện câu lệnh tiếp theo. Nếu giá trị đầu lớnhơn giá trị cuối thì không có câu lệnh nào được thực hiện.

Câu lệnh lặp thứ hai được sử dụng là câu lệnh “while”

While điều kiện do câu lệnh;

Khi câu lệnh này được sử dụng, điều kiện sẽ được kiểm tra, nếu nó là đúng thì câulệnh được thực hiện .Điều đó sẽ tiếp tục cho đến khi điều kiện sai.

Câu lệnh tiếp theo được sử dụng là câu lệnh “repeat”

Repeat câu lệnh

......................

until điều kiện;

Khi câu lệnh này được sử dụng thì câu lệnh trong vòng lặp được thực hiện, điều đócó thể sẽ dẫn đến sự thay đổi giá trị của các biến trong điều kiện. Nếu điều kiện vẫn là

Page 19: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 19/48

 

19

đúng, thì câu lệnh lại được thực hiện. Điều đó sẽ tiếp diễn cho đến khi điều kiện làđúng.

Ví dụ. Để giải phương tr ình bậc hai ax2 + bx + c = 0 ta mô tả thuật toán  bằng mộtchương tr ình viết trên Pascal như sau:

Program giai_PT;Var 

a,b,c, denta, x1, x2 : real;

Begin

Clrscr;

Write(‘Nhập hệ số:’);

RepeatWrite(‘a:=’);readln(a);

Write(‘b:=’);readln(b);

Write(‘c:=’);readln(c);

Until a<>0;

Denta:=sqr(b)-4*a*c;

If denta<0 then

BeginWrite(‘phương tr ình vô nghiệm’);

Halt;

End

Else

Begin

If denta=0 then

BeginWrite(‘phương trình có nghiệm kép x=’,(b/(2*a)));

Exit;

End

Else

Begin

X1:=(-b-sqrt(denta))/(2*a);

X2:=(-b+sqrt(denta))/(2*a);

Page 20: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 20/48

 

20

Write(‘phương tr ình có hai nghiệm phân biệt:’);

Write(‘x1 = ‘ , x1 , ’x2 = ‘,x2);

Exit;

End;End;

Readln;

End.

Bài t ập chương 

1. Xác định số phép tính so sánh nhiều nhất có thể trong thuật toán của bạn tìm phần tửlớn nhất của một dãy n số thực cho trước.

2. Xác định số phép tính so sánh nhiều nhất có thể trong thuật toán của bạn để xếp lạimột dãy có n số thực theo thứ tự tăng dần.

3. Xác định số bước thực hiện nhiều nhất có thể trong thuật toán của bạn nhằm xácđịnh được nhiều nhất có thể các số liên tiếp nhau có tổng dương trong một dãy n sốhạng cho trước.

4. Mô tả các thuật toán của bạn bằng sơ đồ khối:

a) Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số thực.

 b) Thuật toán tìm phần tử bé nhất của một tập con của tập hợp.

c) Thuật toán xếp lại một dãy theo thứ tự tăng dần.d) Thuật toán tìm một dãy các số liên tiếp nhau (dài nhất có thể) có tổng dương trongmột dãy số thực cho trước.

5. Viết các thuật toán của bạn bằng ngôn ngữ tựa Pascal:

a) Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số thực.

 b) Thuật toán tìm phần tử bé nhất của một tập hợp con của tập hợp.

c) Thuật toán xếp lại một dãy theo thứ tự tăng dần.

d) Thuật toán tìm một dãy các số liên tiếp nhau (dài nhất có thể) có tổng dương trong

một dãy số thực cho trước.

Page 21: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 21/48

 

21

Chương II: Độ phức tạp tính toán và tính hiệu quảcủa thuật toán

2.1 T ỔNG QUAN 

2.1.1. Mục tiêu

Sau khi học chương này, sinh viên cần phải tr ả lờ i đượ c các câu hỏi sau:

Tại sao cần phân tích đánh giá giải thuật?

Tiêu chuẩn nào để đánh giá một giải thuật là tốt?

Phương  pháp đánh giá như thế nào? (đánh giá chương tr ình không gọi chươ ngtrình con, đánh giá một chươ ng trình có gọi các chương trình con không đệ quy vàđánh giá chươ ng trình đệ quy).

2.1.2. Kiến thức cơ bản cần thiết

Các kiến thức cơ  bản cần thiết để học chươ ng này bao gồm:

Kiến thức toán học: Công thức tính tổng n số tự nhiên đầu tiên, công thức tínhtổng n số hạng đầu tiên của một cấ p số nhân, phương pháp chứng minh quy nạ pvà các kiến thức liên quan đến logarit (biến đổi logarit, tính chất đồng biếncủa hàm số logarit).

K  ĩ thuật lậ p trình và lậ p trình đệ quy.

2.1.3. Nội dung cốt lõiTrong chươ ng này chúng ta sẽ nghiên cứu các vấn đề sau:

Sự cần thiết phải phân tích các giải thuật.

Thờ i gian thực hiện của chương tr ình.

Tỷ suất tăng và độ phức tạ p của giải thuật.

Tính thờ i gian thực hiện của chương tr ình.

Phân tích các chương trình đệ quy.

2.2. S Ự CẦN T HI ẾT PHẢI PHÂN TÍCH THUẬT TOÁN 

Trong khi giải một bài toán chúng ta có thể có một số giải thuật khác nhau, vấn đề làcần phải đánh giá các giải thuật đó để lựa chọn một giải thuật tốt (nhất). Thôngthườ ng thì ta sẽ căn cứ vào các tiêu chuẩn sau:

1. Giải thuật đúng đắn.

2. Giải thuật đơ n giản.

3. Giải thuật thực hiện nhanh.

Vớ i yêu cầu (1), để kiểm tra tính đúng đắn của giải thuật chúng ta có thể cài đặt giải

Page 22: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 22/48

 

22

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 chắc chắn bở i vì cóthể giải thuật đúng vớ i tất cả các bộ dữ liệu chúng ta đã thử nhưng lại sai vớ i một bộdữ liệu nào đó. Vả lại cách làm này chỉ  phát hiện ra giải thuật sai chứ chưa chứngminh đượ c là nó đúng. Tính đúng đắn của giải thuật cần phải đượ c chứng minh

 bằng toán học. Tất nhiên điều này không đơ n giản và do vậy chúng ta sẽ không đềcậ p đến ở đây.

Khi chúng ta viết một chươ ng trình để sử dụng một vài lần thì yê u cầu (2) là quantr ọng nhất. Chúng ta cần một giải thuật dễ viết chương trình để nhanh chóng cóđượ c k ết quả, thờ i gian thực hiện chươ ng trình không đượ c đề cao vì dù sao thìchươ ng trình đó cũng chỉ sử dụng một vài lần mà thôi.

Tuy nhiên khi một chương trình đượ c sử dụng nhiều lần thì thì yêu cầu tiết kiệmthờ i gian thực hiện chươ ng trình lại r ất quan tr  ọng đặc biệt đối vớ i những chươ ngtrình mà khi thực hiện cần dữ liệu nhậ p lớ n 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.

2.3 TH ỜI GIAN THỰC HIỆN CỦA CHƯƠNG TR ÌNH 

Một phươ ng pháp để xác định hiệu quả thờ i gian thực hiện của một giải thuật là lậ ptrình nó và đo lườ ng thờ i gian thực hiện của hoạt động trên một máy tính xác địnhđối vớ i tậ p hợp đượ c chọn lọc các dữ liệu vào.

Thờ i gian thực hiện không chỉ  phụ thuộc vào giải thuật mà còn phụ thuộc vào tậ pcác chỉ thị của máy tính, chất lượ ng của máy tính và k   ĩ xảo của ngườ i lậ p trình. Sựthi hành cũng có thể điều chỉnh để thực hiện tốt trên tậ p đặc biệt các dữ liệu vào

đượ c chọn. Ðể vượ t qua các tr  ở ngại này, các nhà khoa học máy tính đã chấ p nhậntính phức tạ p của thờ i gian đượ c tiế p cận như một sự đo lườ ng cơ  bản sự thực thicủa giải thuật. Thuật ngữ tính hiệu quả sẽ đề cậ p đến sự đo lườ ng này và đặc biệtđối vớ i sự phức tạ p thời gian trong trườ ng hợ  p xấu nhất.

2.3.1. Thời gian thực hiện chương tr  ình.

Thờ i gian thực hiện mộ t chương t r ình là một hàm của kích thướ c dữ liệu vào, kýhiệu T(n) trong đó n là kích thướ c (độ lớ n) của dữ liệu vào.

Ví dụ 2-1: Chương tr ình tính tổng của n số có thờ i gian thực hiện là T(n) = cn trong đó

c là một hằng số.Thờ i gian thực hiện chương tr ình là một hàm không âm, tức là T(n) 0 n 0.

2.3.2 Ðơn vị đo thời gian thực hiện.

Ðơ n vị của T(n) không phải là đơ n vị đo thờ i gian bình thườ ng như giờ , phút giây...mà thườ ng đượ c xác định bở i số các lệnh đượ c thực hiện trong một máy tính lýtưở ng.

Ví dụ 2-2: Khi ta nói thờ i gian thực hiện của một chương trình là T(n) = Cn thì cóngh ĩ a là chương tr ình ấy cần Cn chỉ thị thực thi.

Page 23: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 23/48

 

23

2.3.3. Thời gian thực hiện trong trường hợp xấu nhất.

 Nói chung thì thờ i gian thực hiện chươ ng trình không chỉ  phụ thuộc vào kích thướ cmà còn phụ thuộc vào tính chất của dữ liệu vào. Ngh ĩ a là dữ liệu vào có cùng kíchthướ c nhưng thờ i gian thực hiện chươ ng trình có thể khác nhau. Chẳng hạn chương

trình sắ p xế p dãy số nguyên tăng dần, khi ta cho vào dãy có thứ tự thì thờ i gianthực hiện khác vớ i khi ta cho vào dãy chưa có thứ tự, hoặc khi ta cho vào một dãyđã có thứ tự tăng thì thờ i gian thực hiện cũng khác so vớ i khi ta cho vào một dãy đãcó thứ tự giảm.

Vì vậy thườ ng ta coi T(n) là thờ i gian thực hiện chương trình trong tr ườ ng hợ  p xấunhất trên dữ liệu vào có kích thướ c n , tức là: T(n) là thờ i gian lớ n nhất để thực hiệnchươ ng trình đối vớ i mọi dữ liệu vào có cùng kích thướ c n.

2.4. T Ỷ SUẤT TĂNG V  À ÐỘ PHỨC TẠP CỦA GIẢI THUẬT 

2.4.1. Tỷ suất tăng

Ta nói r  ằng hàm không âm T(n) có tỷ suất tăng (growth rate) f(n) nếu tồn tại cáchằng số C và N0 sao cho T(n) ≤ Cf(n) vớ i mọi n ≥ N0.

Ta có thể chứ ng minh đượ c r ằ ng “Cho một hàm không âm T(n) bấ t k  ỳ , ta luôn tìm

đượ c t  ỷ suất tăng f (n) của nó”.

Ví dụ 2-3: Giả sử T(0) = 1, T(1) = 4 và tổng quát T(n) = (n+1)2. Ðặt N0 = 1 và C = 4thì vớ i mọi n ≥1 chúng ta dễ dàng chứng minh đượ c r ằng T(n) = (n+1)2 ≤ 4n2 vớ imọi n ≥ 1, tức là tỷ suất tăng của T(n) là n2.

Ví dụ 2-4: Tỷ suất tăng của hàm T(n) = 3n3 + 2n2 là n3. Thực vậy, cho N0 = 0 và C= 5 ta dễ dàng chứng minh r ằng vớ i mọi n ≥ 0 thì 3n2 + 2n2 ≤ 5n3

2.4.2. Khái niệm độ phức tạp của giải thuật

Giả sử ta có hai giải thuật P1 và P2 vớ i thờ i gian thực hiện tương ứng là T1(n) =100n2 (vớ i tỷ suất tăng là n2) và T2(n) = 5n3 (vớ i tỷ suất tăng là n3). Giải thuật nàosẽ thực hiện nhanh hơ n? Câu tr  ả lờ i phụ thuộc vào kích thướ c dữ liệu vào. Vớ i n <20 thì P2 sẽ nhanh hơ n P1 (T2<T1), do hệ số của 5n3 nhỏ hơ n hệ số của 100n2

(5<100). Nhưng khi n > 20 thì ngươ c lại d o số mũ của 100n2 nhỏ hơ n số mũ của 5n3

(2<3). Ở đây chúng ta chỉ nên quan tâm đến trườ ng hợ  p n>20 vì khi n<20 thì thờ igian thực hiện của cả P1 và P2 đều không lớ n và sự khác biệt giữa T1 và T2 làkhông đáng k ể.

 Như vậy một cách hợ  p lý là ta xét tỷ suất tăng của hàm thờ i gian thực hiện chươngtrình thay vì xét chính bản thân thờ i gian thực hiện.

Cho một hàm T(n), T(n) g ọi là có độ phứ c t ạ p f(n) nế u t ồn t ại các hằ ng C, N  0  sao

cho T(n) ≤ Cf(n) vớ i mọi n ≥  N 0 (t ứ c là T(n) có t   ỷ suấ t t ăng là f(n)) và kí hiệu T(n)

là O(f(n)) ( đọc l à “ ô của f(n)”)

Ví dụ 2-5: T(n)= (n+1)

2

có tỷ suất tăng là n

2

nên T(n)= (n+1)

2

là O(n

2

)

Page 24: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 24/48

 

24

Chú ý: O(C.f(n))=O(f(n)) vớ i C là hằng số. Ðặc biệt O(C) = O(1)

 Nói cách khác độ phức tạ p tính toán của giải thuật là một hàm chặn trên của hàmthờ i gian. Vì hằng nhân tử C trong hàm chặn trên không có ý ngh ĩa nên ta có thể

 bỏ qua vì vậy hàm thể hiện độ phức tạ p có các dạng thườ ng gặ p sau: log2n, n,

nlog2n, n2

, n3

, 2n

, n!, nn

. Ba hàm cuối cùng ta gọi là dạng hàm mũ, các hàm khácgọi là hàm đa thức. Một giải thuật mà thờ i gian thực hiện có độ phức tạ p là mộthàm đa thức thì chấ p nhận đượ c tức là có thể cài đặt để thực hiện, còn các giảithuật có độ phức tạ p hàm mũ thì phải tìm cách cải tiến giải thuật.

Vì ký hiệu log2n thườ ng có mặt trong độ phức tạ p nên trong khuôn khổ tài liệunày, ta sẽ dùng logn thay thế cho log2n vớ i mục đích duy nhất là để cho gọntrong cách viết.

Khi nói đến độ phức tạ p của giải thuật là ta muốn nói đến hiệu quả của thờ i gianthực hiện của chương tr ình nên ta có thể xem việc xác định thờ i gian thực hiên

của chương tr ình chính là xác định độ phức tạ p của giải thuật.2.5. CÁCH TÍNH ÐỘ PHỨC TẠP 

Cách tính độ phức tạ p của một giải thuật bất k ỳ là một vấn đề không đơn giản.Tuy nhiên ta có thể tuân theo một số nguyên tắc sau:

2.5.1. Qui tắc cộng

 Nếu T1(n) và T2(n) là thờ i gian thực hiện của hai đoạn chươ ng trình P1 và P2; vàT1(n)=O(f(n)), T2(n)=O(g(n)) thì thờ i gian thực hiện của đoạn hai chươ ng trình đónối tiếp nhau là T(n)=O(max(f(n),g(n)))

Ví dụ 2-6: Lệnh gán x:=15 tốn một hằng thờ i gian hay O(1), Lệnh đọc dữ liệuREAD(x) tốn một hằng thờ i gian hay O(1). Vậy thờ i gian thực hiện cả hai lệnh trênnối tiế p nhau là O(max(1,1))=O(1)

2.5.2. Qui tắc nhân

 Nếu T1(n) và T2(n) là thờ i gian thực hiện của hai đoạn chươ ng trình P1và P2 vàT1(n) = O(f(n)), T2(n) = O(g(n)) thì thờ i gian thực hiện của đoạn hai đoạn chươ ngtrình đó lồng nhau là T(n) = O(f(n).g(n))

2.5.3. Qui tắc tổng quát để phân tích một chương tr  ìnhThờ i gian thực hiện của mỗi lệnh gán, READ, WRITE là O(1).

Thờ i gian thực hiện của một chuỗi tuần tự các lệnh đượ c xác định bằng qui tắc cộng. Như vậy thờ i gian này là thờ i gian thi hành một lệnh nào đó lâu nhất trong chuỗilệnh.

Thờ i gian thực hiện cấu trúc IF là thờ i gian lớ n nhất thực hiện lệnh sau THEN hoặcsau ELSE và thờ i gian kiểm tra điều kiện. Thườ ng thờ i gian kiểm tra điều kiện làO(1).

Thờ i gian thực hiện vòng lặ p là tổng (trên tất cả các lần lặ p) thờ i gian thực hiện thân

Page 25: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 25/48

 

25

vòng lặ p. Nếu thờ i gian thực hiện thân vòng lặ p không đổi thì thờ i gian thực hiệnvòng lặ p là tích của số lần lặ p vớ i thờ i gian thực hiện thân vòng lặ p.

Ví dụ 2-7: Tính thờ i gian thực hiện của thủ tục sắ p xế p “nổi bọt”

PROCEDURE Bubble(VAR a: ARRAY[1..n] OF integer);

VAR i,j,temp: Integer;

BEGIN

{1} FOR i:=1 TO n-1 DO

{2} FOR j:=n DOWNTO i+1 DO

{3} IF a[j-1]>a[j]THEN BEGIN{hoán vị a[i], a[j]}

{4} temp := a[j-1];

{5} a[j-1] := a[j];

{6} a[j] := temp;

END;

END;

Về giải thuật sắ p xế p nổi bọt, chúng ta sẽ bàn k  ĩ hơ n trong chươ ng 2. Ở đây, chúng tachỉ quan tâm đến độ phức tạ p của giải thuật.

Ta thấy toàn bộ chương trình chỉ gồm một lệnh lặ p {1}, lồng trong lệnh {1} là lệnh{2}, lồng trong lệnh {2} là lệnh {3} và lồng trong lệnh {3} là 3 lệnh nối tiế p nhau{4}, {5} và {6}. Chúng ta sẽ tiến hành tính độ phức tạ p theo thứ tự từ trong ra.

Tr ướ c hết, cả ba lệnh gán {4}, {5} và {6} đều tốn O(1) thờ i gian, việc so sánh a[j-1] >

a[j] cũng tốn O(1) thờ i gian, do đó lệnh {3} tốn O(1) thờ i gian.Vòng lặ p {2} thực hiện (n-i) lần, mỗi lần O(1) do đó vòng lặ p {2} tốn O((n-i).1) =O(n-i).Vòng lặ p {1} lặ p có I chạy từ 1 đến n-1nên thờ i gian thực hiện của vòng lặ p{1} và cũng là độ phức tạ p của giải thuật là:

Chú ý: Trong trườ ng hợ  p vòng lặ p không xác định đượ c số lần lặ p thì chúng ta phảilấy số lần lặ p trong trườ ng hợ  p xấu nhất.

Ví dụ 2-8: Tìm kiếm tuần tự. Hàm tìm kiếm Search nhận vào một mảng a có n sốnguyên và một số nguyên x, hàm sẽ tr ả về giá tr ị logic TRUE nếu tồn tại một phần tửa[i] = x, ngượ c lại hàm tr ả về FALSE.

Giải thuật tìm kiếm tuần tự là lần lượ t so sánh x vớ i các phần tử của mảng a, bắt đầu từa[1], nếu tồn tại a[i] = x thì dừng và tr  ả về TRUE, ngượ c lại nếu tất cả các phần tửcủa a đều khác X thì tr ả về FALSE.

FUNCTION Search(a:ARRAY[1..n] OF Integer;x:Integer):Boolean; VARi:Integer; Found:Boolean;

BEGIN

Page 26: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 26/48

 

26

{1} i:=1;

{2} Found:=FALSE;

{3} WHILE(i<=n)AND (not Found) DO

{4} IF A[i]=X THEN Found:=TRUE ELSE i:=i+1;

{5} Search:=Found;

END;

Ta thấy các lệnh {1}, {2}, {3} và {5} nối tiế p nhau, do đó độ  phức tạ p của hàmSearch chính là độ  phức tạ p lớ n nhất trong 4 lệnh này. Dễ dàng thấy r ằng ba lệnh{1}, {2} và {5} đều có độ phức tạ p O(1) do đó độ phức tạ p của hàm Search chính làđộ phức tạ p của lệnh {3}. Lồng trong lệnh {3} là lệnh {4}. Lệnh {4} có độ phức tạ pO(1). Trong tr ườ ng hợ  p xấu nhất (tất cả các phần tử của mảng a đều khác x) thìvòng lặ p {3} thực hiện n lần, vậy ta có T(n) = O(n).

2.5.4. Ðộ phức tạp của chương tr  ình có gọi chương tr  ình con không đệ

qui

 Nếu chúng ta có một chươ ng trình vớ i các chươ ng trình con không đệ quy, để tínhthờ i gian thực hiện của chương trình, tr ướ c hết chúng ta tính thờ i gian thực hiện củacác chương trình con không gọi các chương trình con khác. Sau đó chúng ta tínhthờ i gian thực hiện của các chươ ng trình con chỉ gọi các chương trình con mà thờ igian thực hiện của chúng đã đượ c tính. Chúng ta tiế p tục quá trình đánh giá thờ igian thực hiện của mỗi chươ ng trình con sau khi thờ i gian thực hiện của tất cả cácchươ ng trình con mà nó gọi đã đượ c đánh giá. Cuối cùng ta tính thờ i gian cho chươ ng

trình chính.Giả sử ta có một hệ thống các chương trình gọi nhau theo sơ đồ sau:

Hình 2- 1: Sơ đồ g ọi thự c hi ện các chương tr ình con không đệ quy 

Chương trình A gọi hai chương trình con là B và C, chương trình B gọi hai chươ ngtrình con là B1 và B2, chươ ng trình B1 gọi hai chương tr ình con là B11 và B12.

Ðể tính thờ i gian thực hiện của A, ta tính theo các bướ c sau:

1. Tính thờ i gian thực hiện của C, B2, B11 và B12. Vì các chươ ng trình connày không gọi chương tr ình con nào cả.

2. Tính thờ i gian thực hiện của B1. Vì B1 gọi B11 và B12 mà thờ i gian thựchiện của B11 và B12 đã đượ c tính ở  bướ c 1.

Page 27: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 27/48

 

27

3. Tính thờ i gian thực hiện của B. Vì B gọi B1 và B2 mà thờ i gian thực hiệncủa B1 đã đượ c tính ở  bướ c 2 và thờ i gian thực hiện của B2 đã đượ c tính ở 

 bướ c 1.

4. Tính thờ i gian thực hiện của A . V ì A gọi B v à C m à t hờ i gian thực hiện của B

đã đượ c tính ở  bướ c 3 v à t hờ i gian thực hiện của C đã đượ c tính ở  bướ c 1.Ví dụ 2-9: Ta có thể viết lại chương trình sắ p xế p bubble như sau: Trướ c hết chúng taviết thủ tục Swap để thực hiện việc hoàn đổi hai phần tử cho nhau, sau đó trong thủtục Bubble, khi cần t a sẽ gọi đến thủ tục Swap này.

PROCEDURE Swap (VAR x, y: Integer); VAR temp: Integer;

BEGIN

temp := x;

x := y;

y := temp;

END;

PROCEDURE Bubble (VAR a: ARRAY[1..n] OF integer);

VAR i,j :Integer;

BEGIN

{1} FOR i:=1 TO n-1 DO

{2} FOR j:=n DOWNTO i+1 DO

{3} IF a[j-1]>a[j] THEN Swap(a[j-1], a[j]);

END;

Trong cách viết trên, chươ ng trình Bubble gọi chương trình con Swap, do đó để tínhthờ i gian thực hiện của Bubble, trướ c hết ta cần tính thờ i gian thực hiện của Swap.Dễ thấy thờ i gian thực hiện của Swap là O(1) vì nó chỉ  bao gồm 3 lệnh gán. TrongBubble, lệnh {3} gọi Swap nên chỉ tốn O(1), lệnh {2} thực hiện n-i lần, mỗi lần tốnO(1) nên tốn O(n-i). Lệnh {1} thực hiện n-1 lần nên:

2.6. PHÂN TÍCH CÁC CHƯƠNG TR ÌNH ÐỆ QUY 

Vớ i các chương trình có gọi các chươ ng trình con đệ quy, ta không thể áp dụngcách tính như vừa trình bày trong mục 1.5.4 bở i vì một chươ ng trình đệ quy sẽ gọichính bản thân nó. Có thể thấy hình ảnh chương tr ình đệ quy A như sau:

A

Page 28: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 28/48

 

28

Hình 2- 2: S ơ đồ chươ ng trình con A đệ quy 

Vớ i phươ ng pháp tính độ  phức tạ p đã trình bày trong mục 1.5.4 thì không thể thựchiện đượ c. Bở i vì nếu theo phươ ng pháp đó thì, để tính thờ i gian thực hiên củachươ ng trình A, ta phải tính thờ i gian thực hiện của chương tr ình A và cái vòng luẩn

quẩn ấy không thể k ết thúc đượ c.Vớ i các chương trình đệ quy, tr ướ c hết ta cần thành lậ p các phươ ng trình đệ quy,sau đó giải phươ ng trình đệ quy, nghiệm của phương trình đệ quy sẽ là thờ i gianthực hiện của chươ ng trình đệ quy.

2.6.1. Thành lập phương tr  ình đệ quy

Phương trình đệ quy là một phươ ng trình biểu diễn mối liên hệ giữa T(n) và T(k),trong đó T(n) là thờ i gian thực hiện chươ ng trình vớ i kích thướ c dữ liệu nhậ p là n,T(k) thờ i gian thực hiện chươ ng trình vớ i kích thướ c dữ liệu nhậ p là k, vớ i k < n. Ðểthành lập đượ c phương tr ình đệ quy, ta phải căn cứ vào chươ ng trình đệ quy.

Thông thườ ng một chươ ng trình đệ quy để giải bài toán kích thướ c n, phải có ít nhấtmột trườ ng hợ  p dừng ứng vớ i một n cụ thể và lờ i gọi đệ quy để giải bài toán kíchthướ c k (k<n).

Để thành lậ p phương trình đệ quy, ta gọi T(n) là thờ i gian để giải bài toán kíchthướ c n, ta có T(k) là thờ i gian để giải bài toán kích thướ c k. Khi đệ quy dừng, ta

 phải xem xét khi đó chươ ng trình làm gì và tốn hết bao nhiêu thờ i gian, chẳng hạnthờ i gian này là c(n). Khi đệ quy chưa dừng thì phải xét xem có bao nhiêu lờ i gọi đệquy vớ i kích thướ c k ta sẽ có bấy nhiêu T(k). Ngoài ra ta còn phải xem xét đến thờ igian để phân chia bài toán và tổng hợ  p các lờ i giải, chẳng hạn thờ i gian này là d(n).

Dạng tổng quát của một phươ ng trình đệ quy sẽ là:

Trong đó C(n) là thờ i gian thực hiện chương trình ứng vớ i trườ ng hợ  p đệ quy dừng.F(T(k)) là một đa thức của các T(k). d(n) là thờ i gian để  phân chia bài toán và tổnghợ  p các k ết quả.

Ví dụ 2-10: Xét hàm tính giai thừa viết bằng giải thuật đệ quy như sau:

FUNCTION Giai_thua(n:Integer): Integer;

BEGIN

IF n=0 then Giai_thua :=1

ELSE Giai_thua := n* Giai_thua(n-1);

END;

Gọi T(n) là thờ i gian thực hiện việc tính n giai thừa, thì T(n-1) là thờ i gian thực hiệnviệc tính n-1 giai thừa. Trong tr  ườ ng hợ  p n = 0 thì chươ ng trình chỉ thực hiện mộtlệnh gán Giai_thua:=1, nên tốn O(1), do đó ta có T(0) = C1. Trong trườ ng hợ  p n>0

chươ ng trình phải gọi đệ quy Giai_thua(n-1), việc gọi đệ quy này tốn T(n-1), sau

Page 29: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 29/48

 

29

khi có k  ết quả của việc gọi đệ quy, chươ ng trình phải nhân k  ết quả đó vớ i n và gáncho Giai_thua. Thờ i gian để thực hiện phép nhân và phép gán là một hằng C2. Vậyta có

Ðây là phương tr ình đệ quy để tính thờ i gian thực hiện của chương tr ình đệ quyGiai_thua.

Ví dụ 2-11: Chúng ta xét thủ tục MergeSort một cách phác thảo như sau:

FUNCTION MergeSort (L:List; n:Integer):List; VARL1,L2:List;

BEGIN

IF n=1 THEN RETURN(L)

ELSE BEGIN

Chia đôi L thành L1 và L2, với độ dài n/2;

RETURN(Merge(MergeSort(L1,n/2),MergeSort(L2,n/2)));

END;END;

Chẳng hạn để sắ p xế p danh sách L gồm 8 phần tử 7, 4, 8, 9, 3, 1, 6, 2 ta có môhình minh họa của MergeSort như sau:

Page 30: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 30/48

 

30

Hình 2- 3: Minh hoạ sắ  p x ế  p tr ộnHàm MergeSort nhận một danh sách có độ dài n và tr ả về một danh sách đãđượ c sắ p xế p. Thủ tục Merge nhận hai danh sách đã đượ c sắ p L1 và L2 mỗidanh sách có độ dài n/2 tr ộn chúng lại với nhau để đượ c một danh sách gồm n

 phần tử có thứ tự. Giải thuật chi tiết của Merge ta sẽ bàn sau, chúng tachỉ để ý r ằng thời gian để Merge các danh sách có độ dài n/2 là O(n). GọiT(n) là thờ i gian thực hiện MergeSort một danh sách n phần tử thì T(n/2) là thờ igian thực hiện MergeSort một danh sách n/2 phần tử. Khi L có độ dài 1 (n = 1)thì chương tr ình chỉ làm một việc duy nhất là return(L), việc này tốn O(1) = C1thời gian. Trong trườ ng hợp n > 1, chương tr ình phải thực hiện gọi đệ quy

MerSort hai lần cho L1 và L2 với độ dài n/2 do đó thời gian để gọi hai lần đệquy này là 2T(n/2). Ngoài ra còn phải tốn thờ i gian cho việc chia danh sách Lthành hai nửa bằng nhau và tr ộn hai danh sách k ết quả (Merge). Ngườ i ta xácđinh đượ c thời gian để chia danh sách và Merge là O(n) = C2n. Vậy tacó phương tr ình đệ quy như sau:

Page 31: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 31/48

 

31

2.6.2. Giải phương tr  ình đệ quy

Có ba phươ ng pháp giải phương trình đệ quy:

1. Phương pháp truy hồi

2. Phương pháp đoán nghiệm.3. Lờ i giải tổng quát của một lớ  p các phươ ng trình đệ quy.

2.6.2.1. Phương pháp truy hồi

Dùng đệ quy để thay thế bất k ỳ T(m) vớ i m < n vào phía phải của phương tr ìnhcho đến khi tất cả T(m) với m > 1 đượ c thay thế bở i biểu thức của các T(1) hoặcT(0).

Vì T(1) và T(0) luôn là hằng số nên chúng ta có công thức của T(n) chứa các sốhạng chỉ liên quan đến n và các hằng số. Từ công thức đó ta suy ra T(n).

Ví dụ 2-12: Giải phương tr ình:

Ta có T(n) = T(n-1) + C2

T(n) = [T(n-2) + C2] + C2 = T(n-2) + 2C2

T(n) = [T(n-3) + C2] + 2C2 = T(n-3) + 3C2

……T(n) = T(n-i) + iC2

Quá trình trên k ết thúc khi n - i = 0 hay i = n. Khi đó ta có

T(n) = T(0) + nC2 = C1 + n C2 = O(n)

Ví dụ 2-13: Giải phương tr ình:

Page 32: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 32/48

 

32

2.6.2.2. Phương pháp đoán nghiệm

Ta đoán một nghiệm f(n) và dùng chứng minh quy nạ p để chứng tỏ r ằng T(n) ≤ f(n)vớ i mọi n. Thông thườ ng f(n) là một trong các hàm quen thuộc như logn, n, nlogn,n2, n3, 2n, n!, nn.

Ðôi khi chúng ta chỉ đoán dạng của f(n) trong đó có một vài tham số chưa xác định(chẳng hạn f(n) = an2 vớ i a chưa xác định) và trong quá trình chứng minh quy nạ p tasẽ suy diễn ra giá tr  ị thích hợ  p của các tham số.

Ví dụ 2-14: Giải phươ ng trình đệ quy

Giả sử chúng tađoán f(n) = anlogn. Vớ i n = 1 ta thấy r ằng cách đoán như vậy khôngđượ c bở i vì anlogn có giá tr  ị 0 không phụ thuộc vào giá tr  ị của a. Vì thế ta thử tiế ptheo f(n) = anlogn + b.

Vớ i n = 1 ta có, T(1) = C1 và f(1) = b, muốn T(1) ≤ f(1) thì b ≥ C1 (*)

Giả sử r ằng T(k) ≤ f(k), tức là T(k) ≤ aklogk + b vớ i mọi k < n ( g iả thiết quy nạ p).Ta phải chứng minh T(n) ≤ anlogn + b vớ i mọi n.

Giả sử n ≥ 2, từ phươ ng trình đã cho ta có

Page 33: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 33/48

 

33

Dễ dàng ta có b = C1 và a = C1 +C2 ta đượ c T(n) (C1 + C2)nlogn +C1 vớ i mọi n.

Hay nói cách khác T(n) là O(nlogn).2.6.2.3. Lời giải tổng quát cho một lớp các phương tr  ình đệ quy

Khi thiết k ế các giải thuật, ngườ i ta thườ ng vận dụng phươ ng pháp chia để tr ị mà ta sẽ bàn chi tiết hơ n trong chương sau. Ở đây chi trình bày tóm tắt phươ ng pháp nhưsau:

Ðể giải một bài toán kích thướ c n, ta chia bài toán đã cho thành a bài toán con, mỗi bài toán con có kích thướ c n/b Giải các bài toán con này và tổng hợ  p k ết quả lại đểđượ c k ết quả của bài toán đã cho. Vớ i các bài toán con chúng ta cũng sẽ áp dụng

 phương pháp đó để tiế p tục chia nhỏ ra nữa cho đến các bài toán con kích thướ c 1.

K  ĩ thuật này sẽ dẫn chúng ta đến một giải thuật đệ quy.

Giả thiết r ằng mỗi bài toán con kích thướ c 1 lấy một đơ n vị thờ i gian và thờ i gian đểchia bài toán kích thướ c n thành các bài toán con kích thướ c n/b và tổng hợ  p k ết quảtừ các bài toán con để đượ c lờ i giải của bài toán ban đầu là d(n). (Chẳng hạn đối vớ i vídụ MergeSort, chúng ta có a = b = 2, và d(n) = C2n. Xem C1 là một đơ n vị).

Tất cả các giải thuật đệ quy như trên đều có thể thành lậ p một phươ ng trinh đệ quytổng quát, chung cho lớ  p các bài toán ấy. Nếu gọi T(n) là thờ i gian để giải bài toánkích thướ c n thì T(n/b) là thời gian để giải bài toán con kích thướ c n/b. Khi n = 1 theo

giả thiết trên thì thờ i gian giải bài toán kích thướ c 1 là 1 đơ n vị, tức là T(1) = 1. Khin lớ n hơ n 1, ta phải giải đệ quy a bài toán con kích thướ c n/b, mỗi bài toán con tốnT(n/b) nên thờ i gian cho a lờ i giải đệ quy này là aT(n/b).

 Ngoài ra ta còn phải tốn thờ i gian để phân chia bài toán và tổng hợ  p các k ết quả, thờ igian này theo giả thiết trên là d(n).

Vậy ta có phương trình đệ quy:

Page 34: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 34/48

 

34

2.6.2.3.1. Hàm tiến triển, nghiệm thuần nhất và nghiệm riêng

Trong phươ ng trình đệ quy (I.1) hàm thờ i gian d(n) đượ c gọi là hàm tiến triển(driving function)

Trong công thức (I.2), ak  = nlog b

a đượ c gọi là nghiệm thuần nhất (homogeneoussolutions).

 Nghiệm thuần nhất là nghiệm chính xác khi d(n) = 0 vớ i mọi n. Nói một cách khác,nghiệm thuần nhất biểu diễn thờ i gian để giải tất cả các bài toán con.

k -1

Trong công thức (I.2), ‡”a jd( bk - j )đượ c gọi là nghiệm riêng

 j=0

Nghiệm riêng (particular solutions) biểu diễn thờ i gian phải tốn để tạo ra các bài toáncon và tổng hợ  p các k ết quả của chúng. Nhìn vào công thức ta thấy nghiệm riêng phụthuộc vào hàm tiến triển, số lượ ng và kích thướ c các bài toán con.

Khi tìm nghiệm của phươ ng trình (I.1), chúng ta phải tìm nghiệm riêng và so sánhvớ i nghiệm thuần nhất. Nếu nghiệm nào lớ n hơ n, ta lấy nghiệm đó làm nghiệm của

 phương tr ình (I.1).

Page 35: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 35/48

 

35

 b

b

Việc xác định nghiệm riêng không đơ n giản chút nào, tuy vậy, chúng ta cũng tìmđượ c một lớ  p các hàm tiến triển có thể dễ dàng xác định nghiệm riêng.

2.6.2.3.2. Hàm nhân

Một hàm f(n) đượ c gọi là hàm nhân (multiplicative function) nếu f(m.n) = f(m).f(n)

vớ i mọi số nguyên dương m và n.Ví dụ 2-15: Hàm f(n) = n

k là một hàm nhân, vì f(m.n)=(m.n)

k =m

k .n

k =f(m).f(n)

Tính nghiệm của phương tr ình tổng quát trong trườ ng hợ p d(n) là hàm nhân: Nếu d(n) trong (I.1) là một hàm nhân thì theo tính chất của hàm nhân ta có d(bk-j) =[d(b)]k-j và nghiệm riêng của (I.2) là

Xét ba trườ ng hợ  p sau:

1. Trườ ng hợ p 1: a > d(b) thì trong công thức (I.3) ta có ak  > [d(b)]k , theo quytắc lấy độ  phức tạ p ta có nghiệm riêng là O(ak ) = O(nloga). Như vậy nghiệm

riêng và nghiệm thuần nhất bằng nhau do đó T(n) là O(nloga

). Trong trươnghợ  p này ta thấy thờ i gian thực hiện chỉ  phụ thuộc vào a, b mà không phụthuộc vào hàm tiến triển d(n). Vì vậy để cải tiến giải thuật t a cần giảm a h oặctăng b.

2. Trườ ng hợ p 2: a < d(b) thì trong công thức (I.3) ta có [d(b)]k  > ak , theo quy

tắc lấy độ  phức tạ p ta cónghiệm riêng là O([d(b)]k ) = O(nlog b

d(b)). Trongtrườ ng hợ  p này nghiệm riêng lớ n hơ n nghiệm thuần nhất nên T(n) làO(nlog

bd(b)). Ðể cải tiến giải thuật chúng ta cần giảm d(b) hoặc tăng b.

Tr ườ ng hợ  p đặc biệt quan tr  ọng khi d(n) = n . Khi đó d(b) = b và log b b = 1.

Vì thế nghiệm riêng là O(n) và do vậy T(n) là O(n).

3. Trườ ng hợ p 3: a = d(b) thì công thức (I.3) không xác đinh nên ta phải tínhtr ực tiế p nghiệm riêng:

Do n = bk  nên k = log bn và ak = nlog b

a. Vậy nghiệm riêng là log bn.n l o g b

a vànghiệm này lớ n gấ p log bn lần nghiệm thuần nhất. Do đó T(n) là

O(logbn.nlog

ba

).

Page 36: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 36/48

 

36

Chú ý khi giải một phươ ng trình đệ quy cụ thể, ta phải xem phương trình đó cóthuộc dạng phươ ng trình tổng quát hay không. Nếu có thì phải xét xem hàm tiếntriển có phải là hàm nhân không. Nếu có thì ta xác định a, d(b) và dựa vào sự sosánh giữa a và d(b) mà vận dụng một trong ba trườ ng hợ  p nói trên.

Ví dụ 2-16: Giải các phươ ng trình đệ quy sau vớ i T(1) = 1 và

Các phương trình đã cho đều có dạng phươ ng trình tổng quát, các hàm tiến triển

d(n) đều là các hàm nhân và a = 4, b = 2.Vớ i phươ ng trình thứ nhất, ta có d(n) = n => d(b) = b = 2 < a, áp dụng tr  ườ ng hợ  p 1 tacó T(n) = O(nlog

 ba) = O(nlog4) = O(n2).

Vớ i phương trình thứ 3, ta có d(n) = n3 => d(b) = b3 = 8 > a, áp dụng tr  ườ ng hợ  p 2,ta có T(n) = O(nlog

 bd(b)) = O(nlogb) = O(n3).

2.6.2.3.3. Các hàm tiến triển khác

Trong trườ ng hợ  p hàm tiến triển không phải là một hàm nhân thì chúng ta khôngthể áp dụng các công thức ứng vớ i ba tr  ườ ng hợ  p nói trên mà chúng ta phải tínhtr ực tiế p nghiệm riêng, sau đó so sánh vớ i nghiệm thuần nhất để lấy nghiệm lớ nnhất trong hai nghiệm đó làm nghiệm của phương tr ình.

Ví dụ 2-17: Giải phươ ng trình đệ quy sau:

T(1) = 1

T(n) = 2T(n/2) + nlogn

Phương trình đã cho thuộc dạng phươ ng trình tổng quát nhưng d(n) = nlogn không

 phải là một hàm nhân.Ta có nghiệm thuần nhất = nlog

 ba = nlog2 = n

Do d(n) = nlogn không phải là hàm nhân nên ta phải tính nghiệm riêng bằng cáchxét tr ực tiế p

Theo giả thiết trong  phương trình tổng quát thì n = bk  nên k = log bn, ở đây do b=2nên 2k =n và k=logn, chúng ta có nghiệm riêng là O(nlog2n), nghiệm này lớ n hơ n

Page 37: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 37/48

 

37

nghiệm thuần nhất do đó T(n) = O(nlog2n).

2.7. T ỔNG KẾT CHƯƠNG 

Trong chươ ng này, chúng ta cần phải nắm vững các ý sau:

1. Sự  phân tích, đánh giá giải thuật là cần thiết để lựa chọn giải thuật tốt, hoặc đểcải tiến giải thuật.

2. Sử dụng khái niệm độ phức tạ p và ký hiệu ô lớ n để đánh giá giải thuật.

3. Đối vớ i các chương trình không gọi chươ ng trình con, thì dùng quy tắc cộng,quy tắc nhân và quy tắc chung để phân tích, tính độ phức tạ p.

4. Đối vớ i các chươ ng trình gọi chươ ng trình con, thì tính độ  phức tạ p theo nguyêntắc “từ trong ra”.

5. Đối vớ i các chương trình đệ quy thì trướ c hết phải thành lậ p phương trình đệ

quy, sau đó giải phươ ng trình đệ quy, nghiệm của phươ ng trình đệ quy chính làđộ phức tạ p của giải thuật.

6. Khi giải một phương trình đệ quy không thuộc dạng phươ ng trình tổng quát thì sửdụng phương pháp truy hồi hoặc phươ ng pháp đoán nghiệm.

7. Khi giải một phương trình đệ quy thuộc dạng  phương trình tổng quát, nếu hàmtiến triển d(n) là một hàm nhân thì vận dụng công thức nghiệm của môt trong ba trườ ng hợ  p để xác định nghiệm, còn nếu d(n) không phải là hàm nhân thì phảitính tr ực tiế p nghiệm riêng và so sánh vớ i nghiệm thuần nhất để chọn nghiệm.

BÀI T  ẬP CHƯƠNG 

Bài 1: Tính thờ i gian thực hiện của các đoạn chươ ng trình sau:

a) Tính tổng của các số

{1} Sum := 0;

{2} for i:=1 to n do begin

{3} readln(x);

{4} Sum := Sum + x;

end;

 b) Tính tích hai ma tr ận vuông cấ p n C = A*B:{1} for i := 1 to n do

{2} for j := 1 to n do begin

{3} c[i,j] := 0;

{4} for k := 1 to n do

{5} c[i,j] := c[i,j] + a[i,k] * b[k,j];

end;

Bài 2: Giải các phươ ng trình đệ quy sau vớ i T(1) = 1 và

Page 38: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 38/48

 

38

a) T(n) = 3T(n/2) + n

 b) T(n) = 3T(n/2) + n2

c) T(n) = 8T(n/2) + n3

Bài 3: Giải các phươ ng trình đệ quy sau vớ i T(1) = 1 vàa) T(n) = 4T(n/3) + n

 b) T(n) = 4T(n/3) + n2.

c) T(n) = 9T(n/3) + n2.

Bài 4: Giải các phươ ng trình đệ quy sau vớ i T(1) = 1 và

a) T(n) = T(n/2) + 1

 b) T(n) = 2T(n/2) + logn

c) T(n) = 2T(n/2) + n

d) T(n) = 2T(n/2) + n2

Bài 5: Giải các phươ ng trình đệ quy sau bằng phươ ng pháp đoán nghiệm:

a) T(1) = 2 và T(n) = 2T(n-1) + 1 vớ i n > 1

 b) T(1) = 1 và T(n) = 2T(n-1) + n vớ i n > 1

Bài 6: Cho một mảng n số nguyên đượ c sắ p thứ tự tăng. Viết hàm tìm một sốnguyên trong mảng đó theo phươ ng pháp tìm kiếm nhị phân, nếu tìm thấy thì tr  ảvề TRUE, ngượ c lại tr ả về FALSE. Sử dụng hai k   ĩ  thuật là đệ quy và vòng lặ p. Vớ i

mỗi k  ĩ thuật hãy viết một hàm tìm và tính thờ i gian thực hiện của hàm đó.Bài 7: Tính thờ i gian thực hiện của giải thuật đệ quy giải bài toán Tháp Hà nội vớ i ntầng?

Bài 8: Xét công thức truy toán để tính số tổ hợ  p chậ p k của n như sau:

a) Viết một hàm đệ quy để tính số tổ hợ  p chậ p k của n.

 b) Tính thờ i gian thực hiện của giải thuật nói trên.

Page 39: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 39/48

 

39

Chương III: Phương pháp “Tham lam”

3.1. Đặc trưng của chiến lược tham lam

3.1.1 Bài toán t ối ưu tổ hợ  pLà một dạng của bài toán tối ưu, nó có dạng tổng quát như sau:

Cho hàm f(X) = xác định tr ên một tập hữu hạn các phần tử D. Hàm f(X) được gọi

là hàm mục tiêu.

Mỗi phần tử X D có dạng X = (x1, x2... xn) được gọi là một phương án.

Cần tìm một phương án X D sao cho hàm f(X) đạt min (max). Phương án X như

thế được gọi là phương án tối ưu.

Ta có thể tìm thấy phương án tối ưu bằng phương pháp “vét cạn” nghĩa là xét tất cả

các phương án trong tập D (hữu hạn) để xác đinh phương án tốt nhất. Mặc dù tập hợp

D là hữu hạn nhưng để tìm phương án tối ưu cho một bài toán kích thước n bằng

 phương pháp “vét cạn” ta có thể cần một thời gian mũ.

Các phần tiếp theo của chương này sẽ tr ình bày một số kĩ thuật giải bài toán tối ưu tổ

hợp mà thời gian có thể chấp nhận được.

3.1.2 N ội dung k ĩ thuật tham ăn

Tham ăn hiểu một cách dân gian là: trong một mâm có nhiều món ăn, món

nào ngon nhất ta sẽ ăn trước và ăn cho hết món đó thì chuyển sang món ngon thứ hai,

lại ăn hết món ngon thứ hai này và chuyển sang món ngon thứ ba…

K  ĩ thuật tham ăn thường được vận dụng để giải bài toán tối ưu tổ hợp bằng cách xây

dựng một phương án X. Phương án X được xây dựng bằng cách lựa chọn từng

thành phần Xi của X cho đến khi hoàn chỉnh (đủ n thành phần). Với mỗi Xi, ta sẽ chọn

Xi tối ưu. Với cách này thì có thể ở bước cuối cùng ta không còn gì để chọn mà phải

chấp nhận một giá trị cuối cùng còn lại.

Áp dụng kĩ thuật tham ăn sẽ cho một giải thuật thời gian đa thức, tuy nhiên

nói chung chúng ta chỉ đạt được một phương án tốt chứ chưa hẳn là tối ưu.

Có r ất nhiều bài toán mà ta có thể giải bằng kĩ thuật này.

Page 40: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 40/48

 

40

3.1.3. Đặc tính l ự a chọn tham lamToàn bộ phương pháp tối ưu có thể đạt được từ việc chọn tối ư u trong từng bước chọn.

Về khía cạnh này giải thuật tham lam khác với giải thuật quy hoạch động ở chỗ: Trong

qui hoạch động chúng ta thực hiện chọn cho từng bước, nhưng việc lựa chọn này phụthuộc vào cách giải quyết các bài toán con. Với giải thuật tham lam, tại mỗi bước

chúng ta chọn bất cứ cái gì là tốt nhất vào thời điểm hiện tại, và sau đó giải quyết các

vấn đề phát sinh từ việc chọn này. Vấn đề chọn thực hiện bởi giải thuật tham lam

không phụ thuộc vào việc lựa chọn trong tương lai hay cách giải quyết các bài toán

con. Vì vậy khác với quy hoạch động, giải quyết các bài toán con theo kiểu bottom up

(từ dưới lên), giải thuật tham lam thường sử dụng giải pháp top-down (từ tr ên xuống).

Chúng ta phải chứng minh rằng với giải thuật tham lam, toàn bộ bài toán được giải

quyết một cách tối ưu nếu mỗi bước việc chọn được thực hiện tối ưu. Các bước chọn

tiếp theo được thực hiện tương tự như bước đầu tiên, nhưng với bài toán nhỏ hơn. Ph-

ương pháp qui nạp được ứng dụng trong giải thuật tham lam có thể được sử dụng cho

tất cả các bước chọn

3.1.4. C ấ u trúc con t ối ưu 

Một bài toán thực hiện optimal substructure nếu cách giải quyết tối ưu của bài toánchứa đựng cách giải quyết tối ưu những bài toán con của nó. Tính chất này được đánh

giá là một thành phần có thể áp dụng được của thuật toán quy hoạch động tốt như thuật

toán tham lam. Một ví dụ của optimal substructure, nếu A là đáp án tối ưu của bài toán

với hành động chọn đầu tiên là 1, thì tập hợp A’= A- {1} là đáp án tối ưu cho bài toán

S’= {iS: si f1}.

3.2. Sơ đồ chung của phương pháp3.2.1. Đặc điểm chung c ủ a thu ật toán tham lamMục đích xây dựng bài toán giải nhiều lớp bài toán khác nhau, đưa ra quyết định dựa

ngay vào thuật toán đang có, và trong tương lai sẽ không xem xét lại quyết định trong

quá khứ. Vì vậy thuật toán dễ đề xuất, thời gian tính nhanh nhưng thường không cho

k ết quả đúng.

Page 41: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 41/48

 

41

- Lời giải cần tìm có thể mô tả như là bộ gồm hữu hạn các thành phần thoả mãn điều

kiện nhất định, ta phải giải quyết bài toán một cách tối ưu -> hàm mục tiêu

- Để xây dựng lời giải ta có một tập các ứng cử viên

- Xuất phát từ lời giải rỗng, thực hiện việc xây dựng lời giải từng bước, mỗi bước sẽlựa chọn trong tập ứng cử viên để bổ xung vào lời giải hiện có.

- Xây dựng một hàm nhận biết tính chấp nhận được của lời giải hiện có -> Hàm

Solution(S) -> Kiểm tra thoả mãn điều kiện chưa.

- Một hàm quan tr ọng nữa: Select(C) cho phép tại mỗi bước của thuật toán lựa chọn

ứng cử viên có triển vọng nhất để bổ xung vào lời giải hiện có -> dựa trên căn cứ

vào ảnh hưởng của nó vào hàm mục tiêu, thực tế là ứng cử viên đó phải giúp chúng

ta phát triển tiếp tục bài toán.

- Xây dựng hàm nhận biết tính chấp nhận được của ứng cử viên được lựa chọn, để

có thể quyết định bổ xung ứng cử viên được lựa chọn bởi hàm Select vào lời giải -

> Feasible(S x).

3.2.2. S ơ đồ thu ật toán Procedure Greedy;

{*Giả sử C l à t ập các ứng cử viên*}

begin

S :=   ; {* S là l ời giải xây dựng theo thuật toán *}

While (C  0) and not Solution(S) do

 Begin

 x  Select(C);

C := C\x; If Feasible(S  x) then S := S  x

 End;

 If Solution(S) then Return S 

end;

Page 42: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 42/48

 

42

3.2.3. Chứng minh tính đúng đắ n- Công việc này không phải đơn giản. Ta sẽ nêu một lập luận được sử dụng để chúng

minh tính đúng đắn.

- Để chỉ ra thuật toán không cho lời giải đúng chỉ cần đưa ra một phản ví dụ- Việc chứng minh thuật toán đúng khó hơn nhiều và ta sẽ nghiên cứu cụ thể trong

 phần sau:

Lập luận biến đổi (Exchange Argument)

Giả sử cần chứng minh thuật toán A cho lời giải đúng. A(I) là lời giải tìm được bởi

thuật toán A đối với bộ dữ liệu I. Còn O là lời giải tối ưu của bài toán với bộ dữ liệu

này.

Ta cần tìm cách xây dựng phép biến đổi để biến đổi O thành O’ sao cho:

. O’ cũng tốt không kém gì O (Ngh ĩa là O’ vẫn tối ưu)

. O’ giống với A(I) nhiều hơn O.

Giả sử đã xây dựng được phép biến đổi vừa nêu. Để chứng minh tính đúng đắn dựa

vào hai sơ đồ chứng minh sau

- CM bằng phản chứng: Giả sử A không đúng đắn, hãy tìm bộ dữ liệu I sao cho

A(I) khác với lời giải tối ưu của bài toán. Gọi O là lời giải tối ưu giống với A(I)nhất => A(I) khác O. Dùng phép biến đổi chúng ta có thể biến đổi O O’ sao

cho O’ vẫn tối ưu và O’ giống với A(I) hơn => mâu thuẫn giả thiết O là lời giải tối

ưu giống với A(I) nhất.

- CM trực tiếp: O là lời giải tối u. Biến đổi O O’ giống với A(I) hơn là O. Nếu O’

= A(I) thì A(I) chính là phương án tối u ngược lại biến đổi O’ O’’ giống với

A(I) hơn. Cứ thế ta thu được dãy O’

, O’’

, O’’’….. ngày càng giống hơn, và chỉ cómột số hữu hạn điều kiện để so sánh nên chỉ sau một số hữu hạn lần phép biến đổi

sẽ kết thúc và đó là tại A(I).

3.3. Bài toán tr ả tiền của máy rút tiền tự động ATMTrong máy rút tiền tự động ATM, ngân hàng đã chuẩn bị sẵn các loại tiền có mệnh giá

100.000 đồng, 50.000 đồng, 20.000 đồng và 10.000 đồng. Giả sử mỗi loại tiền đều có

số lượng không hạn chế. Khi có một khách hàng cần rút một số tiền n đồng (tính chẵn

Page 43: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 43/48

 

43

đến 10.000 đồng, tức là n chia hết cho 10000). Hãy tìm một phương án tr ả tiền sao cho

tr ả đủ n đồng và số tờ giấy bạc phải trả là ít nhất.

Gọi X = (X1, X2, X3, X4) là một phương án trả tiền, trong đó X1 là số tờ giấy bạc

mệnh giá 100.000 đồng, X2 là số tờ giấy bạc mệnh giá 50.000 đồng, X3 là số tờ giấy bạc mệnh giá 20.000 đồng và X4 là số tờ giấy bạc mệnh giá 10.000 đồng. Theo yêu

cầu ta phải có X1 + X2 + X3 + X4 nhỏ nhất và X1 * 100.000 + X2 * 50.000 + X3 *

20.000 + X4 * 10.000 = n.

Áp dụng kĩ thuật tham ăn để giải bài toán này là: để có số tờ giấy bạc phải trả (X1 +

X2 + X3 + X4) nhỏ nhất thì các tờ giấy bạc mệnh giá lớn phải được chọn nhiều nhất.

Trước hết ta chọn tối đa các tờ giấy bạc mệnh giá 100.000 đồng, nghĩa là X1 là số

nguyên lớn nhất sao cho X1 * 100.000 ≤ n. Tức là X1 = n DIV 100.000.

Xác định số tiền cần rút còn lại là hiệu n – X1 * 100000 và chuyển sang chọn loại giấy

 bạc 50.000 đồng…

Ví dụ khách hàng cần rút 1.290.000 đồng (n = 1290000), phương án trả tiền như sau:

X1 = 1290000 DIV 100000 = 12.

Số tiền cần rút còn lại là 1290000 – 12 * 100000 = 90000. X2 = 90000 DIV 50000 =

1.

Số tiền cần rút còn lại là 90000 – 1 * 50000 = 40000. X3 = 40000 DIV 20000 = 2.

Số tiền cần rút còn lại là 40000 – 2 * 20000 = 0. X4 = 0 DIV 10000 = 0.

Ta có X = (12, 1, 2, 0), tức là máy ATM sẽ trả cho khách hàng 12 tờ 100.000 đồng, 1

tờ 50.000 đồng và 2 tờ 20.000 đồng.

3.4. Bài toán về các đoạn thẳng không giao nhauBài toán

Đầu vào : Cho họ các đoạn thẳng mở  

Đầu ra : Tập các đoạn thẳng không giao nhau có lực lượng lớn nhất.

Ứ ng dụng thực tế : Bài toán xếp thời gian biểu cho các hội thảo, bài toán phục vụ

khách hành trên một máy, bài toán lựa chọn hành động (Ví dụ có n lời mời dự tiệc bắt

đầu bởi ai k ết thúc bởi bi, hãy lựa chọn sao cho đi được nhiều tiệc nhất).

Đề xuất các thuật toán :

Page 44: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 44/48

 

44

Greedy 1 : Sắp xếp các đoạn thẳng theo thứ tự tăng dần của đầu mút trái, bắt đầu từ

tập S là tập rỗng ta lần lượt xếp các đoạn thẳng trong danh sách theo thứ tự đ ã xếp và

 bổ sung đoạn thẳng đang xét vào S nếu nó không có điểm chung với bất cứ đoạn nào

trong S.Thuật toán :

 Procedure Greedy1;

 Begin

S :=   ; {*S là t ập các đoạn thẳng cần t ìm*}

<S ắp xếp các đoạn thẳng trong C theo thứ tự không giảm của nút trái>

While C  0 do

 Begin

(ac, bc)  đoạn đầu tiên trong C;

C := C\(ac, bc);

 If <(ac, bc) không giao với bất cứ đoạn nào trong s> then

S := S  (ac, bc)

 End;

<S là t ập cần t ìm>

 End;

Độ phức tạp của thuật toán là - > nằm trong đoạn sắ p xếp

Tuy nhiên Greedy1 không cho lời giải tối ưu. Ví dụ sau

Ta thấy rằng thuật toán sẽ lựa chọn dạ tiệc 1, trong khi phương án tối ưu của bài toán

là (Dạ tiệc 2, Dạ tiệc 3)

Page 45: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 45/48

 

45

Greedy2 : Ta chọn đoạn có độ dài ngắn nhất bổ xung vào S. Tuy nhiên thuật toán

tham lam này cũng không cho kết quả tối ưu. Sau đây là phản ví dụ

Khi đó thuật toán sẽ lựa chọn (dạ tiệc 1) trong khi lời giải tối ưu của thuật toán là (dạ

tiệc 2, dạ tiệc 3).

Greedy3: Xắp xếp các đoạn thẳng theo thứ tự không giảm của mút phải. Bắt đầu từ

tập S là tập rỗng ta lần lượt xét các đoạn trong danh sách theo thứ tự đã sắp xếp và bổ

xung đoạn thẳng đang xét vào S nếu nó không có điểm chung với bất cứ đoạn nào

trong S. (Dạ tiệc nào k ết thúc sớm sẽ được xét trước).

Mệnh đề 1 : Thuật toán Greedy3 cho lời giải tối ưu của bài toán về các đoạn thẳng

không giao nhau.

Chứng Minh : Giả sử Greedy3 không cho lời giải đúng. Phải t ìm bộ dữ liệu C sao cho

thuật toán không cho lời giải tối u. Giả sử G3(C) là lời giải tìm được bởi Greedy3. Gọi

O là lời giải tối ưu có số đoạn thẳng chung với G3(C) là lớn nhất. Gọi X là đoạn thẳng

đầu tiên có trong G3(C) nhưng không có trong O. Đoạn này là tồn tại, vì nếu trái lại thì

G3(C) O ( mâu thuẫn vì đã giả thiết G3(C) O ) hay G3(C) O ( Cũng mâu thuẫn vì

khi đó thuật toán phải chọn đoạn thẳng X) (O cũng được sắp xếp giống G3(C)).

Gọi Y là đoạn đầu tiên k ể từ bên trái của O không có mắt trong G3(C). Đoạn Y cũng

 phải tồn tại (Chứng minh tương tự như trên).

Khi đó mút phải của đoạn X phải ở bên trái (nhỏ hơn) mút phải của đoạn Y, vì nếu trái

lại thuật toán sẽ chọn Y thay vì X. Xét

Page 46: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 46/48

 

46

 

Rõ ràng

-  O’ gồm các đoạn thẳng không giao với nhau, bởi vì X không giao với bất kì

đoạn nào ở bên trái nó trong O’ ( do G3(C) là chấp nhận được ) cũng như

không giao với bất cứ đoạn nào ở bên phải nó trong O’ (Do mút phải của X

nhỏ hơn mút phải của Y và Y không giao với bất cứ đoạn nào ở bên phải Y

trong O’).

-  Do O’ có cùng lực lượng với O nên O’ cũng là tối ưu

- Tuy nhiên ta thấy rằng O’ giống với G3(C) hơn là O => mâu thuẫn với

giả thiết.

3.5. Bài toán cái túiBài toán : cho n đồ vật, trong lượng tương ứng của từng đồ vật là wi, và giá tr ị là ci (),

Ta chất đồ vật vào túi có tr ọng lượng b, sao cho tổng trọng lượng không vượt quá b và

đạt giá trị lớn nhất.

Ta có thể tóm tắt bài toán như sau :

: tập chỉ số của đồ vật.

Tìm I  C . Sao cho ;

Đề xuất thuật toán tham lam

Greedy1: Sắp xếp theo thứ tự không tăng của giá trị. Xét các đồ vật theo thứ tự đã

xếp, lần lượt chất các đồ vật đang xét vào túi nếu dung lượng còn lại trong túi đủ chứa

nó. Thuật toán tham lam này không cho lời giải tối ưu. Sau đây là phản ví dụ:Tham số của bài toán là n = 3; b = 19.

Đồ vật 1 2 3

Giá tr ị 20 16 8-> giá tr ị lớn như ng tr ọng lượn g cũng rất lớn

Tr ọng lượng 14 6 10

Thuật toán sẽ lựa chọn đồ vật 1 với tổng giá trị là 20, trong khi lời giải tối ưu của bài

toán là lựa chọn (đồ vật 2, đồ vật 3 ) với tổng giá trị là 24.

Page 47: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 47/48

 

47

Greedy2 : Sắp xếp đồ vật không giảm của trọng lượng. Lần lượt chất các đồ vật vào

túi theo thứ tự đã sắp xếp. Thuật toán tham lam này cũng không cho kết quả tối ưu.

Sau đây là phản ví dụ

Tham số của bài toán là n = 3; b = 11

Đồ vật 1 2 3

Giá tr ị 10 16 28 ->  Đồ vật nhẹ như ng giá tiền cũng rất 

nhẹ

Tr ọng lượng 5 6 10

Thuật toán sẽ lựa chọn (đồ vật 1, đồ vật 2) với tổng giá trị là 26, trong khi lời giải tối

ưu của bài toán là (đồ vật 3) với tổng giá trị là 28.Greedy3 : Sắp xếp các đồ vật theo thứ tự không tăng của giá trị một đơn vị trọng l -

ượng (ci/wi). Lần lượt xét

Tuy nhiên Greedy3 không cho lời giải tối ưu. Sau đây là phản ví dụ của bài toán

Tham số của bài toán : n = 2; b 2.

Khi đó thuật toán chỉ lựa chọn được đồ vật 1 với tổng giá trị là 10, trong khi lời giải tối

ưu của bài toán lựa chọn đồ vật 2 với tổng giá trị là 10b-1 ( 10.2-1 = 19 > 10).

Greedy4 : Gọi I j là lời giải thu được theo thuật toán Greedyj (j = 1, 2, 3). Gọi 

Định lý : Lời giải I4 thoả mãn bất đẳng thức 

Trong đó f * là giá tr ị tối u của bài toán.

Page 48: 1PTTKTT_Ch123

5/16/2018 1PTTKTT_Ch123 - slidepdf.com

http://slidepdf.com/reader/full/1pttkttch123 48/48

 

48