CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế...

35
CH NG 16 ƯƠ CÁC CHI N L C THI T K THU T TOÁN ƯỢ V i m t v n đ đ t ra, làm th nào chúng ta có th đ a ra thu t ế ư toán gi i quy t nó? Trong ch ng này, chúng ta s trình bày các chi n ế ươ ế l c thi t k thu t toán, còn đ c g i là các k thu t thi t k thu t toán. ượ ế ế ượ ế ế M i chi n l c này có th áp d ng đ gi i quy t m t ph m vi khá r ng ế ượ ế các bài toán. M i chi n l c có các tính ch t riêng và ch thích h p cho ế ượ m t s d ng bài toán nào đó. Chúng ta s l n l t trình bày các chi n ượ ế l c sau: chia-đ -tr (divide-and-conquer), quy ho ch đ ng (dynamic ượ programming), quay lui (backtracking) và tham ăn (greedy method). Trong m i chi n l c chúng ta s trình bày ý t ng chung c a ph ng pháp và ế ượ ưở ươ sau đó đ a ra m t s ví d minh h a. ư C n nh n m nh r ng, ta không th áp d ng máy móc m t chi n ế l c cho m t v n đ , mà ta ph i phân tích k v n đ . C u trúc c a v n ượ đ , các đ c đi m c a v n đ s quy t đ nh chi n l c có kh năng áp ế ế ượ d ng. 16.1 CHIA - Đ - TR 16.1.1 Ph ng pháp chung ươ Chi n l c thi t k thu t toán đ c s d ng r ng rãi nh t là chi n ế ượ ế ế ượ ế l c chia-đ -tr . ượ Ý t ng chung c a k thu t này là nh sau: Chia v n đ ưở ư c n gi i thành m t s v n đ con cùng d ng v i v n đ đã cho, ch khác là c c a chúng nh h n. M i v n đ con đ c gi i quy t đ c l p. Sau ơ ượ ế đó, ta k t h p nghi m c a các v n đ con đ nh n đ c nghi m c a v n ế ượ đ đã cho. N u v n đ con là đ nh có th d dàng tính đ c nghi m, ế ượ thì ta gi i quy t nó, n u không v n đ con đ c gi i quy t b ng cách áp ế ế ượ ế d ng đ quy th t c trên (t c là l i ti p t c chia nó thành các v n đ con ủụ ế 153

Transcript of CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế...

Page 1: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

CH NG 16ƯƠ

CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

V i m t v n đ đ t ra, làm th nào chúng ta có th đ a ra thu tớ ộ ấ ề ặ ế ể ư ậ

toán gi i quy t nó? Trong ch ng này, chúng ta s trình bày các chi nả ế ươ ẽ ế

l c thi t k thu t toán, còn đ c g i là các k thu t thi t k thu t toán.ượ ế ế ậ ượ ọ ỹ ậ ế ế ậ

M i chi n l c này có th áp d ng đ gi i quy t m t ph m vi khá r ngỗ ế ượ ể ụ ể ả ế ộ ạ ộ

các bài toán. M i chi n l c có các tính ch t riêng và ch thích h p choỗ ế ượ ấ ỉ ợ

m t s d ng bài toán nào đó. Chúng ta s l n l t trình bày các chi nộ ố ạ ẽ ầ ượ ế

l c sau: chia-đ -tr (divide-and-conquer), quy ho ch đ ng (dynamicượ ể ị ạ ộ

programming), quay lui (backtracking) và tham ăn (greedy method). Trong

m i chi n l c chúng ta s trình bày ý t ng chung c a ph ng pháp vàỗ ế ượ ẽ ưở ủ ươ

sau đó đ a ra m t s ví d minh h a.ư ộ ố ụ ọ

C n nh n m nh r ng, ta không th áp d ng máy móc m t chi nầ ấ ạ ằ ể ụ ộ ế

l c cho m t v n đ , mà ta ph i phân tích k v n đ . C u trúc c a v nượ ộ ấ ề ả ỹ ấ ề ấ ủ ấ

đ , các đ c đi m c a v n đ s quy t đ nh chi n l c có kh năng ápề ặ ể ủ ấ ề ẽ ế ị ế ượ ả

d ng.ụ

16.1 CHIA - Đ - TRỂ Ị

16.1.1 Ph ng pháp chungươ

Chi n l c thi t k thu t toán đ c s d ng r ng rãi nh t là chi nế ượ ế ế ậ ượ ử ụ ộ ấ ế

l c chia-đ -tr .ượ ể ị Ý t ng chung c a k thu t này là nh sau: Chia v n đưở ủ ỹ ậ ư ấ ề

c n gi i thành m t s v n đ con cùng d ng v i v n đ đã cho, ch khácầ ả ộ ố ấ ề ạ ớ ấ ề ỉ

là c c a chúng nh h n. M i v n đ con đ c gi i quy t đ c l p. Sauỡ ủ ỏ ơ ỗ ấ ề ượ ả ế ộ ậ

đó, ta k t h p nghi m c a các v n đ con đ nh n đ c nghi m c a v nế ợ ệ ủ ấ ề ể ậ ượ ệ ủ ấ

đ đã cho. N u v n đ con là đ nh có th d dàng tính đ c nghi m,ề ế ấ ề ủ ỏ ể ễ ượ ệ

thì ta gi i quy t nó, n u không v n đ con đ c gi i quy t b ng cách ápả ế ế ấ ề ượ ả ế ằ

d ng đ quy th t c trên (t c là l i ti p t c chia nó thành các v n đ conụ ệ ủ ụ ứ ạ ế ụ ấ ề

153

Page 2: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

nh h n,…). Do đó, các thu t toán đ c thi t k b ng chi n l c chia-ỏ ơ ậ ượ ế ế ằ ế ượ

đ -tr s là các thu t toán đ quy.ể ị ẽ ậ ệ

Sau đây là l c đ c a k thu t chia-đ -tr :ượ ồ ủ ỹ ậ ể ị

DivideConquer (A,x) // tìm nghi m x c a bài toán A.ệ ủ{ if (A đ nh )ủ ỏ

Solve (A); else {

Chia bài toán A thành các bài toán con A1, A2,…, Am;for (i = 1; i <= m ; i ++)

DivideConquer (Ai , xi);K t h p các nghi m xế ợ ệ i c a các bài toán con Aủ i (i=1, …, m) để nh n đ c nghi m x c a bài toán A;ậ ượ ệ ủ}

}

“Chia m t bài toán thành các bài toán con” c n đ c hi u là ta th cộ ầ ượ ể ự

hi n các phép bi n đ i, các tính toán c n thi t đ đ a vi c gi i quy t bàiệ ế ổ ầ ế ể ư ệ ả ế

toán đã cho v vi c gi i quy t các bài toán con c nh h n.ề ệ ả ế ỡ ỏ ơ

Thu t toán tìm ki m nh phân (xem m c 4.4.2) là thu t toán đ cậ ế ị ụ ậ ượ

thi t k d a trên chi n l c chia-đ -tr . Cho m ng A c n đ c s p x pế ế ự ế ượ ể ị ả ỡ ượ ắ ế

theo th t tăng d n: A[0] ≤ … ≤ A[n-1]. V i x cho tr c, ta c n tìm xemứ ự ầ ớ ướ ầ

x có ch a trong m ng A hay không, t c là có hay không ch s 0 ≤ i ≤ n-1ứ ả ứ ỉ ố

sao cho A[i] = x. K thu t chia-đ -tr g i ý ta chia m ng A[0…n-1] thànhỹ ậ ể ị ợ ả

2 m ng con c n/2 là A[0…k-1] và A[k+1…n-1], trong đó k là ch s đ ngả ỡ ỉ ố ứ

gi a m ng. So sánh x v i A[k]. N u x = A[k] thì m ng A ch a x và i = k.ữ ả ớ ế ả ứ

N u không, do tính đ c s p c a m ng A, n u x ế ượ ắ ủ ả ế < A[k] ta tìm x trong

m ng A[0…k-1], còn n u x ả ế > A[k] ta tìm x trong m ng A[k+1…n-1].ả

Thu t toán Tháp Hà N i (xem m c 15.5), thu t toán s p x p nhanhậ ộ ụ ậ ắ ế

(QuickSort) và thu t toán s p x p hoà nh p (MergeSort) s đ c trình bàyậ ắ ế ậ ẽ ượ

154

Page 3: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

trong ch ng sau cũng là các thu t toán đ c thi t k b i k thu t chia-ươ ậ ượ ế ế ở ỹ ậ

đ -tr . Sau đây chúng ta đ a ra m t ví d đ n gi n minh ho cho k thu tể ị ư ộ ụ ơ ả ạ ỹ ậ

chia-đ -tr .ể ị

16.1.2 Tìm max và min

Cho m ng A c n, chúng ta c n tìm giá tr l n nhât (max) và nhả ỡ ầ ị ớ ỏ

nh t (min) c a m ng này. Bài toán đ n gi n này có th gi i quy t b ngấ ủ ả ơ ả ể ả ế ằ

các thu t toán khác nhau.ậ

M t thu t toán r t t nhiên và đ n gi n là nh nhau. Đ u tiên ta l yộ ậ ấ ự ơ ả ư ầ ấ

max, min là giá tr đ u tiên A[0] c a m ng. Sau đó so sánh max, min v iị ầ ủ ả ớ

t ng giá tr A[i], 1 ≤ i ≤ n-1, và c p nh t max, min m t cách thích ng.ừ ị ậ ậ ộ ứ

Thu t toán này đ c mô t b i hàm sau:ậ ượ ả ở

SiMaxMin (A, max, min){

max = min = A[0];for ( i = 1 ; i < n , i ++)

if (A[i] > max)max = A[i];

else if (A[i] < min)min = A[i];

}

Th i gian th c hi n thu t toán này đ c quy t đ nh b i s phép soờ ự ệ ậ ượ ế ị ở ố

sánh x v i các thành ph n A[i]. S l n l p trong l nh l p for là n-1. Trongớ ầ ố ầ ặ ệ ặ

tr ng h p x u nh t (m ng A đ c s p theo th t gi m d n), m i l nườ ợ ấ ấ ả ượ ắ ứ ự ả ầ ỗ ầ

l p ta c n th c hi n 2 phép so sánh. Nh v y, trong tr ng h p x u nh t,ặ ầ ự ệ ư ậ ườ ợ ấ ấ

ta c n th c hi n 2(n-1) phép so sánh, t c là th i gian ch y c a thu t toánầ ự ệ ứ ờ ạ ủ ậ

là O(n).

Bây gi ta áp d ng k thu t chia-đ -tr đ đ a ra m t thu t toánờ ụ ỹ ậ ể ị ể ư ộ ậ

khác. Ta chia m ng A[0..n-1] thành các m ng con A[0..k] và A[k+1..n-1]ả ả

v i k = [n/2]. N u tìm đ c max, min c a các m ng con A[0..k] vàớ ế ượ ủ ả

155

Page 4: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

A[k+1..n-1], ta d dàng xác đ nh đ c max, min trên m ng A[0..n-1]. Đễ ị ượ ả ể

tìm max, min trên m ng con ta ti p t c chia đôi chúng. Quá trình s d ngả ế ụ ẽ ừ

l i khi ta nh n đ c m ng con ch có m t ho c hai ph n t . Trong cácạ ậ ượ ả ỉ ộ ặ ầ ử

tr ng h p này ta xác đ nh đ c d dàng max, min. Do đó, ta có th đ aườ ợ ị ượ ễ ể ư

ra thu t toán sau:ậ

MaxMin (i, j, max, min)// Bi n max, min ghi l i giá tr l n nh t, nh nh t trong m ng A[i..j]ế ạ ị ớ ấ ỏ ấ ả{

if (i = = j)max = min = A[i];

else if (i = = j-1)if (A[i] < A[j])

{max = A[j];min = A[i];

}else {

max = A[i];min = A[j];

}else {

mid = (i+j) / 2;MaxMin (i, mid, max1, min1);MaxMin (mid + 1, j, max2, min2);if (max 1< max2)

max = max2;else max = max1;if (min1 < min2)

min = min1;else min = min2;

} }

Bây gi ta đánh giá th i gian ch y c a thu t toán này. G i T(n) làờ ờ ạ ủ ậ ọ

s phép so sánh c n th c hi n. Không khó khăn th y r ng, T(n) đ c xácố ầ ự ệ ấ ằ ượ

đ nh b i quan h đ quy sau.ị ở ệ ệ

156

Page 5: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

