Độ phức tạp tính toán và tính hiệu quả của thuật toán (1)

13 746 1
Độ phức tạp tính toán và tính hiệu quả của thuật toán (1)

Đ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

Độ phức tạp tính toán tính hiệu thuật toán Độ phức tạp tính toán tính hiệu thuật toán Bởi: Đại Học Phương Đông Sự cần thiết phải phân tích thuật toán Trong giải toán có số giải thuật khác nhau, vấn đề cần phải đánh giá giải thuật để lựa chọn giải thuật tốt (nhất) Thông thường ta vào tiêu chuẩn sau: Giải thuật đắn Giải thuật đơn giản Giải thuật thực nhanh Với yêu cầu (1), để kiểm tra tính đắn giải thuật cài đặt giải thuật cho thực máy với số liệu mẫu lấy kết thu so sánh với kết biết Thực cách làm không chắn giải thuật với tất liệu thử lại sai với liệu Vả lại cách làm phát giải thuật sai chưa chứng minh Tính đắn giải thuật cần phải chứng minh toán học Tất nhiên điều không đơn giản không đề cập đến Khi viết chương trình để sử dụng vài lần y ê u cầu (2) quan trọng Chúng ta cần giải thuật dễ viết chương trình để nhanh chóng có kết quả, thời gian thực chương trình không đề cao dù chương trình sử dụng vài lần mà Tuy nhiên chương trình sử dụng nhiều lần thì yêu cầu tiết kiệm thời gian thực chương trình lại quan trọng đặc biệt chương trình mà 1/13 Độ phức tạp tính toán tính hiệu thuật toán thực cần liệu nhập lớn yêu cầu (3) xem xét cách kĩ Ta gọi hiệu thời gian thực giải thuật Thời gian thực chương trình Một phương pháp để xác định hiệu thời gian thực giải thuật lập trình đo lường thời gian thực hoạt động máy tính xác định tập hợp chọn lọc liệu vào Thời gian thực không phụ thuộc vào giải thuật mà phụ thuộc vào tập thị máy tính, chất lượng máy tính kĩ xảo người lập trình Sự thi hành điều chỉnh để thực tốt tập đặc biệt liệu vào chọn Ðể vượt qua trở ngại này, nhà khoa học máy tính chấp nhận tính phức tạp thời gian tiếp cận đo lường thực thi giải thuật Thuật ngữ tính hiệu đề cập đến đo lường đặc biệt phức tạp thời gian trường hợp xấu Thời gian thực chương trình Thời gian thực m ộ t chương t r ì n h hàm kích thước liệu vào, ký hiệu T(n) n kích thước (độ lớn) liệu vào Chương trình tính tổng n số có thời gian thực T(n) = cn c số Thời gian thực chương trình hàm không âm, tức T(n) ≥ với n ≥ Ðơn vị đo thời gian thực Ðơn vị T(n) đơn vị đo thời gian bình thường giờ, phút giây mà thường xác định số lệnh thực máy tính lý tưởng Khi ta nói thời gian thực chương trình T(n) = Cn có nghĩa chương trình cần Cn thị thực thi Thời gian thực trường hợp xấu Nói chung thời gian thực chương trình không phụ thuộc vào kích thước mà phụ thuộc vào tính chất liệu vào Nghĩa liệu vào có kích thước 2/13 Độ phức tạp tính toán tính hiệu thuật toán thời gian thực chương trình khác Chẳng hạn chương trình xếp dãy số nguyên tăng dần, ta cho vào dãy có thứ tự thời gian thực khác với ta cho vào dãy chưa có thứ tự, ta cho vào dãy có thứ tự tăng thời gian thực khác so với ta cho vào dãy có thứ tự giảm Vì thường ta coi T(n) thời gian thực chương trình trường hợp xấu liệu vào có kích thước n, tức là: T(n) thời gian lớn để thực chương trình liệu vào có kích thước n Tỷ suất tăng Ðộ phức tạp giải thuật Tỷ suất tăng Ta nói hàm không âm T(n) có tỷ suất tăng (growth rate) f(n) tồn số C N0 cho T(n) ≤ Cf(n) với n ≥ N0 Ta c h ứ ng minh đư ợ c “Cho m ộ t hàm không âm T(n) b ấ t kỳ, ta tìm đư ợ c t ỷ s u ất tăng f (n) c nó” Giả sử T(0) = 1, T(1) = tổng quát T(n) = (n+1)2 Ðặt N0 = C = với n ≥1 dễ dàng chứng minh T(n) = (n+1)2 ≤ 4n2 với n ≥ 1, tức tỷ suất tăng T(n) n2 Tỷ suất tăng hàm T(n) = 3n3 + 2n2 n3 Thực vậy, cho N0 = C = ta dễ dàng chứng minh với n ≥ 3n2 + 2n2 ≤ 5n3 Khái niệm độ phức tạp giải thuật Giả sử ta có hai giải thuật P1 P2 với thời gian thực tương ứng T1(n) = 100n2 (với tỷ suất tăng n2) T2(n) = 5n3 (với tỷ suất tăng n3) Giải thuật thực nhanh hơn? Câu trả lời phụ thuộc vào kích thước liệu vào Với n < 20 P2 nhanh P1 (T2 a[j] tốn O(1) thời gian, lệnh {3} tốn O(1) thời gian Vòng lặp {2} thực (n-i) lần, lần O(1) vòng lặp {2} tốn O((n-i).1) = O(ni).Vòng lặp {1} lặp có I chạy từ đến n-1nên thời gian thực vòng lặp {1} độ phức tạp giải thuật là: 5/13 Độ phức tạp tính toán tính hiệu thuật toán Chú ý: Trong trường hợp vòng lặp không xác định số lần lặp phải lấy số lần lặp trường hợp xấu Tìm kiếm Hàm tìm kiếm Search nhận vào mảng a có n số nguyên số nguyên x, hàm trả giá trị logic TRUE tồn phần tử a[i] = x, ngược lại hàm trả FALSE Giải thuật tìm kiếm so sánh x với phần tử mảng a, a[1], tồn a[i] = x dừng trả TRUE, ngược lại tất phần tử a khác X trả FALSE FUNCTION Search(a:ARRAY[1 n] OF Integer;x:Integer):Boolean; VAR i:Integer; Found:Boolean; BEGIN {1} i:=1; {2} Found:=FALSE; {3} WHILE(ia[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 Swap, để tính thời gian thực Bubble, trước hết ta cần tính thời gian thực Swap Dễ thấy thời gian thực Swap O(1) bao gồm lệnh gán Trong 7/13 Độ phức tạp tính toán tính hiệu thuật toán Bubble, lệnh {3} gọi Swap nên tốn O(1), lệnh {2} thực n-i lần, lần tốn O(1) nên tốn O(n-i) Lệnh {1} thực n-1 lần nên: Phân tích chương trình Ðệ quy Với chương trình có gọi chương trình đệ quy, ta áp dụng cách tính vừa trình bày mục 1.5.4 chương trình đệ quy gọi thân Có thể thấy hình ảnh chương trình đệ quy A sau: Với phương pháp tính độ phức tạp trình bày mục 1.5.4 thực Bởi theo phương pháp thì, để tính thời gian thực hiên chương trình A, ta phải tính thời gian thực chương trình A vòng luẩn quẩn kết thúc Với chương trình đệ quy, trước hết ta cần thành lập phương trình đệ quy, sau giải phương trình đệ quy, nghiệm phương trình đệ quy thời gian thực chương trình đệ quy 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 toá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ó Ðây phương trình đệ quy để tính thời gian thực chương trình đệ quy Giai_thua 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; END; 9/13 Độ phức tạp tính toán tính hiệu thuật toán 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 n/2 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 n/2 O(n) Gọi T(n) thời gian thực MergeSort danh sách n phần tử T(n/2) thời gian thực MergeSort danh sách n/2 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 MerSort hai lần cho L1 L2 với độ dài n/2 thời gian để gọi hai lần đệ quy 2T(n/2) Ngoài 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: 10/13 Độ phức tạp tính toán tính hiệu thuật toán Các hàm tiến triển khác Trong trường hợp hàm tiến triển 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ụ2-17:Giải phương trình đệ quy sau: T(1) = T(n) = 2T(n/2) + nlogn Phương trình cho thuộc dạng phương trình tổng quát d(n) = nlogn hàm nhân b Ta có nghiệm = nlog a = 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 Theo giả thiết phương trình tổng quát n = bk nên k = logbn, b=2 nên 2k=n k=logn, có nghiệm riêng O(nlog2n), nghiệm lớn nghiệm T(n) = O(nlog2n) Bài tập chương Tính thời gian thực đoạn chương trình sau: a) Tính tổng số {1} Sum := 0; 11/13 Độ phức tạp tính toán tính hiệu thuật toán {2} for i:=1 to n 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 := to n {2} for j := to n begin {3} c[i,j] := 0; {4} for k := to n {5} c[i,j] := c[i,j] + a[i,k] * b[k,j]; end; Dành cho độc giả Giải phương trình đệ quy sau với T(1) = a) T(n) = 3T(n/2) + n b) T(n) = 3T(n/2) + n2 c) T(n) = 8T(n/2) + n3 Dành cho độc giả Giải phương trình đệ quy sau với T(1) = a) T(n) = 4T(n/3) + n b) T(n) = 4T(n/3) + n2 c) T(n) = 9T(n/3) + n2 Dành cho độc giả Giải phương trình đệ quy sau với T(1) = a) T(n) = T(n/2) + b) T(n) = 2T(n/2) + logn c) T(n) = 2T(n/2) + n d) T(n) = 2T(n/2) + n2 12/13 Độ phức tạp tính toán tính hiệu thuật toán Dành cho độc giả Giải phương trình đệ quy sau phương pháp đoán nghiệm: a) T(1) = T(n) = 2T(n-1) + với n > b) T(1) = T(n) = 2T(n-1) + n với n > Dành cho độc giả 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ìmkiếmnhị 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 Dành cho độc giả 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? Dành cho độc giả Xét công thức truy toán để tính số tổ hợp chập k n sau: a) Viết hàm đệ quy để tính số tổ hợp chập k n b) Tính thời gian thực giải thuật nói Dành cho độc giả 13/13 [...]... 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 đó Dành cho độc giả 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 n tầng? Dành cho độc giả 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... 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 12/13 Độ phức tạp tính toán và tính hiệu quả của thuật toán Dành cho độc giả 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 Dành cho độc giả 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... là O(nlog2n), nghiệm này lớn hơn nghiệm thuần nhất do đó T(n) = O(nlog2n) Bài tập chương 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; 11/13 Độ phức tạp tính toán và tính hiệu quả của thuật toán {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.. .Độ phức tạp tính toán và tính hiệu quả của thuật toán 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ông thể á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ính trực tiếp nghiệm riêng, sau đó so sánh với nghiệm thuần nhất để lấy nghiệm lớn nhất trong hai nghiệm đó làm nghiệm của phương trình Vídụ2-17:Giải... c[i,j] + a[i,k] * b[k,j]; end; Dành cho độc giả Giải các phương trình đệ quy sau với T(1) = 1 và a) T(n) = 3T(n/2) + n b) T(n) = 3T(n/2) + n2 c) T(n) = 8T(n/2) + n3 Dành cho độc giả 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 Dành cho độc giả 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)... 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 b Ta có nghiệm thuần nhất = nlog a = 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ách xét trực tiếp Theo giả thiết trong phương trình tổng quát thì n = bk nên k = logbn, ở đây do b=2 nên 2k=n và k=logn, chúng ta... tầng? Dành cho độc giả 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 Dành cho độc giả 13/13 ... độ phức tạp hàm Search độ phức tạp lớn lệnh Dễ dàng thấy ba lệnh {1}, {2} {5} có độ phức tạp O(1) độ phức tạp hàm Search độ phức tạp lệnh {3} Lồng lệnh {3} lệnh {4} Lệnh {4} có độ phức tạp O(1)... lần, lần O(1) vòng lặp {2} tốn O((n-i).1) = O(ni).Vòng lặp {1} lặp có I chạy từ đến n-1nên thời gian thực vòng lặp {1} độ phức tạp giải thuật là: 5/13 Độ phức tạp tính toán tính hiệu thuật toán Chú... trình không phụ thuộc vào kích thước mà phụ thuộc vào tính chất liệu vào Nghĩa liệu vào có kích thước 2/13 Độ phức tạp tính toán tính hiệu thuật toán thời gian thực chương trình khác Chẳng hạn

Ngày đăng: 30/12/2015, 09:39

Từ khóa liên quan

Mục lục

  • Độ phức tạp tính toán và tính hiệu quả của thuật toán

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

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

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

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

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

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

      • Tỷ suất tăng

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

      • Cách tính Ðộ phức tạp

        • Qui tắc cộng

        • Qui tắc nhân

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

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

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

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

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

        • Bài tập chương

Tài liệu cùng người dùng

Tài liệu liên quan