[Giáo trình] Phân tích thiết kế thuật toán và đánh giá độ phức tạp của giải thuật - ĐH Sư phạm Hà Nội

96 2.8K 28
[Giáo trình] Phân tích thiết kế thuật toán và đánh giá độ phức tạp của giải thuật - ĐH Sư phạm Hà Nội

Đ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

Một thuật toán là một danh sách từng bước các chỉ dẫn để giải quyết cho một bài toán cụ thể.Ở góc độ lập trình, thuật toán còn được gọi là thuật giải hay giải thuật, là một danh sách các thao tác (câu lệnh) theo đó máy tính thực hiện để sau một số hữu hạn bước, từ input là dữ liệu vào của bài toán, sẽ thu được output là dữ liệu ra cần tìm của bài toán.

ĐẠI HỌC SƯ PHẠM HÀ NỘI NGUYỄN CHÍ TRUNG NGUYỄN THỊ THU THỦY PHÂN TÍCH THIẾT KẾ THUẬT TOÁN VÀ ĐÁNH GIÁ ĐỘ PHỨC TẠP GIẢI THUẬT HÀ NỘI 2010 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 2 MỤC LỤC TÀI LIỆU THAM KHẢO 4 Chương 1. CÁC KHÁI NIỆM CƠ BẢN 5 1. Thuật toán (giải thuật, thuật giải) 5 1.1. Định nghĩa 5 1.2. Các đặc trưng của thuật toán 5 2. Phân tích thuật toán 5 2.1. Tại sao phải phân tích thuật toán 10 2.2. Thời gian thực hiện thuật toán 11 2.3. Khái niệm độ ph1độ phức tạp thuật toán 15 3.1. Qui tắc hằng số 15 3.2. Qui tắc cộng 16 3.3. Qui tắc lấy max 16 3.4. Qui tắc nhân 17 3. Các kỹ thuật đánh giá độ phức tạp thuật toán 17 3.1. Câu lệnh đơn 17 3.2. Câu lệnh hợp thành 17 3.3. Câu lệnh lặp với số lần lặp biết trước for-do 18 3.4. Câu lệnh rẽ nhánh if 19 3.5. Câu lệnh lặp với số lần lặp chưa biết trước while, repeat 19 4. Một số ví dụ minh họa thiết kế thuật toán và đánh giá độ phức tạp 21 Bài toán 1.1. Tính giá trị gần đúng của exp(x) theo khai triển Taylor 21 Bài toán 1.2 Thuật toán tìm kiếm tuần tự 22 Bài toán 1.3 Thuật toán tìm kiếm nhị phân 22 Bài toán 1.4 Thuật toán sắp xếp chọn lựa 23 5. Phân tích chương trình (con) đệ qui 24 5.1. Khái niệm về đệ qui 24 5.2. Chương trình (con) đệ qui 25 5.3. Xây dựng phương trình (công thức) đệ qui 25 5.4. Giải phương trình đệ qui và Định lí Thợ 26 BÀI TẬP CHƯƠNG 1 30 Chương 2 CHIA ĐỂ TRỊ 33 1. Sơ đồ chung của thuật toán chia để trị 33 1.1. Thuật toán β 33 1.2. Thuật toán γ 34 1.3. Thuật toán γ tổng quát 35 2. Một số ví dụ minh họa Chia để trị 35 2.1. Thuật toán sắp xếp trộn (Merge Sort) 35 2.2. Thuật toán sắp xếp nhanh (QuickSort) 37 2.3. Nhân số nguyên lớn 39 2.4. Mảng con trọng số lớn nhất 40 BÀI TẬP CHƯƠNG 2 43 Chương 3. QUY HOẠCH ĐỘNG 45 1. Giới thiệu phương pháp qui hoạch động 45 2. Phương pháp chung của qui hoạch động 45 3. Một số ví dụ minh họa 46 3.1. Dãy con tăng dần dài nhất 46 Nguyễn Chí Trung – Nguyễn Thị Thu Thủy 3 3.2. Trở lại bài toán mảng con trọng số lớn nhất 51 3.3. Xâu con chung dài nhất 52 3.4. Bài toán cái túi 55 3.5. Nhân ma trận 57 BÀI TẬP CHƯƠNG 3 62 Chương 4. THUẬT TOÁN THAM LAM 64 1. Giới thiệu thuật toán tham lam 64 1.1. Đặc điểm của thuật toán tham lam 64 1.2. Sơ đồ chung của thuật toán tham lam 65 1.3. Chứng minh thuật toán đúng 65 2. Một số ví dụ minh họa 66 2.1. Bài toán tập các đoạn thẳng không giao nhau 66 2.2. Tìm hiểu các thuật toán tham lam đối với bài toán cái túi 69 2.3. Bài toán người du lịch (TSP - Travelling Salesman Problem) 70 2.4. Bài toán mã hóa Huffman 71 BÀI TẬP CHƯƠNG 4 75 Chương 5. CÁC THUẬT TOÁN ĐỒ THỊ CƠ BẢN 77 1. Các khái niệm cơ bản 77 1.1. Đồ thị 77 1.2. Các khái niệm 77 2. Các phương pháp biểu diễn đồ thị 78 1.1. Biểu diễn đồ thị bằng ma trận kề 78 1.2. Biểu diễn đồ thị bằng danh sách cạnh 78 1.3. Biểu diễn đồ thị bằng danh sách kề 79 1.4. Biểu diễn đồ thị bằng danh sách liên thuộc 81 3. Thuật toán tìm kiếm theo chiều rộng 81 3.1. Nguyên tắc tô màu 81 2.2. Breadth – First Tree 81 3.3. Mô tả thuật toán 82 4. Thuật toán tìm kiếm theo chiều sâu 84 4.1. Giới thiệu thuật toán 84 4.2. Thủ tục tìm kiếm theo chiều sâu 85 4.3. Đánh giá độ phức tạp thuật toán DFS và DFS-Visit 86 5. Bài toán tìm đường đi ngắn nhất 87 5.1. Một số khái niệm cơ bản 87 5.2. Thuật toán Dijkstra 88 6. Bài toán về cây khung nhỏ nhất 90 6.1. Các khái niệm cơ bản 90 6.2. Thuật toán Kruskal 91 6.3. Thuật toán Prim 92 BÀI TẬP CHƯƠNG 5 94 CÁC CHUYÊN ĐỀ MÔN HỌC 96 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 4 TÀI LIỆU THAM KHẢO 1. Vũ Đình Hòa, “Giải thuật và đánh giá độ phức tạp giải thuật”, Gói giáo trình môn học theo chuẩn SCORM, Trường ĐHSP HN. 2. Hồ Sỹ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng, “Tài liệu giáo khoa Chuyên Tin” Quyển 1 và 2, Nhà xuất bản giáo dục, 2009. 3. Nguyễn Đức Nghĩa, Nguyễn Tô Thành, “Toán rời rạc”, Nhà xuất bản giáo dục, tài bản 2005. 4. Larry Nyhoff, “Lập trình nâng cao bằng Pascal với các c ấu trúc dữ liệu”, Dịch giả Lê Minh Trung, Công ty liên doanh tư vấn và dịch vụ khoa học kỹ thuật SCITEC, 1991. 5. Nguyễn Chí Trung, “Giáo trình Thuật toán và kĩ thuật lập trình Pascal”, Nhà xuất bản Hà Nội, 2005. Nguyễn Chí Trung – Nguyễn Thị Thu Thủy 5 Chương 1. CÁC KHÁI NIỆM CƠ BẢN 1. Thuật toán (giải thuật, thuật giải) 1.1. Định nghĩa Một thuật toán là một danh sách từng bước các chỉ dẫn để giải quyết cho một bài toán cụ thể. 1 Ở góc độ lập trình, thuật toán còn được gọi là thuật giải hay giải thuật, là một danh sách các thao tác (câu lệnh) theo đó máy tính thực hiện để sau một số hữu hạn bước, từ input là dữ liệu vào của bài toán, sẽ thu được output là dữ liệu ra cần tìm của bài toán. 1.2. Các tính chất cơ bản của thuật toán 1.2.1. Tính dừng Thuật toán phải kết thúc sau một số hữu hạn lần thực hiện các thao tác. Ví dụ: thuật toán sau đây vi phạm tính dừng Bước 1: S Å 0; i Å 0; Bước 2: i Å i + 1; Bước 3: S Å S + i*i; Bước 4: Quay về bước 2; Bước 5: Đưa ra S và kết thúc thuật toán Thuật toán được sửa lại để nó có tính dừng (trở thành thuật toán tính tổng các bình phương của n số tự nhiên đầu tiên) như sau: Bước 1: Nhập N; Bước 2: S Å 0; i Å 0; Bước 3: Nếu i ≥ N thì chuyển đến Bước 7; Bước 4: i Å i + 1; Bước 5: S Å S + i*i; Bước 6: Quay về bước 3; Bước 7 : Đưa ra S và kết thúc thuật toán 1 Từ “thuật toán” (algorithm) xuất phát từ tên của quốc gia châu Á trung tâm cổ xưa là Khorezm, về sau là các nước cộng hòa xã hội chủ nghĩa Kazakh, Turkmen, and Uzbek. Vào khoảng năm 825 sau công nguyên, nghiên cứu chính về đại số và hệ thống khái niệm số học Ấn Độ được viết bởi Mohammed, là con trai của Musa (Khorez); tiếng Lattinh nghĩa là bởi “Mohamed ibn Musa al-Khowarizmi.” Vào năm 857, đoạn văn bản tiếng này được dịch sang tiếng Anh là "Algoritmi”. Từ đây, xuất phát từ cụm từ al-Khowarizmi, Hisab al-jabrw'sal-muqabalah (Mathematics-al-jabrw'sal muqabalah) mà chúng ta có tù algebra (đại số) Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 6 1.2.2. Tính xác định Thuật toán phải đảm bảo sau khi thực hiện một thao tác thì hoặc thuật toán kết thúc hoặc có đúng một thao tác hoàn toàn xác định để thực hiện tiếp theo. Ví dụ: thuật toán sau đây vi phạm tính xác định: Bước 1: Nhập a, b; Bước 2: Tính diện tích hình chữ nhật kích thước a, b hoặc tính thể tính hình nón đường cao a và bán kính hình tròn đáy là b. Tức là: S Å a * b hoặc S Å (1/3)π.a.b 2 Bước 3: Đưa ra S và kết thúc thuật toán Sửa lại Bước 1: Nhập a, b, nhập chọn lựa choice; //Qui ước choice = 1 là tính diện tích hình chữ nhật, ngược lại, tính thể tích hình nón Bước 2: Nếu choice = 1 thì S Å a * b và thực hiện bước 4; Bước 3: S Å (1/3)π.a.b 2 Bước 4: Đưa ra S và kết thúc thuật toán; Ví dụ khác: thuật toán ”Tìm số hạng Fibonacci thứ N” dưới đây vi phạm tính xác định Bước 1: Nhập số dương N Bước 2: Nếu N ≤ 2 thì c Å 1, kết thúc thuật toán Bước 3: a Å 1; b Å 1; k Å 2; Bước 4: Nếu k = N thì đưa ra c và kết thúc thuật toán, Bước 5: k Å k + 1; Thực hiện bước 6 hoặc bước 7 sau đây: Bước 6: c Å a + b; a Å b; b Å c; Quay về bước 4; Bước 7: c Å a + b; Bước 8: a Å b; b Å c; Quay về bước 4; Sửa lại: Bước 1: Nhập số dương N Bước 2: Nếu N ≤ 2 thì c Å 1, đưa ra c và kết thúc thuật toán Bước 3: a Å 1; b Å 1; k Å 2; Bước 4: Nếu k = N thì đưa ra c và kết thúc thuật toán, Bước 5: k Å k + 1; Bước 6: c Å a + b; a Å b; b Å c; Quay về bướ c 4; 1.2.3. Tính đúng đắn Một thuật toán phải đảm bảo cho ra Output luôn đúng đối với mọi dữ liệu vào của Input. Nguyễn Chí Trung – Nguyễn Thị Thu Thủy 7 Ta định nghĩa một bộ dữ liệu vào đầy đủ là nó bao phủ hết (cover all the cases) tất cả các trường hợp cần xem xét. Ví dụ, để giải phương trình bậc 2: ax 2 + bx + c = 0 (với a ≠0). Bộ Input đầy đủ là các giá trị tùy ý của a, b, c nhưng phải đủ trường hợp sau (với d = b 2 - 4ac) d = 0, ví dụ (a, b, c) = (1, -2, 1) d > 0, ví dụ (a, b, c) = (1, 5, 4) d < 0, ví dụ (a, b, c) = (9, 2, 5) Như vậy, thuật toán đảm bảo tính đúng đắn nếu nó luôn cho kết quả (output) đúng đắn đối với một bộ dữ liệu vào đầy đủ. Ví dụ: Xét tính đúng đắn của thuật toán tính m = max (a, b,c) dưới đây: Bước 1: Nhập a, b, c; Bước 2: Nếu a < b thì m Å b Không thì Nếu a < c thì m Å c; Bước 3: Đưa ra m và kết thúc thuật toán; Rõ ràng thuật toán trên sai t ại một số bộ dữ liệu, ví dụ nếu bộ dữ liệu vào là (a, b, c) = (1, 2, 3) thì thuật toán cho kết quả m = 2, không đúng yêu cầu của đề bài; nếu bộ dữ liệu vào là (a, b, c) = (2, 1, 3) thì không có chỉ thị nào trong thuật toán tác động vào m, do đó m không xác định và không tính được m như yêu cầu đề bài. Có thể sửa lại thuật toán như sau: Bước 1: Nhập a, b, c; Bước 2: m Å a; Bước 3: Nếu m < b thì m Å b; Bước 4 : Nếu m < c thi m Å c; Bước 5: Đưa ra m và kết thúc thuật toán; 1.2.4. Tính phổ dụng Thuật toán phải đảm bảo giải được một lớp bài toán. Ví dụ thay vì xây dựng thuật toán và viết chương trình giải các phương trình: 1) 5x 2 + 12x - 1 = 0 2) 2x 2 -6x +2 = 0 3) 7x + 100 = 0 4) -50x 2 +112x - 11 = 0 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 8 Người ta tiến hành xây dựng thuật toán và viết chương trình giải phương trình: ax 2 + bx + c = 0 với mọi số thực a, b, c cho trước. 1.3. Các tính quan trọng của thuật toán Các tính chất này liên quan đến việc nhấn mạnh ưu điểm của "thuật toán tin học" là có thể giao cho máy tính thực hiện. Một "thuật toán toán học" thuần túy có thể “rất đẹp” nhưng chưa chắc đã cài đặt dễ dàng trên máy tính, và nếu cài đặt được thì thuật toán đó chưa chắc ổn định và khả thi. Nói ở góc độ tương tự, hai tính chất sau đây thể hiện sự khác biệt giữa toán lí thuyết và toán tính. - Toán lí thuyết quan tâm đến các vấn đề định tính của bài toán: tồn tại, duy nhất, tính chất nghiệm của các bài toán. - Toán tính quan tâm đến xây dựng phương pháp, thuật toán để để tìm nghiệm bài toán trên máy tính. Thuật toán được xây dựng phải thỏa mãn yêu cầu về tính khả thi và tính ổn định. 1.3.1. Tính khả thi Một thuật toán là khả thi nế u nó thực hiện được trên máy tính trong một thời gian chấp nhận được. Thòi gian ở đây không tính đến kiểu CPU và chưa tính đến dung lượng bộ nhớ cần cấp phát. Ví dụ (tính khả thi). Cho hệ phương trình đại số tuyến tính bAx = , (1) trong đó A là ma trận vuông cấp n với định thức khác 0. Về lý thuyết, có thể giải hệ trên bằng thuật toán mà ý tưởng của nó dựa vào công thức Cramer: ∆ ∆ = i i x , (i =1, , n), (2) trong đó , còn là định thức của ma trận A sau khi thay cột i bởi cột tự do b. Nhưng việc tính toán ra nghiệm bằng số cụ thể lại là một việc không đơn giản. Theo công thức (2) cần phải tính n +1 định thức cấp n. Mỗi định thức là tổng của n! số hạng, mỗi số hạng là tích của n thừa số. Do vậy, để tính mỗi số hạng cần thực hiện n – 1 phép nhân. Như vậ y, tất cả số phép tính nhân cần thực hiện trong (2) là Q = n!(n+1)(n-1). Adet=∆ i ∆ Giả sử n = 20. Khi đó . Nếu tốc độ của máy tính là 100 triệu phép tính/giây thì thời gian để thực hiện khối lượng tính toán trên là giờ = năm. Một thời gian lớn vô cùng! Và như vậy, thuật toán dựa vào công thức Cramer là hoàn toàn không khả thi cho dù máy tính có tăng tốc độ lên gấp hàng nghìn, hàng vạn lần. 20 10*7073.9≈Q 9 10*2.6965 5 10*0782.3 Ở trên ta mới chỉ xét việc giải một hệ cỡ 20, mà thực tế khoa học và công nghệ đòi hỏi phải giải các hệ phương trình đại số tuyến tính cỡ hàng vạn, hàng triệu hoặc hơn thế nữa. Vì thế, cần phải Nguyễn Chí Trung – Nguyễn Thị Thu Thủy 9 nghiên cứu đề xuất các phương pháp hiệu quả để có thể giải được các hệ thống phương trình cỡ lớn. 1.3.2. Tính ổn định Một thuật toán gọi là ổn định nếu sai số tính toán (do máy tính làm tròn số) không bị khuếch đại trong quá trình tính. Ví dụ (tính ổn định). Giả sử cần tính tích phân )1( 1 1 0 ≥= − ∫ ndxexI xn n . Tích phân từng phần: đặt u = x n thì du = nx n-1 dx; đặt dv = e x-1 dx thì v = e x-1 ta được .1 1 1 1 0 11 0 1 − −−− −=−= ∫ n xnxn n nIdxexnexI Ngoài ra ta có .3679.0 1 )1( 1 0 11 1 0 1 ≈=−== −− ∫ e xedxexI xx Như vậy, để tính ta thu được công thức truy hồi tính được In về mặt lý thuyết: n I .3679.0 ,2,1 1 1 = ≥−= − I nnII nn Về mặt thực tế tính trên máy tính không cho kết quả mong muốn khi n lớn. Cụ thể là tính trên máy tính với n = 25 ta được bảng kết quả sau (liệt kê theo từng hàng) 0.3679 0.2642 0.2073 0.1709 0.1455 0.1268 0.1124 0.1009 0.0916 0.0839 0.0774 0.0718 0.0669 0.0627 0.0590 0.0555 0.0572 -0.0295 1.5596 -30.1924 635.0403 -13969.8864 321308.3881 -7711400.3133 192785008.8325 Kết quả giảm dần từ 0.3679 (khi n = 1) đến 0.0555 (khi n=16). Kết quả sau đó kết quả thay đổi thất thường và giá trị tuyệt đối tăng rất nhanh. Điều này hoàn toàn không phù hợp với lý thuyết vì theo lý thuyết thì khi 0→ n I ∞ →n do đó . 1 1 0 1 0 + =≤≤ ∫ n dxxI n n Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 10 Hiện tượng kết quả tính toán nêu trên là sự không ổn định của thuật toán: sai số ban đầu khi tính n I 3679.0 1 1 ≈= e I đã bị khuyếch đại trong quá trình tính. Cụ thể như sau: Thay vì tính chính xác e I 1 1 = ta tính xấp xỉ của nó là δ += 11 ~ II , trong đó δ là sai số. Giả sử các tính toán tiếp theo không mắc phải sai số. Với n = 2 ta được .22)21()(21 ~ 21 ~ 21112 δδδ −=−−=+−=−= IIIII Thu được 2 ~ I với sai số δ 2| ~ | 22 =− II . Tương tự, ở bước thứ n thay cho giá trị đúng ta thu được giá trị gần đúng với sai số . Do đó, dù n I n I ~ δ !| ~ | nII nn =− δ có bé thì khi n đủ lớn, sai số vẫn đủ lớn và ta không thể nhận được giá trị chấp nhận được là gần đúng cho . n I 2. Phân tích thuật toán 2.1. Tại sao phải phân tích thuật toán Xét một thuật toán nhân 2 số phức z 1 = a + bi; z 2 = c + di z = z 1 * z 2 = (ac – bd) + (ad + bc)i Khi tiến hành thuật toán: máy tính thực hiện 4 phép nhân và 3 phép cộng (ở đây là phép cộng đại số, nghĩa là phép trừ được xem là cộng với số âm). Giả sử phép nhân thực hiện mất 1 giây, phép cộng thực hiện mất 0.01 giây, phép gán thực hiện mất 0.005 giây. Khi đó phép nhân hai số phức trên thực hiện mất 4*1 + 3*0.01 + 0.005 = 4.035 giây. Để giảm thời gian tính toán, ta có thể giảm phép nhân nhờ các tính toán sau đây: ac - bd và ad + bc = (a + b)*(c + d) - ac - bd Do đó nếu đặt p := ac; q := bd; Thì z := (p - q) + ((a +b)*(c+d) - p - q)i Khi đó việc tính z g ồm 3 phép nhân, 6 phép cộng và 3 phép gán; mất khoảng thời gian là 3*1 + 6*0.01 + 3*0.005 = 3.075 giây, giảm được 4.04 - 3.09 = 0.96 giây. Ví dụ trên cho thấy một bài toán có thể tồn tại nhiều thuật toán để giải, do đó cần lựa chọn thuật toán tốt nhất. Điều này cũng dẫn đến việc phân tích thuật toán. Ngoài ra, một bài toán được cài đặt bằng một thuật toán đúng, nhưng chưa chắc cho kết quả mong muốn. Vì các lí do sau: • Thời gian thực hiện quá lâu • Tốn nhiều bộ nhớ Điều này cũng dẫn đến cần phân tích thuật toán. Khi phân tích thuật toán, ta thường xem xét về thời gian và bộ nhớ chi phí cho thuật toán, trong đó chủ yếu phân tích về mặt thời gian. [...]... họa thiết kế thuật toán và đánh giá độ phức tạp Bài toán 1.1 Tính giá trị gần đúng của exp(x) theo khai triển Taylor x x2 xn e = 1 + + + + 1! 2! n! x a) Thiết kế giải thuật b) Đánh giá độ phức tạp Giải 21 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật a) 1, 2 s := 1; p := 1; for i :=1 to n do begin 3 p := p * x/i; 4 s := s + p; ⎫ ⎬ P(i) ⎭ end; b) T(n) = 2 + 2*n T(n) = O(n) Bài toán. .. j phụ thuộc vào i 23 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật - i = 1: hai câu lệnh 3 và 4 thực hiện n - 1 lần - i = 2: hai câu lệnh 3 và 4 thực hiện n - 2 lần - … - i = n-1: hai câu lệnh 3 và 4 thực hiện n- (n-1) = 1 lần Vậy T(P(i)) = 1 + 2 + … + (n-2) + (n-1) = n(n-1)/2 (ta đặt bằng p) Do đó T(n) = 4(n-1) + n(n-1)/2 = (1/2)n2 + (7/2)n - 4 Vậy T(n) = O(n2) Thuật toán sắp xếp... hiệu O đọc là kí hiệu big-O Ở dưới đây ta có cách gọi khác, đó là T(n) có bậc không quá n2 Vậy trong quá trình phân tích thuật toán, ta cần tính T(n) theo kí hiệu Big-O 13 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 2.3 Khái niệm độ phức tạp của thuật toán, kí hiệu big-O Định nghĩa 1.4 Cho f và g là hai hàm đối số nguyên dương • Ta viết f(n) = O(g(n)) và nói f(n) có bậc không quá... là giải quyết bài toán thành 3 bước - Chia: Chia bài toán thành các bài toán con có kích thước nhỏ hơn - Trị: Giải các bài toán con một cách độc lập - Tổng hợp: Tổng hợp các kết quả của các bài toán con để thu được lời giải của bài toán ban đầu 1 Sơ đồ chung của thuật toán chia để trị 1.1 Thuật toán β Ta xét bài toán tổng quát P với kích thước dữ liệu vào là n Giả sử có thuật toán α để giải bài toán. .. dưới đây thể hiện thuật toán β procedure Beta(n) (* n là kích thước bài toán *) begin i Chia bài toán thành ba bài toán con kích thước n/2; ii Giải mỗi bài toán con bằng thuật toán α; iii Tổng hợp lời giải của các bài toán con; 33 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật end; Việc chia để trị rõ ràng có xu hướng làm giảm thời gian tính toán Vì thế các bài toán con nên tiếp tục... bằng thuật toán α else begin i Chia bài toán thành ba bài toán con kích thước n/2; ii Giải mỗi bài toán con bằng thuật toán γ; iii Tổng hợp lời giải của các bài toán con; end; end; Nhận xét: - Nếu bài toán P giải bởi thuật toán α thì không có chia để trị - Nếu bài toán P giải bằng thuật toán β thì được việc chia để trị được thực hiện một lần, trong đó có 3 bài toán con được chia, và được giải bằng thuật. .. quan hệ giữa T(n) và T(k) Trong đó T(n) là thời gian thực hiện thuật toán với dữ liệu vào kích thước là n, T(k) là thời gian thực hiện chính thuật toán đó nhưng với dữ liệu kích thước là k Ví dụ 1.17 Xây dựng phương trình đệ qui tính hàm giaithua(n) 25 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật Gọi T(n) là thời gian thực hiện thuật toán tính hàm giaithua(n) Ta có - n = 0: T(n) =... hiện phép cộng và phép gán 6.4 Giải phương trình đệ qui và Định lí Thợ Giải phương trình đệ qui thực chất là tiến hành đánh giá độ phức tạp của thuật toán đệ qui a) Phương pháp thế Ý tưởng của phương pháp thể là thay dần các công thức đệ qui của hàm thời gian ở vế phải cho đến khi thu được các hàm thời gian mà chúng nhận được các giá trị cụ thể Ví dụ 1.19 Tính độ phức tạp của thuật toán đệ qui tính... đánh giá thời gian thực hiện câu lệnh lặp này ta dựa vào kinh nghiệm: Ví dụ 1.12 Thời gian tính đối với vòng lặp while đơn giản 1 i := n; 1 lần 19 Phân tích thiết kế thuật toán và đánh giá độ phức tạp giải thuật 2 S := 0; 1 lần while i > 0 do begin 3 write(‘x = ‘); 4 readln(x); 5 S := S + x; 6 i : = i - 1; end; T((P(i)) = 4 T(n) = 2 + 4.T(P(i)) = 2 + 4n P(i) lần T(n) = O(n) Ví dụ 1.13 Độ phức tạp của. .. + Và vì 2 ≤ n ∀n ≥ 1 , đó đặt C1=1; N1=1 thì f(n) = O(n) n +1 1 2 n ≤ n −1+ ∀n ≥ 1 nên đặt C2 = 1/2; N2=2 thì f(n) = Ω(n) 2 n +1 Suy ra f(n) = θ(n) 3 Các qui tắc xác định độ phức tạp thuật toán 3.1 Qui tắc hằng số Nếu một thuật toán T có thời gian thực hiện T(n) = O(C.f(n)) với C là hằng số dương thì có thể coi thuật toán T có độ phức tạp tính toán là O(f(n)) 15 Phân tích thiết kế thuật toán và đánh

Ngày đăng: 24/12/2014, 06:19

Từ khóa liên quan

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

Tài liệu liên quan