T(1) = 0T(2) = 1T(n) = 2T(n/2) + 2 v i n ớ > 2

Áp d ng ph ng pháp th l p, ta tính đ c T(n) nh sau:ụ ươ ế ặ ượ ư

T(n) = 2 T(n/2) + 2= 22T(n/22) + 22 + 2= 23T(n/23) + 23 + 22 + 2………= 2kT(n/2k) + 2k + 2k-1 +… + 2

V i k là s nguyên d ng sao cho 2ớ ố ươ k ≤ n < 2k+1, ta có T(n) = 2kT(1) + 2k+1 – 2 = 2k+1 – 2 ≤ 2(n-1)

Nh v y, T(n) = O(n).ư ậ

16.2 THU T TOÁN Đ QUYẬ Ệ

Khi thi t k thu t toán gi i quy t m t v n đ b ng k thu t chia-ế ế ậ ả ế ộ ấ ề ằ ỹ ậ

đ -tr thì thu t toán thu đ c là thu t toán đ quy. Thu t toán đ quyể ị ậ ượ ậ ệ ậ ệ

đ c bi u di n trong các ngôn ng l p trình b c cao (ch ng h n Pascal,ượ ể ễ ữ ậ ậ ẳ ạ

C/C++) b i các hàm đ quy: đó là các hàm ch a các l i g i hàm đ n chínhở ệ ứ ờ ọ ế

nó. Trong m c này chúng ta s nêu lên các đ c đi m c a thu t toán đụ ẽ ặ ể ủ ậ ệ

quy và phân tích hi u qu (v không gian và th i gian) c a thu t toán đệ ả ề ờ ủ ậ ệ

quy.

Đ quy là m t k thu t đ c bi t quan tr ng đ gi i quy t v n đ .ệ ộ ỹ ậ ặ ệ ọ ể ả ế ấ ề

Có nh ng v n đ r t ph c t p, nh ng chúng ta có th đ a ra thu t toánữ ấ ề ấ ứ ạ ư ể ư ậ

đ quy r t đ n gi n, sáng s a và d hi u. C n ph i hi u rõ các đ c đi mệ ấ ơ ả ủ ễ ể ầ ả ể ặ ể

c a thu t toán đ quy đ có th đ a ra các thu t toán đ quy đúng đ n.ủ ậ ệ ể ể ư ậ ệ ắ

Gi i thu t đ quy cho m t v n đ c n ph i tho mãn các đòi h iả ậ ệ ộ ấ ề ầ ả ả ỏ

sau:

1. Ch a l i gi i cho các tr ng h p đ n gi n nh t c a v n đ .ứ ờ ả ườ ợ ơ ả ấ ủ ấ ề

Các tr ng h p này đ c g i là các tr ng h p c s hay cácườ ợ ượ ọ ườ ợ ơ ở

tr ng h p d ng.ườ ợ ừ

157

Page 6: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

2. Ch a các l i g i đ quy gi i quy t các v n đ con v i cứ ờ ọ ệ ả ế ấ ề ớ ỡ

nh h n.ỏ ơ

3. Các l i g i đ quy sinh ra các l i g i đ quy khác và v ti mờ ọ ệ ờ ọ ệ ề ề

năng các l i g i đ quy ph i d n t i các tr ng h p c s .ờ ọ ệ ả ẫ ớ ườ ợ ơ ở

Tính ch t 3 là đ c bi t quan tr ng, n u không tho mãn, hàm đấ ặ ệ ọ ế ả ệ

quy s ch y mãi không d ng. Ta xét hàm đ quy tính giai th a:ẽ ạ ừ ệ ừ

int Fact(int n){

if (n = 0)return 1;

elsereturn n * Fact(n-1); // g i đ quy.ọ ệ

}

Trong hàm đ quy trên, tr ng h p c s là n = 0. Đ tính Fact(n) c nệ ườ ợ ơ ở ể ầ

th c hi n l i g i Fact(n-1), l i g i này l i d n đ n l i g i F(n-2),…, vàự ệ ờ ọ ờ ọ ạ ẫ ế ờ ọ

cu i cùng d n t i l i g i F(0), t c là d n t i tr ng h p c s .ố ẫ ớ ờ ọ ứ ẫ ớ ườ ợ ơ ở

Đ quy và phép l p.ệ ặ Đ i v i m t v n đ , có th có hai cách gi i:ố ớ ộ ấ ề ể ả

gi i thu t đ quy và gi i thu t dùng phép l p. Gi i thu t đ quy đ c môả ậ ệ ả ậ ặ ả ậ ệ ượ

t b i hàm đ quy, còn gi i thu t dùng phép l p đ c mô t b i hàmả ở ệ ả ậ ặ ượ ả ở

ch a các l nh l p, đ phân bi t v i hàm đ quy ta s g i là hàm l p.ứ ệ ặ ể ệ ớ ệ ẽ ọ ặ

Ch ng h n, đ tính giai th a, ngoài hàm đ quy ta có th s d ng hàm l pẳ ạ ể ừ ệ ể ử ụ ặ

sau:

int Fact(int n){

if (n = = 0)return 1;

else {int F= 1;for (int i = 1; i <= n ; i + +)

F = F * i;

158

Page 7: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

return F;}

}

u đi m n i b t c a đ quy so v i phép l p là đ quy cho phép taƯ ể ổ ậ ủ ệ ớ ặ ệ

đ a ra gi i thu t r t đ n gi n, d hi u ngay c đ i v i nh ng v n đư ả ậ ấ ơ ả ễ ể ả ố ớ ữ ấ ề

ph c t p. Trong khi đó, n u không s d ng đ quy mà dùng phép l p thìứ ạ ế ử ụ ệ ặ

thu t toán thu đ c th ng là ph c t p h n, khó hi u h n. Ta có th th yậ ượ ườ ứ ạ ơ ể ơ ể ấ

đi u đó trong ví d tính giai th a, ho c các thu t toán tìm ki m, xem, lo iề ụ ừ ặ ậ ế ạ

trên cây tìm ki m nh phân (xem m c 8.4). Tuy nhiên, trong nhi u tr ngế ị ụ ề ườ

h p, các thu t toán l p l i hi u qu h n thu t toán đ quy.ợ ậ ặ ạ ệ ả ơ ậ ệ

Bây gi chúng ta phân tích các nhân t có th làm cho thu t toán đờ ố ể ậ ệ

quy kém hi u qu . Tr c h t, ta c n bi t c ch máy tính th c hi n m tệ ả ướ ế ầ ế ơ ế ự ệ ộ

l i g i hàm. Khi g p m t l i g i hàm, máy tính t o ra m t b n ghi ho tờ ọ ặ ộ ờ ọ ạ ộ ả ạ

đ ng (activation record) ngăn x p th i gian ch y (run-time stack) trongộ ở ế ờ ạ

b nh c a máy tính. B n ghi ho t đ ng ch a vùng nh c p cho các thamộ ớ ủ ả ạ ộ ứ ớ ấ

bi n và các bi n đ a ph ng c a hàm. Ngoài ra, nó còn ch a các thông tinế ế ị ươ ủ ứ

đ máy tính tr l i ti p t c hi n ch ng trình đúng v trí sau khi nó đãể ở ạ ế ụ ệ ươ ị

th c hi n xong l i g i hàm. Khi hoàn thành th c hi n l i g i hàm thì b nự ệ ờ ọ ự ệ ờ ọ ả

ghi h at đ ng s b lo i b kh i ngăn x p th i gian ch y.ọ ộ ẽ ị ạ ỏ ỏ ế ờ ạ

Khi th c hi n m t hàm đ quy, m t dãy các l i g i hàm đ c sinhự ệ ộ ệ ộ ờ ọ ượ

ra. H u qu là m t dãy b n ghi ho t đ ng đ c t o ra trong ngăn x pậ ả ộ ả ạ ộ ượ ạ ế

th i gian ch y. C n chú ý r ng, m t l i g i hàm ch đ c th c hi n xongờ ạ ầ ằ ộ ờ ọ ỉ ượ ự ệ

khi mà các l i g i hàm mà nó sinh ra đã đ c th c hi n xong và do đó r tờ ọ ượ ự ệ ấ

nhi u b n ghi ho t đ ng đ ng th i t n t i trong ngăn x p th i gian ch y,ề ả ạ ộ ồ ờ ồ ạ ế ờ ạ

ch khi m t l i g i hàm đ c th c hi n xong thì b n ghi ho t đ ng c pỉ ộ ờ ọ ượ ự ệ ả ạ ộ ấ

cho nó m i đ c lo i ngăn x p th i gian ch y. Ch ng h n, xét hàm đớ ượ ạ ế ờ ạ ẳ ạ ệ

quy tính giai th a, n u th c hi n l i g i hàm Fact(5) s d n đ n ph iừ ế ự ệ ờ ọ ẽ ẫ ế ả

th c hi n các l i h i hàm Fact(4), Fact(3), Fact(2), Fact(1), Fact(0). Ch khiự ệ ờ ọ ỉ

Fact(4) đã đ c tính thì Fact(5) m i đ c tính, … Do đó trong ngăn x pượ ớ ượ ế

th i gian ch y s ch a các b n ghi ho t đ ng nh sau:ờ ạ ẽ ứ ả ạ ộ ư

159

Bàn ghi ho t đ ng cho Fact(5)ạ ộ

Bàn ghi ho t đ ng cho Fact(4)ạ ộ

Bàn ghi ho t đ ng cho Fact(3)ạ ộ

Bàn ghi ho t đ ng cho Fact(2)ạ ộ

Bàn ghi ho t đ ng cho Fact(1)ạ ộ

Bàn ghi ho t đ ng cho Fact(0)ạ ộ

Page 8: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Trong đó, b n ghi ho t đ ng c p cho l i g i hàm Fact(0) đ nhả ạ ộ ấ ờ ọ ở ỉ

ngăn x p th i gian ch y. Khi th c hi n xong Fact(0) thì b n ghi ho t đ ngế ờ ạ ự ệ ả ạ ộ

c p cho nó b lo i, r i b n ghi ho t đ ng cho Fact(1) b lo i,…ấ ị ạ ồ ả ạ ộ ị ạ

Vì v y, vi c th c hi n hàm đ quy có th đòi h i r t nhi u khôngậ ệ ự ệ ệ ể ỏ ấ ề

gian nh trong ngăn x p th i gian ch y, th m chí có th v t quá khớ ế ờ ạ ậ ể ượ ả

năng c a ngăn x p th i gian ch y trong b nh c a máy tính.ủ ế ờ ạ ộ ớ ủ

M t nhân t khác làm cho các thu t toán đ quy kém hi u qu làộ ố ậ ệ ệ ả

các l i g i đ quy có th d n đ n ph i tính nghi m c a cùng m t bài toánờ ọ ệ ể ẫ ế ả ệ ủ ộ

con r t nhi u l n. S Fibonacci th n, ký hi u là F(n), đ c xác đ nh đấ ề ầ ố ứ ệ ượ ị ệ

quy nh sau:ư

F(1) = 1F(2) = 1F(n) = F(n-1) + F(n-2) v i nớ >2

Do đó, ta có th tính F(n) b i hàm đ quy sau.ể ở ệ

