1. Trang chủ
  2. » Thể loại khác

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

13 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Phân tích các chương trình đệ quy Bởi unknown 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[.]

Phân tích chương trình đệ quy Phân tích chương trình đệ quy Bởi: unknown Thành lập phương trình đệ quy Phương trình đệ quy phương trình biểu diễn mối liên hệ T(n) T(k), T(n) thời gian thực chương trình với kích thước liệu nhập n, T(k) thời gian thực chương trình với kích thước liệu nhập k, với k < n Ðể thành lập phương trình đệ quy, ta phải vào chương trình đệ quy Thơng thường chương trình đệ quy để giải tốn kích thước n, phải có trường hợp dừng ứng với n cụ thể lời gọi đệ quy để giải toán kích thước k (k0 chương trình phải gọi đệ quy Giai_thua(n-1), việc gọi đệ quy tốn T(n-1), sau có kết việc gọi đệ quy, chương trình phải nhân kết với n gán cho Giai_thua Thời gian để thực phép nhân phép gán C2 Vậy ta có C1nêun=0 T(n) = T(n-1) + C2nêun > { Ðây phương trình đệ quy để tính thời gian thực chương trình đệ quy Giai_thua Ví du 1-11: Chúng ta xét thủ tục MergeSort cách phác thảo sau: FUNCTION MergeSort (L:List; n:Integer):List; VAR L1,L2:List; BEGIN IF n=1 THEN RETURN(L) ELSE BEGIN Chia đôi L thành L1 L2, với độ dài n/2; RETURN(Merge(MergeSort(L1,n/2),MergeSort(L2,n/2))); END; 2/13 Phân tích chương trình đệ quy END; Chẳng hạn để xếp danh sách L gồm phần tử 7, 4, 8, 9, 3, 1, 6, ta có mơ hình minh họa MergeSort sau: Hàm MergeSort nhận danh sách có độ dài n trả danh sách xếp Thủ tục Merge nhận hai danh sách L1 L2 danh sách có độ dài n2 , trộn chúng lại với để danh sách gồm n phần tử có thứ tự Giải thuật chi tiết Merge ta bàn sau, để ý thời gian để Merge danh sách có độ dài n2 O(n) Gọi T(n) thời gian thực MergeSort danh sách n phần tử T( n2 ) thời gian thực MergeSort danh sách n2 phần tử Khi L có độ dài (n = 1) chương trình làm việc return(L), việc tốn O(1) = C1 thời gian Trong trường hợp n > 1, chương trình phải thực gọi đệ quy MergeSort hai lần cho L1 L2 với độ dài n2 thời gian để gọi hai lần đệ quy 3/13 Phân tích chương trình đệ quy 2T( n2 ) Ngồi cịn phải tốn thời gian cho việc chia danh sách L thành hai nửa trộn hai danh sách kết (Merge) Người ta xác đinh thời gian để chia danh sách Merge O(n) = C2n Vậy ta có phương trình đệ quy sau: T(n) = { C1nêu n = n 2T( ) + C2 n nêu n>1 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 lớp phương trình đệ quy Phương pháp truy hồi Dùng đệ quy để thay T(m) với m < n vào phía phải phương trình tất T(m) với m > thay biểu thức T(1) T(0) Vì T(1) T(0) ln số nên có cơng thức T(n) chứa số hạng liên quan đến n số Từ cơng thức ta suy T(n) C1nêun=0 Ví dụ 1-12: Giải phương trình T(n) = T(n-1) + C2nêun > { 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 kết thúc n - i = hay i = n Khi ta có 4/13 Phân tích chương trình đệ quy T(n) = T(0) + nC2 = C1 + n C2 = O(n) Ví dụ 1-13: Giải phương trình T(n) = { C1nêu n = n 2T( ) + C2 n nêu n>1 Ta có T(n)=2T( n2 )+2C2n n n n n n T(n) = 2[2T( ) + C2 ] + C2 n=4T ( ) + 2C2n n T(n) = 4[2T( ) + C2 ] + 2C2 n=8T ( ) + 3C2n ……… n T(n) = 2iT( i ) + iC2n Quá trình suy rộng kết thúc n 2i = hay 2i = n i = logn Khi ta có: T(n) = nT(1) + lognC2n = C1n + C2nlogn = O(nlogn) Phương pháp đoán nghiệm Ta đoán nghiệm f(n) dùng chứng minh quy nạp để chứng tỏ T(n) ≤ f(n) với n Thông thường f(n) hàm quen thuộc logn, n, nlogn, n2, n3, 2n, n!,nn Ðôi đốn dạng f(n) có vài tham số chưa xác định (chẳng hạn f(n) = an2 với a chưa xác định) trình chứng minh quy nạp ta suy diễn giá trị thích hợp tham số Ví dụ 1-12: Giải phương trình đệ quy T(n) = { C1nêu n = n 2T( ) + C2 n nêu n>1 Giả sử đoán f(n) = anlogn Với n = ta thấy cách đoán khơng anlogn có giá trị khơng phụ thuộc vào giá trị a Vì ta thử f(n) = anlogn + b Với n = ta có, T(1) = C1 f(1) = b, muốn T(1) ≤ f(1) b ≥ C1 (*) 5/13 Phân tích chương trình đệ quy Giả sử T(k) ≤ f(k), tức T(k) ≤ aklogk + b với k < n (giả thiết quy nạp) Ta phải chứng minh T(n) ≤ anlogn + b với n Giả sử n ≥ 2, từ phương trình cho ta có T(n) = 2T( n2 ) + C2n Áp dụng giả thiết quy nạp với k = T(n) = 2T( n2 ) + C2n ≤ 2[a n2 log n n < n ta có: + b] + C2n T(n) ≤ (anlogn - an + 2b) + C2n T(n) ≤ (anlogn + b) + [b + (C2 - a)n] Nếu lấy a ≥ C2 + b (**) ta T(n) ≤ (anlogn + b) + [b +(C2 - C2 - b )n ] T(n) ≤ (anlogn + b) + (1-n) b T(n) ≤ anlogn + b = f(n) (do b>0 1-n1 Ta sử dụng phương pháp truy hồi để giải phương trình Khi n > ta có T(n) = aT( nb ) + d(n) T(n)= a[aT( ( n b2 n ) ( ))+ad(( ))+d(n) )+ d( b ) ]+d(n)=a2T( ( ) n b2 n b ( ) ( ) T(n)= a2[a T( n3 ) + d ( n2 ) ] + ad(( nb )) + d(n) = a3T ( n3 ) + a2d ( n2 ) + ad(( nb )) + d(n) = b b ( ) b b ( ) a j = aiT( ni ) + ∑i-1 j = a d( j ) b b Giả sử n = bk, trình suy rộng kết thúc i = k Khi ta T( n bk ) = T(1) = Thay vào ta có: j k-j T(n) = ak + ∑k-1 j = a d(b ) (I.2) Hàm tiến triển, nghiệm nghiệm riêng Trong phương trình đệ quy (I.1) hàm thời gian d(n) gọi hàm tiến triển (driving function) 7/13 Phân tích chương trình đệ quy Trong công thức (I.2), ak = nlogba gọi nghiệm (homogeneous solutions) Nghiệm nghiệm xác d(n) = với n Nói cách khác, nghiệm biểu diễn thời gian để giải tất toán j k-j Trong công thức (I.2), ∑k-1 j = a d(b )được gọi nghiệm riêng (particular solutions) Nghiệm riêng biểu diễn thời gian phải tốn để tạo toán tổng hợp kết 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 kích thước tốn Khi tìm nghiệm phương trình (I.1), phải tìm nghiệm riêng so sánh với nghiệm Nếu nghiệm lớn hơn, ta lấy nghiệm làm nghiệm phương trình (I.1) Việc xác định nghiệm riêng không đơn giản chút nào, vậy, tìm lớp hàm tiến triển dễ dàng xác định nghiệm riêng Hàm nhân Một hàm f(n) gọi hàm nhân (multiplicative function) f(m.n) = f(m).f(n) với số nguyên dương m n Ví dụ 1-13: Hàm f(n) = nk hàm nhân, f(m.n) = (m.n)k = mk.nk = f(m) f(n) Tính nghiệm phương trình tổng qt trường hợp d(n) hàm nhân: Nếu d(n) (I.1) hàm nhân theo tính chất hàm nhân ta có d(bk-j) = [d(b)]k-j nghiệm riêng (I.2) (b j ∑k-1 j=0ad k-j )= j k-j ∑k-1 j = a [d(b)] Hay nghiệm riêng = ak-[d(b)]k a -1 d(b) = [d(b)] k a j ∑k-1 j = [ d(b) ] a = [d(b)] k [ d(b) ] k -1 a -1 d(b) (I.3) Xét ba trường hợp sau: 8/13 Phân tích chương trình đệ quy 1.- Trường hợp 1: a > d(b) cơng thức (I.3) ta có ak > [d(b)]k, theo quy tắc lấy độ phức tạp ta có nghiệm riêng O(ak) = O(nlogba) Như nghiệm riêng nghiệm T(n) O(nlogba) Trong trương hợp ta thấy thời gian thực phụ thuộc vào a, b mà không phụ thuộc vào hàm tiến triển d(n) Vì để cải tiến giải thuật ta cần giảm a tăng b 2.- Trường hợp 2: a < d(b) 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 O([d(b)]k) = O(nlogbd(b)) Trong trường hợp nghiệm riêng lớn nghiệm nên T(n) O(nlogbd(b)) Ðể cải tiến giải thuật cần giảm d(b) tăng b Trường hợp đặc biệt quan trọng d(n) = n Khi d(b) = b logbb = Vì nghiệm riêng O(n) T(n) O(n) 3.- Trường hợp 3: a = d(b) cơng thức (I.3) khơng xác đinh nên ta phải tính trực tiếp nghiệm riêng: a j k k-1 k Nghiệm riêng = [d(b)]k∑k-1 j = [ d(b) ] = a ∑j = = a k (do a = d(b)) Do n = bk nên k = logbn ak = nlogba Vậy nghiệm riêng nlogbalogbn nghiệm lớn gấp logbn lần nghiệm Do T(n) O(nlogbalogbn) Chú ý giải 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 qt hay khơng Nếu có phải xét xem hàm tiến triển có phải hàm nhân khơng Nếu có ta xác định a, d(b) dựa vào so sánh a d(b) mà vận dụng ba trường hợp nói Ví dụ 1-14: Giải phương trình đệ quy sau với T(1) = 1/- T(n) = 4T( n2 ) + n 2/- T(n) = 4T( n2 ) + n2 3/- T(n) = 4T( n2 ) + n3 Các phương trình cho có dạng phương trình tổng quát, hàm tiến triển d(n) hàm nhân a = 4, b = 9/13 Phân tích chương trình đệ quy Với phương trình thứ nhất, ta có d(n) = n => d(b) = b = < a, áp dụng trường hợp ta có T(n) = O(nlogba) = O(nlog4) = O(n2) Với phương trình thứ hai, d(n) = n2 => d(b) = b2 = = a, áp dụng trường hợp ta có T(n) = O(nlogbalogbn) = O(nlog4logn) = O(n2logn) Với phương trình thứ 3, ta có d(n) = n3 => d(b) = b3 = > a, áp dụng trường hợp 2, ta có T(n) = O(nlogbd(b)) = O(nlog8) = O(n3) 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 hàm nhân áp dụng công thức ứng với ba trường hợp nói mà phải tính trực tiếp nghiệm riêng, sau so sánh với nghiệm để lấy nghiệm lớn hai nghiệm làm nghiệm phương trình Ví dụ 1-15: Giải phương trình đệ quy sau : T(1) = T(n) = 2T() + nlogn Phương trình cho thuộc dạng phương trình tổng qt d(n) = nlogn khơng phải hàm nhân Ta có nghiệm = nlogba = nlog2 = n Do d(n) = nlogn hàm nhân nên ta phải tính nghiệm riêng cách xét trực tiếp j k-j k k(k + 1) k-1 j k-j k-j Nghiệm riêng = ∑k-1 = 2k∑k-1 = O(2kk2) j = a d(b ) = ∑j=0 2 log2 j = (k-j) = 2 Theo giả thiết phương trình tổng quát n = bk nên k = logbn, b = nên 2k = n k = logn, có nghiệm riêng O(nlog2n), nghiệm lớn nghiệm T(n) = O(nlog2n) TỔNG KẾT CHƯƠNG Trong chương này, cần phải nắm vững ý sau: 10/13 Phân tích chương trình đệ quy 1.- Sự phân tích, đánh giá giải thuật cần thiết để lựa chọn giải thuật tốt, để cải tiến giải thuật 2.- Sử dụng khái niệm độ phức tạp ký hiệu ô lớn để đánh giá giải thuật 3.- Đối với chương trình khơng gọi chương trình con, dùng quy tắc cộng, quy tắc nhân quy tắc chung để phân tích, tính độ phức tạp 4.- Đối với chương trình gọi chương trình con, tính độ phức tạp theo nguyên tắc “từ ra” 5.- Đối với chương trình đệ quy 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 phương trình đệ quy độ phức tạp giải thuật 6.- Khi giải phương trình đệ quy khơng thuộc dạng phương trình tổng qt sử dụng phương pháp truy hồi phương pháp đốn nghiệm 7.- Khi giải phương trình đệ quy thuộc dạng phương trình tổng quát, hàm tiến triển d(n) hàm nhân vận dụng cơng thức nghiệm môt ba trường hợp để xác định nghiệm, cịn d(n) khơng phải hàm nhân phải tính trực tiếp nghiệm riêng so sánh với nghiệm để chọn nghiệm BÀI TẬP CHƯƠNG Bài 1: Tính thời gian thực đoạn chương trình sau: a) Tính tổng số {1} Sum := 0; {2} for i:=1 to n begin {3} readln(x); {4} Sum := Sum + x; end; b) Tính tích hai ma trận vng cấp n C = A*B: {1} for i := to n {2} for j := to n begin 11/13 Phân tích chương trình đệ quy {3} c[i,j] := 0; {4} for k := to n {5} c[i,j] := c[i,j] + a[i,k] * b[k,j]; end; Bài 2: Giải phương trình đệ quy sau với T(1) = T(n) = 3T(n/2) + n T(n) = 3T(n/2) + n2 T(n) = 8T(n/2) + n3 Bài 3: Giải phương trình đệ quy sau với T(1) = T(n) = 4T(n/3) + n T(n) = 4T(n/3) + n2 T(n) = 9T(n/3) + n2 Bài 4: Giải phương trình đệ quy sau với T(1) = T(n) = T(n/2) + T(n) = 2T(n/2) + logn T(n) = 2T(n/2) + n T(n) = 2T(n/2) + n2 Bài 5: Giải phương trình đệ quy sau phương pháp đoán nghiệm: T(1) = T(n) = 2T(n-1) + với n > T(1) = T(n) = 2T(n-1) + n với n > Bài 6: Cho mảng n số nguyên thứ tự tăng Viết hàm tìm số nguyên mảng theo phương pháp tìm kiếm nhị phân, tìm thấy trả TRUE, ngược lại trả FALSE Sử dụng hai kĩ thuật đệ quy vòng lặp Với kĩ thuật viết hàm tìm tính thời gian thực hàm Bài 7: Tính thời gian thực giải thuật đệ quy giải toán Tháp Hà nội với n tầng? Bài 8: Xét cơng thức truy tốn để tính số tổ hợp chập k n sau: 12/13 Phân tích chương trình đệ quy Ckn= { nêu k=0 hoac k=n k Ck-1 n-1+Cn-1nêu 0

Ngày đăng: 30/04/2022, 03:29

HÌNH ẢNH LIÊN QUAN

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: - Phân tích các chương trình đệ quy
h ẳ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: (Trang 3)

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w