int Fibo(int n){

if ((n = = 1) // (n = = 2))return 1;

elsereturn Fibo (n-1) + Fibo(n-2);

}

Đ tính F(7), các l i g i trong hàm đ quy Fibo d n ta đ n ph i tínhể ờ ọ ệ ẫ ế ả

các F(k) vói k<7, nh đ c bi u di n b i cây trong hình d i đây; ch ngư ượ ể ễ ở ướ ẳ

h n đ tính F(7) c n tính F(6) và F(5), đ tính F(6) c n tính F(5) và F(4),ạ ể ầ ể ầ

160F(2)

F(7)

F(6) F(5)

F(5) F(4) F(4) F(3)

F(4) F(3) F(3) F(2) F(3) F(2) F(2) F(1)

F(3) F(2) F(2) F(1) F(1) F(2) F(1)

F(2) F(1)

Page 9: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

T hình v trên ta th y r ng, đ tính đ c F(7) ta ph i tính F(5) 2 l n,ừ ẽ ấ ằ ể ượ ả ầ

tính F(4) 3 l n, tính F(3) 5 l n, tính F(2) 8 l n và tính F(1) 5 l n. Chính sầ ầ ầ ầ ự

ki n đ tính F(n) ta ph i tính các F(k), v i kệ ể ả ớ <n, r t nhi u l n đã làm choấ ề ầ

hàm đ quy Fibo kém hi u qu . Có th đánh giá th i gian ch y c a nó làệ ệ ả ể ờ ạ ủ

O(φ n), trong đó = (1 + 5 )/2.

Chúng ta có th đ a ra thu t toán l p đ tính dãy s Fibonacci. Ýể ư ậ ặ ể ố

t ng c a thu t toán là ta tính l n l t các F(1), F(2), F(3), …, F(n -2),ưở ủ ậ ầ ượ

F(n-1), F(n) và s d ng hai bi n đ l u l i hai giá tr v a tính. Hàm l pử ụ ế ể ư ạ ị ừ ặ

tính dãy s Fibonacci nh sau:ố ư

int Fibo1(int n){

if ((n= = 1)//(n= = 2)return 1;

else {int previous = 1;int current = 1;

for (int k = 3 ; k <= n ; k ++){

current + = previous;previous = current – previous;

}return current;}

}

D dàng th y r ng, th i gian ch y c a hàm l p Fibo1 là O(n). Đễ ấ ằ ờ ạ ủ ặ ể

tính F(50) thu t toán l p Fibo1 c n 1 micro giây, thu t toán đ quy Fiboậ ặ ầ ậ ệ

đòi h i 20 ngày, còn đ tính F(100) thu t toán l p c n 1,5 micro giây,ỏ ể ậ ặ ầ

trong khi thu t toán đ quy c n 10ậ ệ ầ 9 năm!

161

Page 10: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Tuy nhiên, có r t nhi u thu t toán đ quy cũng hi u qu nh thu tấ ề ậ ệ ệ ả ư ậ

toán l p, ch ng h n các thu t toán đ quy tìm, xem, lo i trên cây tìm ki mặ ẳ ạ ậ ệ ạ ế

nh phân (xem m c 8.4). Các thu t toán đ quy: s p x p nhanhị ụ ậ ệ ắ ế

(QuickSort) và s p x p hoà nh p (MergeSort) mà chúng ta s nghiên c uắ ế ậ ẽ ứ

trong ch ng 17 cũng là các thu t toán r t hi u qu .ươ ậ ấ ệ ả

Trong m c 6.6 chúng ta đã nghiên c u k thu t s d ng ngăn x pụ ứ ỹ ậ ử ụ ế

đ chuy n thu t toán đ quy thành thu t toán l p. Nói chung, ch nên sể ể ậ ệ ậ ặ ỉ ử

d ng thu t toán đ quy khi mà không có thu t toán l p hi u qu h n.ụ ậ ệ ậ ặ ệ ả ơ

16.3 QUY HO CH Đ NGẠ Ộ

16.3.1 Ph ng pháp chungươ

K thu t quy ho ch đ ng gi ng k thu t chia-đ -tr ch c haiỹ ậ ạ ộ ố ỹ ậ ể ị ở ỗ ả

đ u gi i quy t v n đ b ng cách chia v n đ thành các v n đ con.ề ả ế ấ ề ằ ấ ề ấ ề

Nh ng chia-đ -tr là k thu t top-down, nó tính nghi m c a các v n đư ể ị ỹ ậ ệ ủ ấ ề

con t l n t i nh , nghi m c a các v n đ con đ c tính đ c l p b ngừ ớ ớ ỏ ệ ủ ấ ề ượ ộ ậ ằ

đ quy. Đ i l p, quy ho ch đ ng là k thu t bottom-up, tính nghi m c aệ ố ậ ạ ộ ỹ ậ ệ ủ

các bài toán t nh đ n l n và ghi l i các k t qu đã tính đ c. Khi tínhừ ỏ ế ớ ạ ế ả ượ

nghi m c a bài toán l n thông qua nghi m c a các bài toán con, ta chệ ủ ớ ệ ủ ỉ

vi c s d ng các k t qu đã đ c ghi l i. Đi u đó giúp ta tránh đ cệ ử ụ ế ả ượ ạ ề ượ

ph i tính nhi u l n nghi m c a cùng m t bài toán con. Thu t toán đ cả ề ầ ệ ủ ộ ậ ượ

thi t k b ng k thu t quy ho ch đ ng s là thu t toán l p, trong khiế ế ằ ỹ ậ ạ ộ ẽ ậ ặ

thu t toán đ c thi t k b ng k thu t chia-đ -tr là thu t toán đ quy.ậ ượ ế ế ằ ỹ ậ ể ị ậ ệ

Đ thu n ti n cho vi c s d ng l i nghi m c a các bài toán con, chúng taể ậ ệ ệ ử ụ ạ ệ ủ

l u l i các nghi m đã tính vào m t b ng (thông th òng là m ng 1 chi uư ạ ệ ộ ả ư ả ề

ho c 2 chi u).ặ ề

Tóm l i, đ gi i m t bài toán b ng quy ho ch đ ng, chúng ta c nạ ể ả ộ ằ ạ ộ ầ

th c hi n các b c sau:ự ệ ướ

• Đ a ra cách tính nghi m c a các bài toán con đ n gi n nh t.ư ệ ủ ơ ả ấ

162

Page 11: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

• Tìm ra các công th c (ho c các quy t c) xây d ng nghi mứ ặ ắ ự ệ

c a bài toán thông qua nghi m c a các bài toán con.ủ ệ ủ

• Thi t k b ng đ l u nghi m c a các bài toán con.ế ế ả ể ư ệ ủ

• Tính nghi m c a các bài toán con t nh đ n l n và l u vàoệ ủ ừ ỏ ế ớ ư

b ng.ả

• Xây d ng nghi m c a bài toán t b ng.ự ệ ủ ừ ả

M t ví d đ n gi n c a thu t toán đ c thi t k b ng quy ho chộ ụ ơ ả ủ ậ ượ ế ế ằ ạ

đ ng là thu t toán l p tính dãy s Fibonacci mà ta đã đ a ra trong m cộ ậ ặ ố ư ụ

16.2. Trong hàm l p Fibo1, ta đã tính tu n t F(1), F(2),…, đ n F(n). Vàặ ầ ự ế

b i vì đ tính F(k) ch c n bi t F(k-1) và F(k-2), nên ta ch c n l u l i F(k-ở ể ỉ ầ ế ỉ ầ ư ạ

1) và F(k-2).

K thu t quy ho ch đ ng th ng đ c áp d ng đ gi i quy t cácỹ ậ ạ ộ ườ ượ ụ ể ả ế

bài toán t i u ố ư (optimization problems). Các bài toán t i u th ng là cóố ư ườ

m t s l n nghi m, m i nghi m đ c g n v i m t giá, và m c tiêu c aộ ố ớ ệ ỗ ệ ượ ắ ớ ộ ụ ủ

chúng ta là tìm ra nghi m có giá nh nh t : ệ ỏ ấ nghi mệ t i u ố ư (optimization

solution). Ch ng h n, bài toán tìm đ ng đi t thành ph A đ n thành phẳ ạ ườ ừ ố ế ố

B trong b n đ giao thông, có nhi u đ ng đi t A đ n B, giá c a m tả ồ ề ườ ừ ế ủ ộ

đ ng đi đó là đ dài c a nó, nghi m t i u là đ ng đi ng n nh t t Aườ ộ ủ ệ ố ư ườ ắ ấ ừ

đ n B. N u nghi m t i u c a bài toán đ c t o thành t nghi m t i uế ế ệ ố ư ủ ượ ạ ừ ệ ố ư

c a các bài toán con thì ta có th s d ng k thu t quy ho ch đ ng.ủ ể ử ụ ỹ ậ ạ ộ

Sau đây, chúng ta s đ a ra m t s thu t toán đ c thi t k b ngẽ ư ộ ố ậ ượ ế ế ằ

k thu t quy ho ch đ ng.ỹ ậ ạ ộ

16.3.2 Bài toán s p x p các đ v t vào ba lôắ ế ồ ậ

Gi s ta có chi c ba lô có th ch a đ c m t kh i l ng w, chúngả ử ế ể ứ ượ ộ ố ượ

ta có n lo i đ v t đ c đánh s i,…, n. M i đ v t lo i i (i = 1,…, n) cóạ ồ ậ ượ ố ỗ ồ ậ ạ

kh i l ng aố ượ i và có giá tr cị i. Chúng ta mu n s p x p các đ v t vào ba lôố ắ ế ồ ậ

163

Page 12: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

đ nh n đ c ba lô có gía tr l n nh t có th đ c. Gi s m i lo i để ậ ượ ị ớ ấ ể ượ ả ử ỗ ạ ồ

v t có đ nhi u đ x p vào ba lô.ậ ủ ề ề ế

Bài toán ba lô đ c mô t chính xác nh sau. Cho tr c các sượ ả ư ướ ố

nguyên d ng w, aươ i, và ci (i = 1,…,n). Chúng ta c n tìm các s nguyênầ ố

không âm xi (i = 1,…, n) sao cho

∑=

n

n 1xi ai ≤ w và

∑=

n

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

Xét tr ng h p đ n gi n nh t: ch có m t lo i đ v t (n = 1). Trongườ ợ ơ ả ấ ỉ ộ ạ ồ ậ

tr ng h p này ta tìm đ c ngay l i gi i: x p đ v t vào ba lô cho t i khiườ ợ ượ ờ ả ế ồ ậ ớ

nào không x p đ c n a thì thôi, t c là ta tìm đ c ngay nghi m xế ượ ữ ứ ượ ệ i = w/ai.

Bây gi ta đi tìm cách tính nghi m c a bài toán “x p n lo i đ v tờ ệ ủ ế ạ ồ ậ

vào ba lô kh i l ng w” thông qua nghi m c a các bài toán con “x p kố ượ ệ ủ ế

lo i đ v t (1ạ ồ ậ ≤ k ≤ n) vào ba lô kh i l ng v (1≤ v ≤ w)” Ta g i t t là bàiố ượ ọ ắ

toán con (k,w), g i cost (k,v) là giá tr l n nh t c a ba lô kh i l ng v (1≤ọ ị ớ ấ ủ ố ượ

v ≤ w) và ch ch a các lo i đ v t 1, 2,….,k. Ta tìm công th c tính costỉ ứ ạ ồ ậ ứ

(k,v).V i k = 1 và 1 ≤ v ≤ w, ta cóớ

xi = v / ai và

cost (1,v) = xici (1)

Gi s ta đã tính đ c cost (s,u) v i 1≤ s < k và 1≤ u ≤ v, ta c n tính costả ử ượ ớ ầ

(k,v) theo các cost (s,u) đã bi t đó. G i yế ọ k = v / ak, ta có

cost (k,v) = max[cost (k-1,u) + xkck] (2)

Trong đó, max đ c l y v i t t c xượ ấ ớ ấ ả k = 0, 1,…, yk và u = v - xkak (t c làứ

đ c l y v i t t c các kh năng x p đ v t th k). Nh v y, tính costượ ấ ớ ấ ả ả ế ồ ậ ứ ư ậ

(k,v) đ c quy v tính cost (k-1,u) v i u≤v. Giá tr c a xượ ề ớ ị ủ k trong (2) mà cost

(k-1,u) + xkck đ t max chính là s đ v t lo i k c n x p. Giá tr l n nh tạ ố ồ ậ ạ ầ ế ị ớ ấ

c a ba lô s là cost(n, w).ủ ẽ

164

Page 13: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Chúng ta s tính nghi m c a bài toán t c nh đ n c l n theo cácẽ ệ ủ ừ ỡ ỏ ế ỡ ớ

công th c (1) và (2). Nghi m c a các bài toán con s đ c l u trong m ngứ ệ ủ ẽ ượ ư ả

2 chi u A[0..n-1][0..w-1], c n l u ý là nghi m c a bài toán con (k,v) đ cề ầ ư ệ ủ ượ

l u gi trong A[k-1][v-1], vì các ch s c a m ng đ c đánh s t 0.ư ữ ỉ ố ủ ả ượ ố ừ

M i thành ph n A[k-1][v-1] s ch a cost(k,v) và s đ v t lo i kỗ ầ ẽ ứ ố ồ ậ ạ

c n x p. T các công th c (1) và (2) ta có th tính đ c các thành ph nầ ế ừ ứ ể ượ ầ

c a m ng A l n l t theo dòng 0, 1,…n-1.ủ ả ầ ượ

T b ng A đã làm đ y, làm th nào xác đ nh đ c nghi m c a bàiừ ả ầ ế ị ượ ệ ủ

toán, t c là xác đ nh đ c s đ v t lo i i (i = 1,2,…,n) c n x p vào baứ ị ượ ố ồ ậ ạ ầ ế

lô? Ô A[n-1][w-1] ch a giá tr l n nh t c a ba lô cost (n,w) và s đ v tứ ị ớ ấ ủ ố ồ ậ

lo i n c n x p xạ ầ ế n. Tính v = w – xnan. Tìm đ n ô A[n-2][v-1] ta bi t đ cế ế ượ

cost(n-1,v) và s đ v t lo i n-1 c n x p xố ồ ậ ạ ầ ế n-1. Ti p t c quá trình trên, taế ụ

tìm đ c xượ n-2,..,x2 và cu i cùng là xố 1.

16.3.3 Tìm dãy con chung c a hai dãy sủ ố

Xét bài toán sau: Cho hai dãy s nguyên a = (aố 1,…, am) và b = (b1,…

bn), ta c n tìm dãy s nguyên c = (cầ ố 1,…, ck) sao cho c là dãy con c a c a vàủ ả

b, và c là dài nh t có th đ c. Ví d , n u a = (3, 5, 1, 3, 5, 5, 3) và b =ấ ể ượ ụ ế

(1,5,3,5,3,1) thì dãy con chung dài nh t là c = (5,3,5,3) ho c c = (1,3,5,3)ấ ặ

ho c c = (1,5,5,3).ặ

Tr ng h p đ n gi n nh t khi m t trong hai dãy a và b r ng (m = 0ườ ợ ơ ả ấ ộ ỗ

ho c n = 0), ta th y ngay dãy con chung dài nh t là dãy r ng.ặ ấ ấ ỗ

Ta xét các đo t đ u c a hai dãy a và b, đó là các dãy (aạ ầ ủ 1,a2,…,ai) và

(b1,b2,…,aj) v i 0 ≤ i ≤ m và 0 ≤ j ≤ n. G i L(i,j) là đ dài l n nh t c a dãyớ ọ ộ ớ ấ ủ

con chung c a hai dãy (aủ 1,a2,…,ai) và (b1,b2,…,aj). Do đó L(n,m) là đ dàiộ

l n nh t c a dãy con chung c a a và b. Bây gi ta đi tìm cách tính L(i,j)ớ ấ ủ ủ ờ

thông qua các L(s,t) v i 0 ≤ s ≤ i và 0 ≤ t ≤ j. D dàng th y r ng:ớ ễ ấ ằ

L(0,j) = 0 v i m i jớ ọ

L(i,0) = 0 v i m i iớ ọ (1)

165

Page 14: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

N u i ế > 0 và j > 0 và ai # bj thì

L(i,j) = max [L(i,j-1), L(i-1,j)] (2)

N u i ế > 0 và j > 0 và ai = bj thì

L(i,j) = 1 + L(i-1,j-1) (3)

S d ng các công th c đ quy (1), (2), (3) đ tính các L(i,j) l n l t v i iử ụ ứ ệ ể ầ ượ ớ

= 0,1,…,m và j = 0,1,…,n. Chúng ta s l u các giá tr L(i,j) vào m ngẽ ư ị ả

L[0..m][0..n].

Công vi c ti p theo là t m ng L ta xây d ng dãy con chung dàiệ ế ừ ả ự

nh t c a a và b. Gi s k = L[m][n] và dãy con chung dài nh t là c = (cấ ủ ả ử ấ 1,…

ck-1, ck). Ta xác đ nh các thành ph n c a dãy c l n l t t ph i sang trái,ị ầ ủ ầ ượ ừ ả

t c là xác đ nh cứ ị k, r i cồ k-1,…,c1. Ta xem xét các thành ph n c a m ng L b tầ ủ ả ắ

t L[m,n]. Gi s ta đang ô L[i][j] và ta đang c n xác đ nh cừ ả ử ở ầ ị r, (1 <= r <=

k). N u aế i = bj thì theo (3) ta l y cấ r = ai, gi m r đi 1 và đi đ n ô L[i-1][j-1].ả ế

Còn n u aế i # bj thì theo (2) ho c L[i][j] = L[i][j-1], ho c L[i][j] = L[i-1][j].ặ ặ

Trong tr ng h p L[i][j] = L[i][j-1] ta đi t i ô L[i][j-1], còn n u L[i][j] =ườ ợ ớ ế

L[i-1][j] ta đi t i ô L[i-1][j]. Ti p t c quá trình trên ta xác đ nh đ c t t cớ ế ụ ị ượ ấ ả

các thành ph n c a dãy con dài nh t.ầ ủ ấ

16.4 QUAY LUI

16.4.1 Tìm ki m vét c nế ạ

Trong th c t chúng ta th ng g p các câu h i ch ng h n nh “cóự ế ườ ặ ỏ ẳ ạ ư

bao nhiêu kh năng...?”, “hãy cho bi t t t c các kh năng...?”, ho c “cóả ế ấ ả ả ặ

t n t i hay không m t kh năng...?”. Ví d , có hay không m t cách đ t 8ồ ạ ộ ả ụ ộ ặ

con h u vào bàn c sao cho chúng không t n công nhau. Các v n đ nhậ ờ ấ ấ ề ư

th thông th ng đòi h i ta ph i xem xét t t c các kh năng có th có.ế ườ ỏ ả ấ ả ả ể

Tìm ki m vét c nế ạ (exhaustive search) là xem xét t t c các ng c viênấ ả ứ ử

nh m phát hi n ra đ i t ng mong mu n. Các thu t toán đ c thi t kằ ệ ố ượ ố ậ ượ ế ế

b ng tìm ki m vét c n th ng đ c g i là ằ ế ạ ườ ượ ọ brute-force algorithms. Ý

t ng c a các thu t toán này là sinh-ki m, t c là sinh ra t t c các khưở ủ ậ ể ứ ấ ả ả

166

Page 15: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

năng có th có và ki m tra m i kh năng xem nó có tho mãn các đi uể ể ỗ ả ả ề

ki n c a bài toán không. Trong nhi u v n đ , t t c các kh năng mà taệ ủ ề ấ ề ấ ả ả

c n xem xét có th quy v các đ i t ng t h p (các t p con c a m tầ ể ề ố ượ ổ ợ ậ ủ ộ

t p), ho c các hoán v c a n đ i t ng, ho c các t h p k đ i t ng t nậ ặ ị ủ ố ượ ặ ổ ợ ố ượ ừ

đ i t ng. Trong các tr ng h p nh th , ta c n ph i sinh ra, ch ng h n,ố ượ ườ ợ ư ế ầ ả ẳ ạ

t t c các hoán v , r i ki m tra xem m i hoán v có là nghi m c a bài toánấ ả ị ồ ể ỗ ị ệ ủ

không. Tìm ki m vét c n đ ng nhiên là kém hi u qu , đòi h i r t nhi uế ạ ươ ệ ả ỏ ấ ề

th i gian. Nh ng cũng có v n đ ta không có cách gi i quy t nào khác tìmờ ư ấ ề ả ế

ki m vét c n.ế ạ

Ví d 1( Bài toán 8 con h u).ụ ậ Chúng ta c n đ t 8 con h u vào bànầ ặ ậ

c 8x8 sao cho chúng không t n công nhau, t c là không có hai con h uờ ấ ứ ậ

nào n m cùng hàng, ho c cùng c t, ho c cùng đ ng chéo.ằ ặ ộ ặ ườ

Vì các con h u ph i n m trên các hàng khác nhau, ta có th đánh sậ ả ằ ể ố

các con h u t 1 đ n 8, con h u i là con h u đ ng hàng th i (i=1,...,8).ậ ừ ế ậ ậ ứ ở ứ

G i xọ i là c t mà con h u th i đ ng. Vì các con h u ph i đ ng các c tộ ậ ứ ứ ậ ả ứ ở ộ

khác nhau, nên (x1, x2, ...,x8) là m t hoán v c a 8 s 1, 2,..., 8. Nh v y t tộ ị ủ ố ư ậ ấ

c các ng c viên cho nghi m c a bài toán 8 con h u là t t c các hoánả ứ ử ệ ủ ậ ấ ả

v c a 8 s 1, 2,..., 8. Đ n đây ta có th đ a ra thu t toán nh sau: sinh raị ủ ố ế ể ư ậ ư

t t c các hoán v c a (xấ ả ị ủ 1, x2, ...,x8), v i m i hoán v ta ki m tra xem hai ôớ ỗ ị ể

b t kì (i,xấ i) và (j,xj) có cùng đ ng chéo hay không.ườ

Đ i v i bài toán t ng quát: đ t n con h u vào bàn c nxn, s cácố ớ ổ ặ ậ ờ ố

hoán v c n xem xét là n!, và do dó thu t toán đ t n con h u b ng tìmị ầ ậ ặ ậ ằ

ki m vét c n đòi h i th i gian O(n!). Trong m c sau, chúng ta s đ a raế ạ ỏ ờ ụ ẽ ư

thu t toán hi u qu h n đ c thi t k b ng k thu t quay lui.ậ ệ ả ơ ượ ế ế ằ ỹ ậ

Ví d 2( Bài toán ng i bán hàng).ụ ườ

Bài toán ng i bán hàng (saleperson problem) đ c phát bi u nhườ ượ ể ư

sau. M t ng i bán hàng, hàng ngày ph i đi giao hàng t m t thành phộ ườ ả ừ ộ ố

đ n m t s thành ph khác r i quay l i thành ph xu t phát. Anh taế ộ ố ố ồ ạ ố ấ

mu n tìm m t tua qua m i thành ph c n đ n đúng m t l n v i đ dàiố ộ ỗ ố ầ ế ộ ầ ớ ộ

167

Page 16: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

c a tua là ng n nh t có th đ c. Chúng ta phát bi u chính xác bài toánủ ắ ấ ể ượ ể

nh sau. Cho đ th đ nh h ng g m n đ nh đ c đánh s 0,1,...,n-1. Đư ồ ị ị ướ ồ ỉ ượ ố ộ

dài c a cung (i,j) đ c kí hi u là dủ ượ ệ ij và là m t s không âm. N u đ thộ ố ế ồ ị

không có cung (i,j) thì ta xem dij = +∞. Chúng ta c n tìm m t đ ng điầ ộ ườ

xu t phát t m t đ nh qua t t c các đ nh khác c a đ th đúng m t l nấ ừ ộ ỉ ấ ả ỉ ủ ồ ị ộ ầ

r i l i tr v đ nh xu t phát (t c là tìm m t chu trình Hamilton) sao choồ ạ ở ề ỉ ấ ứ ộ

đ dài c a tua là nh nh t có th đ c. M i tua nh t là m t dãy cácộ ủ ỏ ấ ể ượ ỗ ư ế ộ

đ nh (aỉ 0, a1,..., an-1, a0), trong đó các a0, a1,..., an-1 là khác nhau. Không m tấ

tính t ng quat, ta có th xem đ nh xu t phát là đ nh 0, aổ ể ỉ ấ ỉ 0 = 0. Nh v y, m iư ậ ỗ

tua t ng ng v i m t hoán v (aươ ứ ớ ộ ị 1,..., an-1) c a các đ nh 1, 2, ..., n-1. T đóủ ỉ ừ

ta có thu t toán sau: sinh ra t t c các hoán v c a n-1 đ nh 1, 2, ..., n-1; v iậ ấ ả ị ủ ỉ ớ

m i hoán v ta tính đ dài c a tua t ng ng v i hoán v đó và so sánh cácỗ ị ộ ủ ươ ứ ớ ị

đ dài ta s tìm đ c tua ng n nh t. L u ý r ng, có t t c (n-1)! hoán vộ ẽ ượ ắ ấ ư ằ ấ ả ị

và m i tua c n n phép toán đ tính đ dài, do đó thu t toán gi i bài toánỗ ầ ể ộ ậ ả

ng i bán hàng v i n thành ph b ng tìm ki m vét c n c n th i gianườ ớ ố ằ ế ạ ầ ờ

O(n!).

Bài toán ng i bán hàng là bài toán kinh đi n và n i ti ng. Ngoàiườ ể ổ ế

cách gi i b ng tìm ki m vét c n, ng i ta đã đ a ra nhi u thu t toán khácả ằ ế ạ ườ ư ề ậ

cho bài toán này. Thu t toán quy ho ch đ ng cho bài toán ng i bán hàngậ ạ ộ ườ

đòi h i th i gian O(nỏ ờ 22n). Cho t i nay ng i ta v n ch a tìm ra thu t toánớ ườ ẫ ư ậ

có th i gian đa th c cho bài toán ng i bán hàng.ờ ứ ườ

16.4.2 Quay lui

Quay lui (backtracking) là k thu t thi t k thu t toán có th sỹ ậ ế ế ậ ể ử

d ng đ gi i quy t r t nhi u v n đ khác nhau. u đi m c a quay lui soụ ể ả ế ấ ề ấ ề Ư ể ủ

v i tìm ki m vét c n là ch có th cho phép ta h n ch các kh năngớ ế ạ ở ỗ ể ạ ế ả

c n xem xét.ầ

Trong nhi u v n đ , vi c tìm nghi m c a v n đ đ c quy v tìmề ấ ề ệ ệ ủ ấ ề ượ ề

m t dãy các tr ng thái (aộ ạ 1, a2,…, ak,…), trong đó m i aỗ i (i = 1,2,…) là m tộ

tr ng thái đ c ch n ra t m t t p h u h n Aạ ượ ọ ừ ộ ậ ữ ạ i các tr ng thái, tho mãnạ ả

các đi u ki n nào đó. Tìm ki m vét c n đòi h i ta ph i xem xét t t c cácề ệ ế ạ ỏ ả ấ ả

168

Page 17: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

dãy tr ng thái đó đ tìm ra dãy tr ng thái tho mãn các yêu c u c a bàiạ ể ạ ả ầ ủ

toán.

Chúng ta s g i dãy các tr ng thái (aẽ ọ ạ 1, a2,…, an) tho mãn các yêuả

c u c a bài toán là vect nghi m. Ý t ng c a k thu t quay lui là ta xâyầ ủ ơ ệ ưở ủ ỹ ậ

d ng vect nghi m xu t phát t vect r ng, m i b c ta b xung thêmự ơ ệ ấ ừ ơ ỗ ỗ ướ ổ

m t thành ph n c a vect nghi m, l n l t aộ ầ ủ ơ ệ ầ ượ 1,a2,…

Đ u tiên, t p Sầ ậ 1 các ng c viên có th là thành ph n đ u tiên c aứ ử ể ầ ầ ủ

vect nghi m chính là Aơ ệ 1.

Ch n aọ 1 ∈ S1, ta có vect (aơ 1). Gi s sau b c th i-1, ta đã tìmả ử ướ ứ

đ c vect (aượ ơ 1,a2,…,ai-1). Ta s g i các vect nh th là nghi m m t ph nẽ ọ ơ ư ế ệ ộ ầ

(nó tho mãn các đòi h i c a bài toán, nh ng ch a “đ y đ ”). Bây gi taả ỏ ủ ữ ư ầ ủ ờ

m r ng nghi m m t ph n (aở ộ ệ ộ ầ 1,a2,…,ai-1) b ng cách b xung thêm thànhằ ổ

ph n th i. Mu n v y, ta c n xác đ nh t p Sầ ứ ố ậ ầ ị ậ i các ng c viên cho thànhứ ử

ph n th i c a vect nghi m. C n l u ý r ng, t p Sầ ứ ủ ơ ệ ầ ư ằ ậ i đ c xác đ nh theoượ ị

các yêu c u c a bài toán và các thành ph n aầ ủ ầ 1,a2,…,ai-1 đã ch n tr c, vàọ ướ

do đó Si là t p con c a t p Aậ ủ ậ i các tr ng thái. ạ Có hai kh năngả

• N u Sế i không r ng, ta ch n aỗ ọ i ∈ Si và thu đ c nghi m m tượ ệ ộ

ph n (aầ 1,a2,…,ai-1,ai), đ ng th i lo i aồ ờ ạ i đã ch n kh i Sọ ỏ i. Sau đó ta l iạ

ti p t c m r ng nghi m m t ph n (aế ụ ở ộ ệ ộ ầ 1,a2,…,ai) b ng cách áp d ngằ ụ

đ quy th t c m r ng nghi m.ệ ủ ụ ở ộ ệ

• N u Sế i r ng, đi u này có nghĩa là ta không th m r ngỗ ề ể ở ộ

nghi m m t ph n (aệ ộ ầ 1,a2,…,ai-2,ai-1), thì ta quay l i ch n ph n t m iạ ọ ầ ử ớ

a’i-1 trong Si-1 làm thành ph n th i-1 c a vect nghi m. N u thànhầ ứ ủ ơ ệ ế

công (khi Si-1 không r ng) ta nh n đ c vect (aỗ ậ ượ ơ 1,a2,…,ai-2,a’i-1) r iồ

ti p t c m r ng nghi m m t ph n này. N u không ch n đ c a’ế ụ ở ộ ệ ộ ầ ế ọ ượ i-1

thì ta quay lui ti p đ ch n a’ế ể ọ i-2… Khi quay lui đ ch n a’ể ọ 1 mà S1 đã

tr thành r ng thì thu t toán d ng.ở ỗ ậ ừ

169

Page 18: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Trong quá trình m r ng nghi m m t ph n, ta c n ki m tra xem nóở ộ ệ ộ ầ ầ ể

có là nghi m không. N u là nghi m, ta ghi l i ho c in ra nghi m này. Kệ ế ệ ạ ặ ệ ỹ

thu t quay lui cho phép ta tìm ra t t c các nghi m c a bài toán.ậ ấ ả ệ ủ

K thu t quay lui mà ta đã trình bày th c ch t là k thu t đi qua câyỹ ậ ự ấ ỹ ậ

tìm ki m theo đ sâu (đi qua cây theo th t preorder). Cây tìm ki m đ cế ộ ứ ự ế ượ

xây d ng nh sauự ư

• Các đ nh con c a g c là các tr ng thái c a Sỉ ủ ố ạ ủ 1

• Gi s aả ử i-1 là m t đ nh m c th i-1 c a cây. Khi đó cácộ ỉ ở ứ ứ ủ

đ nh con c a aỉ ủ i-1 s là các tr ng thái thu c t p ng c viên Sẽ ạ ộ ậ ứ ử i. Cây tìm

ki m đ c th hi n trong hình 16.1.ế ượ ể ệ

Hình 16.1. Cây tìm ki m vect nghi mế ơ ệ

Trong cây tìm ki m, m i đ ng đi t g c t i m t đ nh t ng ng v i m tế ỗ ườ ừ ố ớ ộ ỉ ươ ứ ớ ộ

nghi m m t ph n.ệ ộ ầ

170

S1

Si

ai

ai-1

a1

Start

Page 19: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Khi áp d ng k thu t quay lui đ gi i quy t m t v n đ , thu t toánụ ỹ ậ ể ả ế ộ ấ ề ậ

đ c thi t k có th là đ quy ho c l p. Sau đây ta s đ a ra l c đượ ế ế ể ệ ặ ặ ẽ ư ượ ồ

t ng quát c a thu t toán quay lui.ổ ủ ậ

L c đ thu t toán quay lui đ quyượ ồ ậ ệ . Gi s vector là nghi mả ử ệ

m t ph n (aộ ầ 1,a2,…,ai-1). Hàm đ quy ch n thành ph n th i c a vectorệ ọ ầ ứ ủ

nghi m là nh sau:ệ ư

Backtrack(vector , i)// Ch n thành ph n th i c a vector.ọ ầ ứ ủ{ if (vector là nghi m)ệ

vi t ra nghi m;ế ệ Tính Si; for (m i aỗ i∈Si)

Backtrack(vector + (ai) , i+1);}

Trong hàm trên, n u vector là nghi m m t ph n (aế ệ ộ ầ 1,…,ai-1) thì vector

+ (ai) là nghi m m t ph n (aệ ộ ầ 1,a2,…,ai-1,ai). Đ tìm ra t t c các nghi m, taể ấ ả ệ

ch c n g i Backtrack(vector,1), v i vector là vector r ng.ỉ ầ ọ ớ ỗ

L c đ thu t toán quay lui không đ quyượ ồ ậ ệ

Backtrack{ k = 1; Tính S1; while (k>0) {

if (Sk không r ng)ỗ {

ch n aọ k ∈ Sk;Lo i aạ k kh i Sỏ k;if ((a1,…,ak) là nghi m)ệ

vi t ra nghi m;ế ệk++;Tính Sk;

}

171

Page 20: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

else k-- ; //Quay lui }}

Chú ý r ng, khi cài đ t thu t toán theo l c đ không đ quy, chúngằ ặ ậ ượ ồ ệ

ta c n bi t cách l u l i v t c a các t p ng viên Sầ ế ư ạ ế ủ ậ ứ 1, S2,…,Sk đ khi quayể

lui ta có th ch n đ c thành ph n m i cho vect nghi m.ể ọ ượ ầ ớ ơ ệ

Ví d 3.ụ Thu t toán quay lui cho bài toán 8 con h u. Hình 16.2. môậ ậ

t m t nghi m c a bài toán 8 con h u.ả ộ ệ ủ ậ

0 1 2 3 4 5 6 7

0 x

1 x

2 x

3 x

4 x

5 x

6 x

7 x

Hình 16.2. M t nghi m c a bài toán 8 con h uộ ệ ủ ậ

Nh trong ví d 1, ta g i c t c a con h u dòng i (i = 0,1,..,7) là xư ụ ọ ộ ủ ậ ở i.

Nghi m c a bài toán là vect (xệ ủ ơ 0,x1,…,x7), ch ng h n nghi m trong hìnhẳ ạ ệ

16.2 là (0,6,4,7,1,3,5,2). Con h u 0 ( dòng 0) có th đ c đ t m t trongậ ở ể ượ ặ ở ộ

tám c t. Do đó Sộ 0={0,1,…,7}. Khi ta đã đ t con h u 0 c t 0 (xặ ậ ở ộ 0=0), con

h u 1 c t 6 (xậ ở ộ 1=6), nh trong hình 16.2, thì con h u 2 ch có th đ t ư ậ ỉ ể ặ ở

m t trong các c t 1,3,4. T ng quát, khi ta đã đ t các con h u 0,1,2,…,k-1ộ ộ ổ ặ ậ

thì con h u k (con h u dòng k) ch có th đ t m t trong các c t khácậ ậ ở ỉ ể ặ ở ộ ộ

v i các c t mà các con h u 0,1,2,…,k-1 đã chi m và không cùng đ ngớ ộ ậ ế ườ

chéo v i chúng. Đi u đó có nghiã là khi đã ch n đ c nghi m m t ph nớ ề ọ ượ ệ ộ ầ

(x0,x1,…,xk-1) thì xk ch có th l y trong t p ng viên Sỉ ể ấ ậ ứ k đ c xác đ nh nhượ ị ư

sau

172

Page 21: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Sk = {xk ∈ {0,1,…,7} | xk ≠ xi và | i-k | ≠ | xk-xi | v i m i i < k}ớ ọ

T đó ta có th đ a ra thu t toán sau đây cho bài toán 8 h uừ ể ư ậ ậ

void Queen(int x[8]){ int k = 0; x[0] = -1; while (k>0) {

x[k]++;if (x[k]<=7) {

int i;for (i = 0 ; i < k ; i++)if ((x[k] == x[i]) | | (fabs(i-k) == fabs(x[k] - x[i])))

break; // ki m tra xem x[k] có thu c Sể ộ k

if (i == k) // ch khi x[k] ỉ ∈Sk

if (k == 7) vi t ra m ng x;ế ả

else {

k++; x[k] = -1;

} } else k--; //quay lui } // H t vòng l p whileế ặ}

Ví d 4ụ . Các dãy con có t ng cho tr cổ ướ

Cho m t dãy s nguyên d ng (aộ ố ươ 0,a1,…,an-1) và m t s nguyênộ ố

d ng M. Ta c n tìm các dãy con c a dãy sao cho t ng c a các ph n tươ ầ ủ ổ ủ ầ ử

trong dãy con đó b ng M. Ch ng h n, v i dãy s (7,1,4,3,5,6) và M=11, thìằ ẳ ạ ớ ố

các dãy con c n tìm là (7,1,3), (7,4), (1,4,6) và (5,6).ầ

S d ng k thu t quay lui, ta xác đ nh dãy con (aử ụ ỹ ậ ị i0,ai1,…,aik) sao cho

ai0+ai1+…+aik = M b ng cách ch n l n l t aằ ọ ầ ượ i0,ai1,…Ta có th ch n aể ọ i0 là

173

Page 22: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

m t trong aộ 0,a1,…,an-1 mà nó <= M, t c là có th ch n aứ ể ọ i0 v i iớ 0 thu c t pộ ậ

ng viên Sứ 0 = {i ∈ {0,1,…,n-1} | a i <= M}. Khi đã ch n đ c (aọ ượ i0,ai1,…,aik-

1) v i S = aớ i0 + ai1 + … + aik-1 < M thì ta có th ch n aể ọ ik v i iớ k là m t trongộ

các ch s b t đ u t iỉ ố ắ ầ ừ k-1+1 t i n-1 và sao cho S+aớ ik <= M. T c là, ta có thứ ể

ch n aọ ik v i iớ k thu c t p Sộ ậ k = {i ∈ {ik-1 +1,…, n-1} | S+ai <= M}. Gi s dãyả ử

s đã cho đ c l u trong m ng A. L u dãy ch s {iố ượ ư ả ư ỉ ố 0,i1,…,ik} c a dãy conủ

c n tìm vào m ng I, ta có thu t toán sauầ ả ậ

void SubSequences(int A[n], int M, int I[n]){

k = 0;I[0] = -1;int S = 0;while (k > 0){ I[k]++; If (I[k] < n)

{ if (S + A[i[k]] <= M)

if (S + A[i[k]] == M)vi t ra m ng I[0..k];ế ả

else{

S = S + A[i[k]];I[k+1] = I[k];k++;

}

} else

{k --;S = S - A[i[k]];

}}

}

16.4.3 K thu t quay lui đ gi i bài toán t i uỹ ậ ể ả ố ư

174

Page 23: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Trong m c này chúng ta s áp d ng k thu t quay lui đ tìmụ ẽ ụ ỹ ậ ể

nghi m c a bài toán t i u.ệ ủ ố ư

Gi s nghi m c a bài toán có th bi u di n d i d ng (aả ử ệ ủ ể ể ễ ướ ạ 1,..,an),

trong đó m i thành ph n aỗ ầ i (i = 1,…,n) đ c ch n ra t t p Sượ ọ ừ ậ i các ng viên.ứ

M i nghi m (aỗ ệ 1,..,an) c a bài toán có m t giá cost(aủ ộ 1,..,an) >= 0, và ta c nầ

tìm nghi m có giá th p nh t (nghi m t i u).ệ ấ ấ ệ ố ư

Gi s r ng, giá c a các nghi m m t ph n là không gi m, t c làả ử ằ ủ ệ ộ ầ ả ứ

n u (aế 1,..,ak-1) là nghi m m t ph n và (aệ ộ ầ 1,..,ak-1,ak) là nghi m m r ng c aệ ở ộ ủ

nó thì

cost(a1,..,ak-1) <= cost(a1,..,ak-1,ak)

Trong quá trình m r ng nghi m m t ph n (b ng k thu t quayở ộ ệ ộ ầ ằ ỹ ậ

lui), khi tìm đ c nghi m m t ph n (aượ ệ ộ ầ 1,..,ak), n u bi t r ng t t c cácế ế ằ ấ ả

nghi m m r ng c a nó (aệ ở ộ ủ 1,..,ak,ak+1,...) đ u có giá l n h n giá c a nghi mề ớ ơ ủ ệ

t t nh t đã bi t th i đi m đó, thì ta không c n m r ng nghi m m tố ấ ế ở ờ ể ầ ở ộ ệ ộ

ph n (aầ 1,..,ak) đó.

Gi s cost*(aả ử 1,..,ak) là c n d i c a giá c a t t c các nghi mậ ướ ủ ủ ấ ả ệ

(a1,..,ak,ak+1,...) mà nó là m r ng c a nghi m m t ph n (aở ộ ủ ệ ộ ầ 1,..,ak). Gi sả ử

giá c a nghi m t t nh t mà ta đã tìm ra trong quá trình tìm ki m làủ ệ ố ấ ế

lowcost. (Ban đ u lowcost đ c kh i t o là +ầ ượ ở ạ ∞ và giá tr c a nó đ c c pị ủ ượ ậ

nh t trong quá trình tìm ki m). Khi ta đ t t i nghi m m t ph n (aậ ế ạ ớ ệ ộ ầ 1,..,ak)

mà cost*(a1,..,ak) > lowcost thì ta không c n m r ng nghi m m t ph nầ ở ộ ệ ộ ầ

(a1,..,ak) n a; đi u đó có nghĩa là, trong cây tìm ki m hình 16.1 ta c t b điữ ề ế ắ ỏ

t t c các nhánh t đ nh aấ ả ừ ỉ k.

T các đi u trình bày trên, ta đ a ra l c đ thu t toán tìm nghi mừ ề ư ượ ồ ậ ệ

t i u sau. Thu t toán này th ng đ c g i là ố ư ậ ườ ượ ọ thu t toán nhánh–và--c nậ ậ

(branch – and – bound).

BranchBound{ lowcost = +∞;

175

Page 24: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

cost* = 0; k = 1; tính S1; while (k > 0) {

if (Sk không r ng và cost* <= lowcost)ỗ{

ch n aọ k ∈ Sk;Lo i aạ k ra kh i Sỏ k;cost* = cost*(a1,..,ak);if ((a1,..,ak) là nghi m)ệ

if (cost(a1,..,ak) < lowcost)lowcost = cost(a1,..,ak);

k++;tính Sk;

} else { k--; cost* = cost(a1,..,ak); } }}

u đi m c a thu t toán nhánh – và - c n là ch nó cho phép taƯ ể ủ ậ ậ ở ỗ

không c n ph i xem xét t t c các nghi m v n có th tìm đ c nghi mầ ả ấ ả ệ ẫ ể ượ ệ

t i u. Cái khó nh t trong vi c áp d ng k thu t nhánh và c n là xâyố ư ấ ệ ụ ỹ ậ ậ

d ng hàm đánh giá c n d i cost* c a các nghi m là m r ng c aự ậ ướ ủ ệ ở ộ ủ

nghi m m t ph n. Đánh giá c n d i có ch t m i giúp ta c t b đ cệ ộ ầ ậ ướ ặ ớ ắ ỏ ượ

nhi u nhánh không c n thi t ph i xem xét ti p, và do đó thu t toán nh nề ầ ế ả ế ậ ậ

đ c m i nhanh h n đáng k so v i thu t toán tìm ki m vét c n.ượ ớ ơ ế ớ ậ ế ạ

16.5 CHI N L C THAM ĂNẾ ƯỢ

16.5.1 Ph ng pháp chungươ

176

Page 25: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Các bài toán t i u th ng là có m t s r t l n nghi m, vi c tìm raố ư ườ ộ ố ấ ớ ệ ệ

nghi m t i u (nghi m có giá th p nh t) đòi h i r t nhi u th i gian. Đi nệ ố ư ệ ấ ấ ỏ ấ ề ờ ể

hình là bài toán ng i bán hàng, thu t toán quy ho ch đ ng cũng đòi h iườ ậ ạ ộ ỏ

th i gian O(nờ 22n), và cho t i nay ng i ta v n ch a tìm ra thu t toán cóớ ườ ẫ ư ậ

th i gian đa th c cho bài toán này.ờ ứ

M t cách ti p c n khác đ gi i quy t các bài toán t i u là chi nộ ế ậ ể ả ế ố ư ế

l c tham ăn (greedy strategy).ượ

Trong h u h t các bài toán t i u, đ nh n đ c nghi m t i uầ ế ố ư ể ậ ượ ệ ố ư

chúng ta có th đ a v s th c hi n m t dãy quy t đ nh. Ý t ng c aể ư ề ự ự ệ ộ ế ị ưở ủ

chi n l c tham ăn là, t i m i b c ta s l a ch n quy t đ nh đ th cế ượ ạ ỗ ướ ẽ ự ọ ế ị ể ự

hi n là quy t đ nh đ c xem là t t nh t trong ng c nh nào đó đ c xácệ ế ị ượ ố ấ ữ ả ượ

đ nh b i bài toán. T c là, quy t đ nh đ c l a ch n m i b c là quy tị ở ứ ế ị ượ ự ọ ở ỗ ướ ế

đ nh t i u đ a ph ng. Tùy theo t ng bài toán mà ta đ a ra tiêu chu n l aị ố ư ị ươ ừ ư ẩ ự

ch n quy t đ nh cho thích h p.ọ ế ị ợ

Các thu t toán tham ăn (greedy algorithm) nói chung là đ n gi n vàậ ơ ả

hi u qu (vì các tính toán đ tìm ra quy t đ nh t i u đ a ph ng th ngệ ả ể ế ị ố ư ị ươ ườ

là đ n gi n). Tuy nhiên, các thu t toán tham ăn có th không tìm đ cơ ả ậ ể ượ

nghi m t i u, nói chung nó ch cho ra nghi m g n t i u, nghi m t ngệ ố ư ỉ ệ ầ ố ư ệ ươ

đ i t t. Nh ng cũng có nhi u thu t toán đ c thi t k theo k thu t thamố ố ư ề ậ ượ ế ế ỹ ậ

ăn cho ta nghi m t i u, ch ng h n thu t toán Dijkstra tìm đ ng đi ng nệ ố ư ẳ ạ ậ ườ ắ

nh t t m t đ nh t i các đ nh còn l i trong đ th đ nh h ng, các thu tấ ừ ộ ỉ ớ ỉ ạ ồ ị ị ướ ậ

toán Prim và Kruskal tìm cây bao chùm ng n nh t trong đ th vô h ng,ắ ấ ồ ị ướ

chúng ta s trình bày các thu t toán này trong ch ng 18.ẽ ậ ươ

16.5.2 Thu t toán tham ăn cho bài toán ng i bán hàngậ ườ

Gi s đ th mà ta xét là đ th đ nh h ng n đ nh đ c đánh sả ử ồ ị ồ ị ị ướ ỉ ượ ố

0,1,2,…,n-1, và là đ th đ y đ , t c là v i m i 0 ≤ i , j ≤ n-1 đ u có cungồ ị ầ ủ ứ ớ ọ ề

đi t i đ n j v i đ dài là s th c không âm d(i,j). Gi s đ nh xu t phát làừ ế ớ ộ ố ự ả ử ỉ ấ

đ nh 0, và đ ng đi ng n nh t mà ta c n tìm là (0, aỉ ườ ắ ấ ầ 1, a1,… an-1, 0) trong đó

ak ∈{1,2,…,n-1}. Đ nh n đ c nghi m t i u trên, t i m i b c k (k =ể ậ ượ ệ ố ư ạ ỗ ướ

177

Page 26: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

1,…, n-1) chúng ta c n ch n m t đ nh aầ ọ ộ ỉ k đ đi t i trong s các đ nh ch aể ớ ố ỉ ư

thăm (t c là aứ k ≠ ai , i = 1,…, k-1). V i mong mu n đ ng đi nh n đ c làớ ố ườ ậ ượ

ng n nh t, ta đ a ra tiêu chu n ch n đ nh aắ ấ ư ẩ ọ ỉ k m i b c là đ nh g n nh tở ỗ ướ ỉ ầ ấ

trong s các đ nh ch a thăm.ố ỉ ư

Ví dụ. Xét đ th đ nh h ng trong hình 16.3ồ ị ị ướ

Hình 16.3. M t đ th đ nh h ngộ ồ ị ị ướ

Gi s ta c n tìm tua ng n nh t xu t phát t A. Vì d(A,B) = 7,ả ử ầ ắ ấ ấ ừ

d(A,C) = 3 và d(A,D) = 1, nên ta ch n đ nh D đ đi t i, ta có đ ng đi (A,ọ ỉ ể ớ ườ

D). T D, các đ nh ch a thăm là B và C, ta ch n C đ đi t i vì C g n Dừ ỉ ư ọ ể ớ ầ

h n là B. Ta thu đ c đ ng đi (A, D, C). T C ta ch có m t kh năng làơ ượ ườ ừ ỉ ộ ả

đi t i B. Do đó ta nh n đ c tua (A, D, C, B, A). Đ dài c a nó là 1 + 2 +ớ ậ ượ ộ ủ

9 + 5 = 17. Đây không ph i là đ ng đi ng n nh t, vì đ ng đi ng n nh tả ườ ắ ấ ườ ắ ấ

là (A, C, D, B, A) có đ dài 3 + 2 + 6 + 5 = 16.ộ

16.5.3 Thu t toán tham ăn cho bài toán ba lôậ

178

A

B C

D

9

4

2 2

1

8

57

6

8

35

Page 27: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Chúng ta tr l i bài toán ba lô đã đ a ra trong m c 16.3.2. Chúng taở ạ ư ụ

c n nh n đ c chi c ba lô ch a đ v t có giá tr l n nh t. M t cách ti pầ ậ ượ ế ứ ồ ậ ị ớ ấ ộ ế

c n khác đ có chi c ba lô đó là m i b c x p m t lo i đ v t vào ba lô.ậ ể ế ỗ ướ ế ộ ạ ồ ậ

V n đ đ t ra là t i b c k (k = 1,2,…) ta c n ch n lo i đ v t nào đấ ề ặ ạ ướ ầ ọ ạ ồ ậ ể

x p và x p bao nhiêu đ v t lo i đó. T các đòi h i c a bài toán, ta đ a raế ế ồ ậ ạ ừ ỏ ủ ư

tiêu chu n ch n nh sau: t i m i b c ta s ch n lo i đ v t có giá trẩ ọ ư ạ ỗ ướ ẽ ọ ạ ồ ậ ị

l n nh t trên m t đ n v kh i l ng (g i t t là t giá) trong s các lo i đớ ấ ộ ơ ị ố ượ ọ ắ ỷ ố ạ ồ

v t ch a đ c x p vào ba lô. Khi đã ch n m t lo i đ v t thì ta x p t iậ ư ượ ế ọ ộ ạ ồ ậ ế ố

đa có th đ c.ể ượ

Ví d , gi s ta có ba lô ch a đ c kh i l ng w = 20. Chúng ta cóụ ả ử ứ ượ ố ượ

4 lo i đ v t có kh i l ng aạ ồ ậ ố ượ i và giá tr cị i (i = 1,2,3,4) đ c cho trongượ

b ng sau:ả

Lo iạ 1 2 3 4

Kh i l ng aố ượ i 5 7 8 3

Giá tr cị i 21 42 20 9

T giá cỷ i/ai 4,2 6 2,5 3

Đ u tiên trong 4 lo i đ v t thì lo i có t giá l n nh t là lo i 2. Taầ ạ ồ ậ ạ ỷ ớ ấ ạ

có th x p đ c t i đa 2 đ v t lo i 2 vào ba lô, và kh i l ng còn l iể ế ượ ố ồ ậ ạ ố ượ ạ

c a ba lô là 20 – 2 . 7 = 6. Đ n đây s lo i đ v t ch a x p: 1 , 3 , 4 , lo iủ ế ố ạ ồ ậ ư ế ạ

có t giá l n nh t là lo i 1. Kh i l ng còn l i c a ba lô là 6, nên ch x pỷ ớ ấ ạ ố ượ ạ ủ ỉ ế

đ c 1 đ v t lo i 1. B c ti p theo ta ch n lo i 4, nh ng kh i l ngượ ồ ậ ạ ướ ế ọ ạ ư ố ượ

còn l i c a ba lô là 6-1.5 = 1, nên không x p đ c đ v t lo i 4 (vì đ v tạ ủ ế ượ ồ ậ ạ ồ ậ

lo i 4 có kh i l ng 3 > 1). Ch n đ v t lo i 3, cũng không x p đ c, vàạ ố ượ ọ ồ ậ ạ ế ượ

d ng l i. Nh v y ta thu đ c ba lô ch a 2 đ v t lo i 2 và 1 đ v t lo iừ ạ ư ậ ượ ứ ồ ậ ạ ồ ậ ạ

1, v i giá tr là 2.42 + 1.21 = 105.ớ ị

Thu t toán tham ăn x p các đ v t vào ba lô nh đã trình bày cũngậ ế ồ ậ ư

không tìm ra nghi m t i u, mà ch cho ra nghi m t t. Th thì t i sao taệ ố ư ỉ ệ ố ế ạ

l i c n đ n các thu t toán tham ăn mà nó ch cho ra nghi m t t, g n đúngạ ầ ế ậ ỉ ệ ố ầ

179

Page 28: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

v i nghi m t i u. V n đ là ch , đ i v i nhi u bài toán, ch ng h nớ ệ ố ư ấ ề ở ỗ ố ớ ề ẳ ạ

bài toán ng i bán hàng, bài toán s n đ th ,…, các thu t toán tìm raườ ơ ồ ị ậ

nghi m chính xác đòi h i th i gian mũ, không s d ng đ c trong th c tệ ỏ ờ ử ụ ượ ự ế

khi c bài toán khá l n. Còn có nh ng bài toán đ tìm ra nghi m t i u taỡ ớ ữ ể ệ ố ư

ch còn có cách là tìm ki m vét c n. Trong các tr ng h p nh th , sỉ ế ạ ườ ợ ư ế ử

d ng các thu t toán tham ăn là c n thi t, b i vì các thu t toán tham ănụ ậ ầ ế ở ậ

th ng là đ n gi n, r t hi u qu , và th c t nhi u khi có đ c m tườ ơ ả ấ ệ ả ự ế ề ượ ộ

nghi m t t cũng là đ .ệ ố ủ

16.6 THU T TOÁN NG U NHIÊNẬ Ẫ

Khi trong m t b c nào đó c a thu t toán, ta c n ph i l a ch nộ ướ ủ ậ ầ ả ự ọ

m t trong nhi u kh năng, thay vì ph i tiêu t n th i gian xem xét t t cộ ề ả ả ố ờ ấ ả

các kh năng đ có s l a ch n t i u, ng i ta có th ch n ng u nhiênả ể ự ự ọ ố ư ườ ể ọ ẫ

m t kh năng. S l a ch n ng u nhiên l i càng thích h p cho các tr ngộ ả ự ự ọ ẫ ạ ợ ườ

h p khi mà h u h t các kh năng đ u “t t” ngang nhau. Các thu t toánợ ầ ế ả ề ố ậ

ch a s l a ch n ng u nhiên đ c g i là các thu t toán ng u nhiênứ ự ự ọ ẫ ượ ọ ậ ẫ

(randomized algorithm hay probabilistic algorithm). Đ c tr ng c a thu tặ ư ủ ậ

toán ng u nhiên là, k t qu c a thu t toán không ch ph thu c vào giá trẫ ế ả ủ ậ ỉ ụ ộ ị

đ u vào c a thu t toán mà còn ph thu c vào giá tr ng u nhiên đ c sinhầ ủ ậ ụ ộ ị ẫ ượ

ra b i hàm sinh s ng u nhiên. N u ta cho ch y thu t toán ng u nhiên haiở ố ẫ ế ạ ậ ẫ

l n trên cùng m t d li u vào, thu t toán có th cho ra k t qu khác nhau.ầ ộ ữ ệ ậ ể ế ả

Trong các thu t toán ng u nhiên, ta c n s d ng các hàm sinh sậ ẫ ầ ử ụ ố

ng u nhiên (random number generator). Trong các thu t toán ng u nhiênẫ ậ ẫ

s đ a ra sau này, ta gi s đã có s n các hàm sinh s ng u nhiên sau.ẽ ư ả ử ẵ ố ẫ

Hàm RandInt(i,j), trong đó i, j là các s nguyên và 0 <= i <= j, tr v m tố ả ề ộ

s nguyên ng u nhiên k, i <= k <= j. Hàm RandReal(a,b), trong đó a, b làố ẫ

các s th c và a < b, tr v m t s th c ng u nhiên x , a <= x <= b.ố ự ả ề ộ ố ự ẫ

Các thu t toán ng u nhiên hay g p th ng là thu c m t trong cácậ ẫ ặ ườ ộ ộ

l p sau:ớ

* Các thu t toán tính nghi m g n đúng c a các bài toán s .ậ ệ ầ ủ ố

180

Page 29: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

* Các thu t toán Monte Carlo. Đ c đi m c a các thu t toán này làậ ặ ể ủ ậ

nó luôn cho ra câu tr l i , song câu tr l i có th không đúng. Xác su tả ờ ả ờ ể ấ

thành công (t c là nh n đ c câu tr l i đúng) s tăng, khi ta th c hi nứ ậ ượ ả ờ ẽ ự ệ

l p l i thu t toán.ặ ạ ậ

* Các thu t toán Las Vegas. Các thu t toán này không bao gi cho raậ ậ ờ

câu tr l i sai, song có th nó không tìm ra câu tr l i. Xác su t th t b iả ờ ể ả ờ ấ ấ ạ

(không tìm ra câu tr l i) có th là nh tùy ý, khi ta l p l i thu t toán m tả ờ ể ỏ ặ ạ ậ ộ

s l n đ l n v i cùng m t d li u vào.ố ầ ủ ớ ớ ộ ữ ệ

Các thu t toán ng u nhiên r t đa d ng và phong phú, và có trongậ ẫ ấ ạ

nhi u lĩnh v c khác nhau. Sau đây ta đ a ra m t s ví d minh h a.ề ự ư ộ ố ụ ọ

Ví d 1ụ . Tính g n đúng s ầ ố ∏

Ta có m t hình vuông ngo i ti p m t hình tròn bán kính r ( xem hìnhộ ạ ế ộ

16). Ta ti n hành th c nghi m sau. Ném n h t vào hình vuông này, gi sế ự ệ ạ ả ử

r ng, m i đi m trong hình vuông này “là đi m r i khi ta ném m t h t vàoằ ọ ể ể ơ ộ ạ

hình vuông” v i xác su t là nh nhau. Di n tích c a hình tròn là ớ ấ ư ệ ủ ∏r2, và

di n tích c a hình vuông là 4rệ ủ 2, do đó ∏r2 /4r2 = ∏/4

Gi s s h t r i vào trong hình tròn là k, ta có th đánh giá ả ử ố ạ ơ ể ∏ = 4k/

n. Th c nghi m trên đ c mô t b i thu t toán sau:ự ệ ượ ả ở ậ

k = 0;for (i = 0 ; i < n ; i++){ x = RandReal(-r,r); y = RandReal(-r,r); if ( đi m (x,y) n m trong hình tròn )ể ằ k++}∏ = 4k/n;

181

x xx

x xx

xx

x

xxx

x

x

xxx

xx

xxx

x

x xx

x xx

Page 30: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Hình 16. Ném các h t đ tính ạ ể ∏

Ví d 2.ụ Tính g n đúng tính phân xác đ nhầ ị

Gi s ta c n tính tích phân xác đ nhả ử ầ ị

( )∫b

a

dxxf

Gi s tích phân này t n t i. Ta ch n ng u nhiên n đi m trên đo n [a,b].ả ử ồ ạ ọ ẫ ể ạ

Khi đó giá tr c a tích phân có th đánh giá là trung bình c ng các giá trị ủ ể ộ ị

c a hàm f(x) trên các đi m đã ch n nhân v i đ dài c a đo n l y tíchủ ể ọ ớ ộ ủ ạ ấ

phân. Ta có thu t toán sau:ậ

Integral(f, a, b){ sum = 0; for ( i = 0 ; i < n ; i++) {

x = RandReal(a, b);sum = sum+f(x);

} return (b-a) * (sum / n);

}

Ví d 3ụ . Ph n t đa s .ầ ử ố

Chúng ta g i ph n t đa s trong m t m ng n ph n t A[0..n-1] làọ ầ ử ố ộ ả ầ ử

ph n t mà s ph n t b ng nó trong m ng A l n h n n/2. V i m ng Aầ ử ố ầ ử ằ ả ớ ơ ớ ả

cho tr c ta c n bi t m ng A có ch a ph n t đa s hay không. Ta đ a raướ ầ ế ả ứ ầ ử ố ư

182

Page 31: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

thu t toán đ n gi n sau. Ch n ng u nhiên m t ph n t b t kỳ trong m ngậ ơ ả ọ ẫ ộ ầ ử ấ ả

A và ki m tra xem nó có là ph n t đa s hay không.ể ầ ử ố

bool Majority( A[0..n-1] ){ i = RandInt(0,n-1); x = A[i]; k = 0; for ( j = 0 ; j < n ; j++)

if (A[j] = = x)k++;

return (k > n / 2);}

N u m ng A không ch a ph n t đa s , thu t toán trên luôn tr vế ả ứ ầ ử ố ậ ả ề

false (t c là luôn luôn cho câu tr l i đúng). Gi s m ng A ch a ph n tứ ả ờ ả ử ả ứ ầ ử

đa s . Khi đó thu t toán có th cho câu tr l i sai. Nh ng vì ph n t đa số ậ ể ả ờ ư ầ ử ố

chi m quá n a s ph n t trong m ng, nên xác su t ch n ng u nhiênế ử ố ầ ử ả ấ ọ ẫ

đ c ph n t đa s là p > 1/2, t c là xác su t thu t toán cho câu tr l iượ ầ ử ố ứ ấ ậ ả ờ

đúng là p > 1/2. Bây gi cho ch y thu t toán trên hai l n và th tính xemờ ạ ậ ầ ử

xác su t đ “l n đ u nh n đ c câu tr l i đúng ho c l n đ u nh nấ ể ầ ầ ậ ượ ả ờ ặ ầ ầ ậ

đ c câu tr l i sai và l n hai nh n đ c câu tr l i đúng” là bao nhiêu.ượ ả ờ ầ ậ ượ ả ờ

Xác su t này b ngấ ằ

p + (1 – p) p = 1- (1 - p)2 > 3 / 4

Nh v y có th k t lu n r ng, n u m ng A ch a ph n t đa s , thìư ậ ể ế ậ ằ ế ả ứ ầ ử ố

th c hi n l p l i thu t toán trên m t s l n đ l n, ta s tìm đ c ph nự ệ ặ ạ ậ ộ ố ầ ủ ớ ẽ ượ ầ

t đa s . Thu t toán trên là thu t toán Monte Carlo.ử ố ậ ậ

Ví d 4. Thu t toán Las Vegas cho bài toán 8 con h uụ ậ ậ

Chúng ta nhìn l i bài toán 8 con h u đã đ a ra trong m c 16.4. Nhạ ậ ư ụ ớ

l i r ng, nghi m c a bài toán là vect (xạ ằ ệ ủ ơ 0, x1, …,x7), trong đó xi là c t c aộ ủ

con h u dòng th i (i = 0, 1, …,7). Trong thu t toán quay lui, xậ ở ứ ậ i đ cượ

tìm b ng cách xem xét l n l t các c t 0, 1, …,7 và quan tâm t i đi uằ ầ ượ ộ ớ ề

ki n các con h u không t n công nhau. Nh ng quan sát các nghi m tìmệ ậ ấ ư ệ

183

Page 32: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

đ c ta th y r ng không có m t quy lu t nào v các v trí c a các conượ ấ ằ ộ ậ ề ị ủ

h u. Đi u đó g i ý ta đ a ra thu t toán ng u nhiên sau. Đ đ t con h uậ ề ợ ư ậ ẫ ể ặ ậ

th i, ta đ t nó ng u nhiên vào m t trong các c t có th đ t (t c là khi đ tứ ặ ẫ ộ ộ ể ặ ứ ặ

con h u th i vào c t đó, thì nó không t n công các con h u đã đ t). Vi cậ ứ ộ ấ ậ ặ ệ

đ t ng u nhiên nh th có th không d n t i nghi m, b i vì các con h uặ ẫ ư ế ể ẫ ớ ệ ở ậ

đã đ t có th kh ng ch m i v trí và do đó không th đ t con h u ti pặ ể ố ế ọ ị ể ặ ậ ế

theo.

BÀI T PẬ

Thi t k thu t toán b ng k thu t chia - đ - tr cho các bài toánế ế ậ ằ ỹ ậ ể ị sau:

1. (Trao đ i hai ph n c a m t m ng). Cho m ng A[0…n-1], ta c nổ ầ ủ ộ ả ả ầ trao đ i k ph n t đ u tiên c a m ng (1 ổ ầ ử ầ ủ ả ≤ k < n) v i n – k ph n tớ ầ ử còn l i, nh ng không đ c s d ng m ng ph . Ch ng h n, v i k =ạ ư ượ ử ụ ả ụ ẳ ạ ớ 3 và A là m ng nh sau:ả ư

A :

Sau khi trao đ i ta c n nh n đ c m ng:ổ ầ ậ ượ ả

A :

2. (Dãy con không gi m dài nh t). Cho m t dãy s nguyên đ c l uả ấ ộ ố ượ ư trong m ng A[0 … n-1], ta c n tìm dãy ch s 0 ả ầ ỉ ố ≤ i1 < i2 < …< ik ≤ n – 1 sao cho A[i0 ] ≤ A[i1 ] ≤ … ≤ A[ik ] và k là l n nh t có thớ ấ ể đ c. Ví d , n u a = (8, 3, 7, 4, 2, 5, 3, 6) thì dãy con không gi mượ ụ ế ả dài nh t là (3, 4, 5, 6).ấ

3. Cho hai dãy không gi m A = (aả 1, a2, …, am ) trong đó a1 ≤ a2 ≤ … ≤ am và B = (b1 , b2, …, bn) trong đó b1 ≤ b2 ≤ …≤ bn . Dãy hoà nh pậ c a hai dãy không gi m A và B là dãy không gi m C = (củ ả ả 1, c2, …,

184

a b c d e f g

d e f g a b c

Page 33: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

cm+n ), trong đó m i ph n t c a dãy A ho c dãy B xu t hi n trongỗ ầ ử ủ ặ ấ ệ dãy C đúng m t l n.ộ ầHãy tìm ph n t th k c a dãy C. Ch ng h n, n u A = (1, 3, 5, 9) vàầ ử ứ ủ ẳ ạ ế B = (3, 6, 8) thì dãy C = (1, 3, 5, 6, 8, 9).

Thi t k thu t toán b ng k thu t quy ho ch đ ng cho cácế ế ậ ằ ỹ ậ ạ ộ bài toán sau:

4. Bài toán tìm dãy con không gi m dài nh t đã nói trong bài toán 2.ả ấ

5. (Đ i ti n). Cho m t t p A các lo i ti n A = {aổ ề ộ ậ ạ ề 1, a2, …, an }, trong đó m i aỗ i là m nh giá c a m t lo i ti n, aệ ủ ộ ạ ề i là s nguyên d ng. V nố ươ ấ đ đ i ti n đ c xác đ nh nh sau. Cho m t s nguyên d ng c (sề ổ ề ượ ị ư ộ ố ươ ố ti n c n đ i), hãy tìm s ít nh t các t ti n v i các m nh giá trongề ầ ổ ố ấ ờ ề ớ ệ A sao cho t ng c a ch ng b ng c. Gi thi t r ng, m i lo i ti n cóổ ủ ứ ằ ả ế ằ ỗ ạ ề đ nhi u, và có m t lo i ti n có m nh giá là 1.ủ ề ộ ạ ề ệ

6. Cho u và v là hai xâu ký t b t kỳ. Ta mu n bi n đ i xâu u thànhự ấ ố ế ổ xâu v b ng cách s d ng các phép toán sau:ằ ử ụ

• Xoá m t ký t .ộ ự• Thêm m t ký t .ộ ự• Thay đ i m t ký t .ổ ộ ự

Ch ng h n, ta có th bi n đ i xâu abbac thành xâu abcbc b ng 3ẳ ạ ể ế ổ ằ phép toán nh sau:ư abbac abac (xoá b) ababc (thêm b) abcbc (thay a b ng c)ằCó th th y r ng, cách trên không t i u, vì ch c n 2 phép toán.ể ấ ằ ố ư ỉ ầ V n đ đ t ra là: hãy tìm s ít nh t các phép toán c n th c hi n đấ ề ặ ố ấ ầ ự ệ ể bi n xâu u thành xâu v, và cho bi t đó là các phép toán nào.ế ế

7. Cho n đ i t ng, ta mu n s p x p n đ i t ng đó theo th t đ cố ượ ố ắ ế ố ượ ứ ự ượ xác đ nh b i các quan h “ < ” và “ = ”. Ch ng h n, v i 3 đ i t ngị ở ệ ẳ ạ ớ ố ượ A, B, C chúng ta có 13 cách s p x p nh sau:ắ ế ưA = B = C, A = B < C, A < B = C, A < B < C, A < C < B, A = C < B, B < A = C, B < A < C, B < C < A, B = C < A, C < A = B, C < A < B, C < B < A.Hãy tính s cách s p x p n đ i t ng.ố ắ ế ố ượ

185

Page 34: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

Trong các bài toán sau, hãy đ a ra thu t toán đ c thi t kư ậ ượ ế ế b ng k thu t quy lui:ằ ỹ ậ

8. Mê l là m t l i ô vuông g m n dòng và n c t, các dòng và các c tộ ộ ướ ồ ộ ộ đ c đánh s t 0 đ n n-1. M t ô vuông có th b c m đi vào ho cượ ố ừ ế ộ ể ị ấ ặ không. T m t ô vuông có th đi đ n ô vuông k nó theo dòng ho cừ ộ ể ế ề ặ theo c t, n u ô đó không b c m đi vào. C n tìm đ ng đi t ôộ ế ị ấ ầ ườ ừ vuông góc trên bên trái t i ô góc d i bên ph i.ở ớ ở ướ ả

9. Cho s t nhiên n, hãy cho bi t t t c các dãy s t nhiên tăng, cóố ự ế ấ ả ố ự t ng b ng n. Ch ng h n, v i n = 6, ta có các dãy sau:ổ ằ ẳ ạ ớ

1 , 2 , 3 1 , 5 2 , 4 6

10.(Bài toán c p đôi). Cho n đ i t ng đ c đánh s 0, 1, …, n-1. Choặ ố ượ ượ ố P[i] [j] là s đo s a thích c a đ i t ng i v i đ i t ng j, P[i] [j]ố ự ư ủ ố ưọ ớ ố ượ là s không âm. Tr ng s c a c p đôi (i, j) là tích P[i] [j] * P[j] [i].ố ọ ố ủ ặ Chúng ta c n tìm m t cách c p đôi sao cho m i đ i t ng ph iầ ộ ặ ỗ ố ượ ả đ c c p đôi v i m t đ i t ng khác (gi s n ch n) và hai đ iượ ặ ớ ộ ố ượ ả ử ẵ ố t ng khác nhau c n ph i c p đôi v i hai đ i t ng khác nhau, vàượ ầ ả ặ ớ ố ượ sao cho t ng các tr ng s c p đôi là l n nh t.ổ ọ ố ặ ớ ấ

11.Cho bàn c n x n và m t v trí xu t phát b t kỳ trên bàn c . Tìmờ ộ ị ấ ấ ờ đ ng đi c a con mã t v trí xu t phát sao cho nó thăm t t c các vườ ủ ừ ị ấ ấ ả ị trí c a bàn c đúng m t l n.ủ ờ ộ ầ

Thi t k thu t toán gi i các bài toán sau đây b ng ế ế ậ ả ằ k thu t thamỹ ậ ăn:

12.Quay l i bài toán đ i ti n trong bài t p 5. Hãy đ a ra m t thu t toánạ ổ ề ậ ư ộ ậ khác d a vào ý t ng sau. T i m i b c, v i s ti n còn l i ta sự ưở ạ ỗ ướ ớ ố ề ạ ử d ng lo i ti n có m nh giá l n nh t trong các lo i ti n còn l i, vàụ ạ ề ệ ớ ấ ạ ề ạ s d ng s t t i đa v i m nh giá đó. Hãy ch ra r ng, thu t toán cóử ụ ố ờ ố ớ ệ ỉ ằ ậ th không cho ra cách đ i v i s t ti n là ít nh t.ể ổ ớ ố ờ ề ấ

13. Cho đ th vô h ng G = (V, E), trong đó V là t p đ nh, còn E là t pồ ị ướ ậ ỉ ậ c nh. M t t p U các đ nh đ c g i là m t ph , n u c nh (u, v) ạ ộ ậ ỉ ượ ọ ộ ủ ế ạ ∈ E thì ho c đ nh u ho c đ nh v ph i thu c U. Ph có s đ nh ít nh tặ ỉ ặ ỉ ả ộ ủ ố ỉ ấ đ c g i là ph nh nh t. Có th xây d ng t p U d n t ng b cượ ọ ủ ỏ ấ ể ự ậ ầ ừ ướ

186

Page 35: CÁC CHI N L C THI T K THU T TOÁN Ế ƯỢ Ế Ế Ậccs.hnue.edu.vn/hungtd/CTDLGT2012/documents/Cac chien luoc thiet ke...CÁC CHI N L C THI T K THU T TOÁNẾ ƯỢ Ế Ế Ậ

xu t phát t U r ng, t i m i b c ta thêm vào U m t đ nh v là đ nhấ ừ ỗ ạ ỗ ướ ộ ỉ ỉ có b c l n nh t trong các đ nh không có trong U. Hãy vi t ra thu tậ ớ ấ ỉ ế ậ toán d a theo ý t ng trên. Thu t toán có cho ra ph nh nh tự ưở ậ ủ ỏ ấ không?

14.Hãy đ a ra m t thu t toán ng u nhiên đ t o ra m t mê l (xemư ộ ậ ẫ ể ạ ộ ộ đ nh nghĩa mê l trong bài t p 8).ị ộ ậ

187