1. Trang chủ
  2. » Công Nghệ Thông Tin

Thuật toán nâng cao

120 317 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

Mục ñích Các khái niệm liên quan ñến toán giải toán Phân tích ñánh giá thuật toán Các kỹ thuật thiết kế thuật toán Vận dụng giải toán cụ thể Thuật toán nâng cao Nguyễn Thanh Bình Khoa Công nghệ Thông tin Trường ñại học Bách khoa ðại học ðà Nẵng Nội dung Giới thiệu Chứng minh ñúng ñắn ðộ phức tạp (complexity) ðệ quy (recursion) Chia ñể trị (divide and conquer) Quy hoạch ñộng (dynamic programming) Thuật toán tham lam (greedy algorithms) Quay lui (backtracking) Thuật toán xác xuất (probabiliste algorithms) Lớp toán NP ñầy ñủ (NP-complete) Thuật toán xấp xĩ (approximation algorithms) ðánh giá 41 70 122 152 191 290 355 399 442 461 Bài tập lớn Tóm tắt báo khoa học Bài tập lớn Tìm hiểu trình bày chủ ñề thuật toán Thi kết thúc môn học Tài liệu tham khảo Bài tập lớn Introduction to algorithms, T.H Cormen, C.E Leiserson, R.R Rivest, Mit Press 1990 Type de Données et Algorithmes, M-C Gaudel, M Soria, C Froidevaux, Ediscienne international, 1993 Cours Complexité, M Daniel, ESIL, 2006 Data structures and algorithms, Alfred V Aho, John E Hopcroft, Addison-Wesley, 1983 Algorithm Analysis and Computational Comlexity, Ian Parberry, Lecture Notes, University of North Texas, 2001 The Art of Computer Programming, Volume 2, D Knuth, Addison-Wesley, 1981 Các tài liệu khác Internet Mỗi học viên chọn trình bày chủ ñề sau Kỹ thuật nhánh cận (branch and bound) Kỹ thuật biến ñổi Fourier (Fourier transform) Thuật toán di truyền (genetic algorithm) Yêu cầu Tìm hiểu trình bày chủ ñề Minh hoạ giải thích phương pháp ví dụ cụ thể ðánh giá phân tích giải pháp ví dụ Học viên tự tìm kiếm tài liệu liên quan ñến chủ ñề Kết Báo cáo từ 10 ñến 20 trang Báo cáo phải trích dẫn rỏ ràng tài liệu tham khảo Giới thiệu Khái niệm giải thuật/thuật toán (algorithm) Giới thiệu (1) Thuật toán dãy xác ñịnh thao tác áp dụng liệu vào nhằm ñạt ñược giải pháp cho vấn ñề Hai vấn ñề Tìm phương pháp giải vấn ñề Nguyễn Thanh Bình Khoa Công nghệ Thông tin Trường ñại học Bách khoa ðại học ðà Nẵng Giải pháp cho ax2 + bx + c = : rỏ ràng xác ñịnh Giải pháp cho ax5 + bx4 + cx3 + dx2 + ex + f = : giải pháp tổng quát Tìm giải pháp hiệu Phân biệt giải thuật chương trình Chương trình cài ñặt thuật toán ngôn ngữ lập trình Giới thiệu Giới thiệu Thuật toán Thuật toán ngày sống Nấu cơm … Thủ tục tính toán nhận tập liệu vào (input) tạo liệu (output) Gọi ñiện thoại Thuật toán ñược gọi ñúng ñắn (correct), thuật toán dừng cho kết ñúng với liệu vào Thuật toán toán học/tin học Nhân hai ma trận Tính tích phân Giải hệ phương trình bậc … Giới thiệu 10 Giới thiệu Các tính chất thuật toán Tính tổng quát (1) Thuật toán phải áp dụng cho tất mẫu liệu vào không mẫu liệu vào cụ thể Tính tổng quát Tính hữu hạn Ví dụ Sắp xếp tăng dần dãy giá trị Tính không nhập nhằng Dữ liệu vào : Kết : Tính hiệu 11 1 3 5 12 Giới thiệu Giới thiệu Tính tổng quát (2) Tính hữu hạn Phương pháp Thuật toán phải dừng sau số bước xác ñịnh So sánh hai phần tử liên tiếp từ trái qua phải, không ñúng thứ tự hoán ñổi vị trí chúng Bước Bước Bước Bước 1: 2: 3: 4: 2↔1 1 2 4 ↔3 5 5 Ví dụ nhập n while (n ≠ 0) n=n–2 endwhile Dãy ñã ñược xếp Thuật toán có tổng quát không ? Không Thuật toán có dừng không ? Ví dụ liệu vào: 13 Giới thiệu 14 Giới thiệu Tính hiệu Tính không nhập nhằng Các thao tác thuật toán phải ñược ñặc tả chặt chẽ Ở bước thực thi, bước ñược thực thi phải ñược xác ñịnh rõ ràng Thuật toán phải sử dụng hiệu nguồn tài nguyên máy tính Thời gian Bộ nhớ Ví dụ gt1 (n) begin p=1 for i from to n p = p * i; endfor end Ví dụ Bước 1: x = Bước 2: tăng x lên giảm x xuống Bước 3: if (x ∈[-2,2]) then goto Bước Thuật toán có nhập nhằng ? gt2 (n) begin if (n = 0) return (1) else return (n*gt(n-1)) endif end Thuật toán hiệu ? 15 16 Giới thiệu Giới thiệu ðặc tả thuật toán (1) ðặc tả thuật toán (2) Có nhiều cách ñặc tả thuật toán Chọn phương pháp ñặc tả hình thức Không hình thức Ngôn ngữ giả tựa C/Pascal kết hợp ngôn ngữ tự nhiên Ngôn ngữ tự nhiên if (ñiều kiện) then … else … endif Nữa hình thức Kêt hợp ngôn ngữ tự nhiên kí hiệu toán học Sơ ñồ khối, ngôn ngữ giả, … Hình thức Các kí hiệu toán học Ngôn ngữ Z, ngôn ngữ B, … while () … endwhile for … from … to … … endfor 17 Giới thiệu 18 Giới thiệu Ví dụ Ví dụ Giải pháp thô Có 15 hộp ñinh có chiều dài khác Cần ñặt chúng vào 15 ngăn kéo Chúng ta cần phải thực ñể lấy ñược loại ñinh cần cách nhanh nhất? Chúng ta xếp hộp ñinh vào ngăn kéo theo thứ tự Sau ñó, cần lấy ñinh mở ngăn kéo theo thứ tự từ trái qua phải Trường hợp xấu nhất: phải mở 15 ngăn kéo Trường hợp trung bình: giả sử xác xuất lấy loại ñinh ngang nhau, phải mở ngăn kéo 15 15 *16 ∑ i = 15 * = 15 Nếu loại ñinh ngăn kéo cuối ñược sử dụng, cần nhiều lần mở ngăn kéo 19 20 Giới thiệu Giới thiệu Ví dụ Ví dụ Giải pháp tiền xử lý Giải pháp Las Vegas Chúng ta xếp hộp ñinh theo thứ tự chiều dài chúng Xếp vào ngăn kéo theo thứ tự Nếu lại mở ngăn kéo từ trái sang phải không thu ñược lợi ích Mở ngăn kéo theo phương pháp tìm kiếm nhị phân Trường hợp xấu nhất: lần mở ngăn kéo Trường hợp trung bình: 3.26 Chúng ta chọn ngăn kéo ñể mở cách ngẫu nhiên Nếu may mắn, có loại ñinh cần lấy Nếu không, loại bỏ ngăn kéo vừa mở, thực mở ngăn kéo khác cách ngẫu nhiên 14 14 13 1 15 *1 + * * + * * * + = ∑1 i = 15 15 14 15 14 13 15 *1 + * + * + * = 3.26 15 15 15 15 Giải pháp có ý nghĩa thường xuyên mở ngăn kéo lấy ñinh 21 Giới thiệu 22 Giới thiệu Ví dụ Ví dụ Thuật toán nhân hai số nguyên Thuật toán nhân Anh 567 1234 567 1134 1701 2268 699678 Thuật toán nhân Bắc Mỹ 567 1234 2268 1701 1134 567 699678 23 24 Giới thiệu Giới thiệu Ví dụ Ví dụ Thuật toán nhân Ả-rập ðếm số phép toán nhân cộng ñược thực 9 0 1 1 7 Thuật toán nhân Bắc Mỹ thuận toán nhân Anh ñều sử dụng 12 phép nhân 15 phép cộng Thuật toán Ả-rập sử dụng 12 phép nhân 20 phép cộng Số phép toán phụ thuộc vào số chữ số số nguyên Số phép nhân m*n với m n số chữ số số nguyên So sánh ñộ hiệu thuật toán ? 25 Giới thiệu 26 Giới thiệu Ví dụ Ví dụ Thuật toán nhân Nga 567 1234 283 2468 141 4936 70 9872 35 19744 17 39488 78976 157952 315904 631808 699678 Thuật toán nhân « chia ñể trị » Số chữ số hai số nguyên phải phải luỹ thừa Nếu số chữ số hai số nguyên khác thêm vào số bên trái Ưu ñiểm: không cần ghi nhớ kết nhân trung gian, cần thực phép cộng chia cho Ý tưởng: thay phép nhân hai số nguyên có n chữ số phép nhân hai số nguyên có n/2 chữ số Tiếp tục, thay phép nhân hai số nguyên có n/2 chữ số phép nhân hai số nguyên có n/4 chữ số, … Cần nhân hai số nguyên: a b Gọi aL aR hai trái phải số a, tương tự bL bR hai trái phải b 27 28 Giới thiệu Giới thiệu Ví dụ Ví dụ Thuật toán nhân « chia ñể trị » Thuật toán nhân « chia ñể trị » a*b Giảm số phép nhân a b a b từ xuống = (aL*10n/2+ aR)*(bL*10n/2+ bR) = aL*bL*10n + aL*bR*10n/2 + aR*bL*10n/2 + aR*bR = aL*bL*10n + (aL*bR + aR*bL)10n/2 + aR*bR * + aLbL aL bL aR bR aLbR aRbL aRbR ðặt: p = aL*bL q = aR*bR r = (aL + aR)*(bL + bR) Khi ñó: a*b = aL*bL*10n + (aL*bR + aR*bL)*10n/2 + aR*bR = p*10n + (r – p - q)*10n/2 + q aLbL+ (aLbR +aRbL) + aRbR ðể nhân a b a b, cần sử dụng phép nhân Số phép nhân sử dụng thuật toán ñược ñánh giá n*m0.59 với n ≥ m Khi nhân hai số nguyên lớn, thuật toán ñược ñánh giá nhanh thuật toán trước 29 Giới thiệu Giới thiệu Ví dụ Ví dụ 3: tính xn Thuật toán nhân « chia ñể trị » 0567 * 1234 nhân số bước dịch 05 12 05 34 67 12 67 34 30 kết 60 170 804 2278 699678 05 * 34 nhân số bước dịch 5 Vào: số nguyên x số nguyên không âm n Ra: y = xn Thuật toán ñơn giản kết 0 15 20 170 31 if n = then y=1 else y=x endif for i from to n y=y*x endfor 32 Giới thiệu Giới thiệu Ví dụ 3: tính xn Ví dụ 3: tính xn Thuật toán nhị phân Thuật toán nhị phân Giảm số phép toán Ý tưởng: sử dụng kết trung gian Nguyên tắc: n/2 = xn = xn/2 * xn/2 không xn = xn-1 * x Chẳng hạn Biểu diễn n dãy nhị phân Thay bít nhị phân « » kí hiệu SX « » kí hiệu S x35 = x34 * x x34 = x17 * x17 x17 = x16 * x x16 = x8 * x8 x8 = x4 * x4 x4 = x2 * x2 x2 = x * x Xoá cặp kí hiệu SX bên trái Kết quả: cách tính xn ñó S nghĩa bình phương X nghĩa nhân với x Bắt ñầu từ x 33 Giới thiệu 34 Giới thiệu Ví dụ 3: tính xn Ví dụ 3: tính xn Thuật toán nhị phân Thuật toán nhị phân Ví dụ: n = 35 = 100011(2) Biểu diễn n dãy nhị phân: ek-1ek-2…e0 if ek-1 = then y = // n = else y=x endif for i from k-2 to y=y*y if ei = then y=y*x endif endfor 35 ei y số phép nhân x 0 x2 x4 x8 x17 x35 36 Giới thiệu Giới thiệu Ví dụ 3: tính xn Ví dụ 3: tính xn Thuật toán nhị phân: giải thích Thuật toán nhị phân: có giải pháp tốt ? Biểu diễn nhị phân n: n = ∑i =0 Ai 2i Giả sử ñang trình tính xn Gọi j vị trí bít bên cuối (trái nhất) biểu diễn n, yj kết cuối có ñược Ban ñầu: j = p, yp = x = xAp Có hai khả Aj-1 p Chẳng hạn tính x15 n = 15 = 1111 SX SX SX SX SX Bắt ñầu x, có: Vậy, sử dụng phép Aj-1 = Thay Aj-1 SX Vậy yj-1 = yj2 * x Aj-1 = Thay Aj-1 S Vậy yj-1 = yj2 Cả hai trường hợp: yj-1 = yj2 * xAj-1 Tuy nhiên, tính x15 bởi: x2, x3, x6, x12, x15 = x12 * x3 Nghĩa cần sử dụng phép nhân Vậy: yp-1 = yp2 * xAp-1 = (xAp)2 * xAp-1 = x2Ap + Ap-1 Bằng truy hồi: y1 = x ∑ip=0 Ai i SX SX x2, x3, x6, x7, x14, x15 nhân = xn 37 Giới thiệu 38 Giới thiệu Ví dụ 3: tính xn Phân tích ñánh giá thuật toán Phương pháp ước số xn = x n = xn = xn-1 * x n số nguyên tố xn = (xr)s n = r * s với r ước số nguyên tố nhỏ n s > Dựa vào tính chất thuật toán Ví dụ: n = 15 15 = * 5, ñó x15 = (x3)5 Áp dụng thuật toán ñể tính x3 c5 với c = x3 x3 = x2 * x, áp dụng thuật toán tính x2 x2 = x * x c5 = c4 * c, áp dụng thuật toán tính c4 c4 = (c2)2 phép nhân tính c4, phép nhân tính c5, phép nhân tính x3 Vậy phép nhân tính x15 39 Chứng minh ñúng ñắn ðánh giá ñộ phức tạp 40 10 Nhát cắt cực tiểu Nhát cắt cực tiểu Minh hoạ Phân tích thuật toán (1) Câu hỏi: thuật toán luôn cho nhát cắt cực tiểu ? Trả lời: thuật toán cho nhát cắt cực tiểu với xác suất ≥ 2/n2 (n số ñỉnh) Chứng minh ? 421 Nhát cắt cực tiểu 422 Nhát cắt cực tiểu Phân tích thuật toán (3) Phân tích thuật toán (2) Thuật toán lặp n-2 bước Gọi C nhát cắt cực tiểu, giả sử |C| = k Mỗi ñỉnh phải có bậc ≥ k Bước lặp Nếu tồn ñỉnh có bậc < k cắt ñỉnh ñó, ñó C nhát cắt cực tiểu (mâu thuẩn) Nghĩa ñỉnh có k cạnh nối ñến Vì ñồ thị có n ñỉnh, nên có kn cạnh (có thể trùng nhau) Tuy nhiên, cạnh nối ñỉnh, nên ñồ thị có kn/2 cạnh 423 k Xác suất ñể cạnh ñược chọn thuộc C ≤ kn = / n Xác suất ñể cạnh ñược chọn không thuộc C ≥ 1-2/n Bước lặp (chỉ n-1 ñỉnh) Xác suất ñể cạnh ñược chọn thuộc C ≤ 2/(n-1) Xác suất ñể cạnh ñược chọn không thuộc C ≥1-2/(n-1) … Bước lặp n-2 Xác suất ñể cạnh ñược chọn thuộc C ≤ 2/3 Xác suất ñể cạnh ñược chọn không thuộc C ≥ 1-2/3 424 106 Nhát cắt cực tiểu Nhát cắt cực tiểu Nâng cao xác suất thành công Phân tích thuật toán (4) Thực lặp thuật toán nhatcatcuctieu n2/2 lần Xác suất p ñể thuật toán thành công (cho nhát cắt cực tiểu C) xác suất tất cạnh ñược chọn lựa không thuộc C bước lặp nhatcatcuctieu’ (G) begin = ∞, C = ∅ for i from to n2/2 C = nhatcatcuctieu (G) if (min > |C|) then = |C| endif endfor return (C) end ñó cạnh lại C Nghĩa   2   p ≥ 1 − 1 −  1 −   n  n −     n −  n −   −  =       n  n −    2 = ≥ n( n − 1) n Xác suất thuật toán không xác ñịnh ñược nhát cắt cực tiểu (1 − / n ) n /2 ≅ 1/ e ðược tính từ công thức x  2 lim1 −  ≅ x →∞ e  x Nghĩa xác suất thuật toán thành công ≥ 60% 425 Một số thuật toán Las Vegas 426 Quicksort Quicksort Chọn phần tử Thuật toán ñơn ñịnh Quicksort Trường hợp trung bình: O(nlogn) Trường hợp xấu nhất: O(n2) Khi mảng ñã ñược xếp theo chiều ngược lại Thuật toán xác suất Las Vegas Trường hợp xấu nhất: O(nlogn) 427 428 107 Quicksort Quicksort ðánh giá ñộ phức tạp (1) Thuật toán xác suất ðộ phức tạp (số lượng phép so sánh) prob-quicksort (A) begin if (n = 1) then return (A) else Chọn ngẫu nhiên phần tử x danh sách A Chia danh sách A thành A1, A2, A3 cho phần tử A1 nhỏ x, phần tử A2 x phần tử A3 lớn x return (prob-quicksort(A1), A2, prob-quicksort(A3)) endif end không phụ thuộc liệu (mảng cần xếp) phụ thuộc vào lựa chọn ngẫu nhiên phần tử chốt x Giả sử a1 ≤ a2 ≤ … ≤ an n phần tử A ≤ i < j ≤ n, gọi Xij biến ngẫu nhiên Xij = Xij = ñược so sánh với aj ngược lại Khi ñó, số phép so sánh ñược thực thuật toán là: X= Quicksort ∑X 1≤i ≤ j ≤ n 429 ij 430 Quicksort ðánh giá ñộ phức tạp (2) ðánh giá ñộ phức tạp (3) ðộ phức tạp thuật toán giá trị kỳ vọng biến ngẫu nhiên X   n −1 n E ( X ) = E  ∑ X ij  = ∑ E ( X ij ) = ∑i =1 ∑ j =i +1 E ( X ij )  1≤i < j ≤ n  1≤i < j ≤n Xác suất aj ñược chọn làm chốt = xác xuất phần tử từ ai,…,aj (j-i+1 phần tử) ñược chọn làm chốt Nghĩa P(Xij=1) = 2/(j-i+1) n −1 n Vậy E( X ) = ∑ ∑ j − i +1 i =1 j = i +1 Mà: E(Xij) = 0.Pr(Xij=0) + 1.Pr(Xij=1) = Pr(Xij=1) Pr(Xij = 1) ≡ xác suất ñược so sánh với aj ðể ñược so sánh với aj, hoặc aj phải ñược chọn làm chốt trước phần tử từ ai-1,…,aj-1 n −1 n −i +1 =∑ ∑k i =1 k = n −1 n k =1 k ≤ 2∑∑ phần tử ai-1,…,aj-1 ñượck chọn chốt aj thuộc hai mảng khác i =1 n 431 = 2n ∑ k =1 k 432 108 Quicksort Chọn phần tử Bài toán ðánh giá ñộ phức tạp (4) Cho danh sách A có n phần tử khác nhau, chọn phần tử lớn thứ k Nếu k = n/2, vấn ñề chọn phần tử trung bình Mà dãy 1+1/2+1/3 + … + 1/n ≈ ln(n) Vậy E(X) ≤ 2nln(n) Dùng ñể chọn chốt thuật toán Quicksort Giải pháp ñơn giản Sắp xếp mảng, sau ñó chọn phần tử thứ k ðộ phức tạp xếp mảng O(nlog(n)), ñộ phức tạp toán chọn phần tử O(nlog(n)) Như thế, ñộ phức tạp thuật toán prob-quicksort O(nln(n)) Thuật toán chia ñể trị ðề xuất M R Blum, R W Floyd, V R Pratt, R L Rivest and R E Tarjan ðộ phức tạp trường hợp trng bình O(n) ðã trình bày thuật toán chia ñể trị Tồn thuật toán xác suất ñơn giản ðộ phức tạp trường hợp bình O(n) 433 Chọn phần tử Chọn phần tử Thuật toán xác suất chonphantu (A, k) begin if (n = 1) then return (A[1]) else Chọn ngẫu nhiên x ∈ A Chia A thành A1, A2 cho A1= {y ∈ A| y j + 1, ñệ quy S2, nghĩa C(n-j-1) ≤ n −1   k −2  ∑ C (n − j − 1) + ∑ C ( j )  + n −  n  j =0 j=k  n −1   n −k +1  ∑ C ( j) + ∑ C ( j)  + n −1  n  j = n −1 j=k  (1) Thay tính C(n), chứng minh quy nạp C(n) ≤ cn với c số ñó Vậy, thời gian trung bình cho lời gọi ñệ quy nhiều Bước bản: rỏ ràng ñúng n=1 Bước giả thiết: giả sử C(m) ≤ cm với m ≤ n-1 Bước quy nạp: chứng minh C(n) ≤ cn n −1   k −2  ∑ C (n − j − 1) + ∑ C ( j )    n  j =0 j =k  437 Chọn phần tử Chọn phần tử Phân tích thuật toán (4) Phân tích thuật toán (5) Bước quy nạp: chứng minh C(n) ≤ cn Thay giả thiết quy nạp vào (1), ta có n −1  c  n − k +1 C ( n) ≤  ∑ j + ∑ j  + n − ( 2) n  j = n−1 j =k  Mà n −1 ∑ j = n − k +1 438 n −1 n −1 n − k +1−1 n −1 k −1 j =k j =1 j =1 j =1 j =1 j+∑ j = ∑ j− Mà 2nk-2k2 ≤ n2/2 Vậy n − k +1 n −1 3n j+∑ j ≤ ∑ j = n −1 j=k Thay vào (2) ta có ∑ j+∑ j−∑ j (n − 1)n (n − k )(n − k + 1) ( k − 1) k − − 2 2n − 2n − n + 2nk − k − n + k − k + k = n + 2nk − 2k − 3n + 2k n + 2nk − 2k = ≤ 2 C (n) ≤ c 3n 3cn  3c  + n −1 = + n − ≤ n + 1 n 4 4  Cuối ta chứng minh ñược C(n) ≤ cn với c ≥ =2 Vậy, thuật toán có ñộ phức tạp trường hợp trung bình O(n) 439 440 110 Giá trị kỳ vọng Giá trị kỳ vọng, giá trị mong ñợi (hoặc kỳ vọng toán học) biến ngẫu nhiên tổng xác suất kết thử nghiệm nhân với giá trị kết ñó Lớp toán NP ñầy ñủ (10) Như vậy, biểu diễn giá trị trung bình mà người ta "mong ñợi" thắng cược ñặt cược liên tục nhiều lần với khả thắng cược Nguyễn Thanh Bình Nếu X biến ngẫu nhiên rời rạc với giá trị x1, x2, xác suất tương ứng p1, p2, với tổng 1, E(X) ñược tính tổng chuỗi Khoa Công nghệ Thông tin Trường ñại học Bách khoa ðại học ðà Nẵng E ( X ) = ∑ xi pi i 441 ðặt vấn ñề Bài toán Phần lớn thuật toán ñã trình bày có ñộ phức tạp hàm ña thức Câu hỏi Tất toán ñều ñược giải thuật toán với thời gian thực thi hàm ña thức ? Bài toán ñịnh Trong lý thuyết NP-ñầy ñủ, giới hạn giải toán ñịnh toán cần giải pháp câu trả lời ñúng sai Trả lời Không Có toán giải ñược (tính dừng không xác ñịnh) Không Bởi có toán biết thuật toán giải chúng với thời gian thực thi hàm mũ Các lớp ñộ phức tạp Lớp vấn ñề giải thuật toán có ñộ phức tạp hàm ña thức ví dụ, toán kiểm tra số có số nguyên tố không ? Bài toán tối ưu Phần lớn toán cần giải không ñịnh, mà toán tối ưu (tìm giải pháp tốt nhất) Ví dụ, toán xếp ba lô O(n2), O(n3), O(1), O(n lg n) Lớp vấn ñề phức tạp (giải thuật toán có ñộ phức tạp hàm mũ) O(2n), O(nn), O(n!) Chuyển toán tối ưu toán ñịnh Áp ñặt cận lên giá trị cần tối ưu Cần phương tiện xác ñịnh toán thuộc lớp ? 443 444 111 Bài toán Lớp P Ví dụ ðịnh nghĩa Chuyển toán tối ưu toán ñịnh Bài toán tối ưu: « cho ñồ thị G tìm ñường ñi ngắn hai ñỉnh u v ñồ thị » Bài toán ñịnh: « cho ñồ thị G, hai ñỉnh u v, số nguyên dương k, có tồn G ñường ñi từ u ñến v có chiều dài lớn k ? » Lớp ñộ phức tạp P (polynomial time) ñược ñịnh nghĩa gồm toán ñịnh ñược giải thời gian ña thức nghĩa tồn thuật toán có ñộ phức tạp hàm ña thức giải toán Phần lớn toán ñã xem xét toán P 445 Lớp NP 446 P NP Lớp P ðịnh nghĩa Lớp ñộ phức tạp NP (nondeterministic polynomial time) bao gồm tập hợp toán ñịnh ñược mà tồn thuật toán có ñộ phức tạp hàm ña thức kiểm tra giải pháp ñúng Chúng ta không tìm cách xác ñịnh giải pháp mà kiểm tra giải pháp ñã cho ñúng Tập hợp toán ñược giải thuật toán có ñộ phức tạp hàm ña thức Các giải pháp dễ dàng ñược tìm thấy Lớp NP Tập hợp toán mà giải pháp chúng ñược kiểm tra thuật toán có ñộ phức tạp hàm ña thức giải pháp dễ dàng ñược kiểm tra, cho dù khó khăn ñể tìm giải pháp P ⊆ NP P = NP ? Vấn ñề chưa giải ñược ! 447 448 112 P NP Lớp NP-ñầy ñủ Ví dụ Bài toán tô màu ñồ thị (bản ñồ) Cho ñồ thị G k màu Có thể tô màu ñồ thị G với nhiều k màu cho hai ñỉnh kề bất ky có màu khác ? Không thuộc lớp toán P ðể xác ñịnh giải pháp không ñơn giản Thuộc lớp toán NP Giả sử có giải pháp danh sách màu ñược gán cho ñỉnh Thuật toán kiểm tra tính ñúng ñắn giải pháp ñơn giản: Kiểm tra ñỉnh phải có màu hợp lệ (chỉ sử dụng k màu) Kiểm tra cạnh có hai ñỉnh ñược tô hai màu khác Các toán NP-ñầy ñủ toán « khó » lớp NP Nếu toán NP-ñầy ñủ ñược giải thuật toán có ñộ phức tạp hàm ña thức Thì tất toán NP ñều ñược giải thuật toán có ñộ phức tạp hàm ña thức Khi ñó P = NP Tuy nhiên, thực tế chưa có toán NP-ñầy ñủ ñược giải thuật toán có ñộ phức tạp hàm ña thức Hiểu NP-ñầy ñủ Khái niệm « rút gọn toán » 449 Rút gọn toán 450 Rút gọn toán Một toán P ñược rút gọn thành toán Q, toán cụ thể (tuỳ theo liệu vào) x P ñược chuyển thành toán cụ thể y Q Khi ñó, giải Q(y) cung cấp giải pháp cho P(x) Nếu P ñược rút gọn thành Q, P không khó ñể giải so với Q Ví dụ Bài toán P Cho tập giá trị lô-gíc (ñúng/sai), có tồn giá trị ñúng ? Bài toán Q Cho tập số nguyên, tổng chúng có > ? Chuyển P thành Q Ví dụ ñơn giản Giải phương trình ax + b = ñược chuyển thành giải phương trình ax2 + bx + c = 451 (x1,x2,…,xn) = (y1,y2,…,yn) ñó yi = xi = ñúng, yi = xi = sai 452 113 Rút gọn toán NP-khó NP-ñầy ñủ ðịnh nghĩa Bài toán ñịnh P ñược rút gọn thời gian ña thức (polynomial-time reducible) thành toán ñịnh Q, tồn hàm f tính ñược thời gian ña thức từ miền liệu vào P vào miền liệu vào Q cho: x thuộc miền liệu vào P, P(x) ñúng Q(f(x)) ñúng P ñược rút gọn thời gian ña thức thành Q ñược ký hiệu P ≤p Q NP-khó (NP-hard) Bài toán Q ñược gọi NP-khó thoả mãn: NP-ñầy ñủ (NP-complete) Bài toán Q ñược gọi NP-ñầy ñủ thoả mãn: Hàm f rút gọn P thành Q Nếu tồn thuật toán có ñộ phức tạp hàm ña thức cho Q tồn thuật toán có ñộ phức tạp hàm ña thức cho P ∀P ∈ NP, P ≤p Q Q ∈ NP ∀P ∈ NP, P ≤p Q Nếu P ≤p Q P NP-ñầy ñủ Q NPñầy ñủ 453 Ví dụ 454 Chứng minh toán NP-ñầy ñủ Các toán NP-ñầy ñủ Tô màu ñồ thị: tô màu ñồ thị với nhiều màu cho hai ñỉnh kề có màu khác ? Chu trình Hamilton: cho ñồ thị có tồn chu trình chứa tất ñỉnh ñồ thị ? Người du lịch: người du lịch muốn ñi qua tất thành phố với quảng ñường ngắn nhất, với ñiều kiện thành phố ñi qua lần Tại phải chứng minh toán NP-ñầy ñủ ? Không cần tìm kiếm thuật toán giải hiệu (thời gian ña thức) Cần tìm thuật toán xấp xỉ (approximative algorithms) SAT: cho biểu thức lô-gíc gồm biến lô-gíc x1, x2, …,xn phép toán (AND, OR, NOT, ⇒, ⇔) ngoặc Có tồn phép gán biến x1, x2, …,xn cho biểu thức có giá trị ñúng ? … 455 456 114 Chứng minh toán NP-ñầy ñủ ðịnh lý Cook Các bước chứng minh P toán NP-ñầy ñủ Chứng minh P ∈ NP Chọn toán Q NP-ñầy ñủ (ñã biết) Mô tả thuật toán tính hàm f chuyển toán cụ thể Q thành toán cụ thể P Chứng minh hàm f thoả mãn: Q(x) ñúng P(f(x)) ñúng Chứng minh thuật toán tính hàm f có ñộ phức tạp hàm ña thức ðịnh lý Cook (1971) SAT toán NP-ñầy ñủ Cho biểu thức lô-gíc gồm biến lô-gíc x1, x2, …,xn Có tồn phép gán biến x1, x2, …,xn cho biểu thức có giá trị ñúng ? Chứng minh Dựa ñịnh nghĩa NP-ñầy ñủ Không dựa vào phép rút gọn Cần toán NP-ñầy ñủ ñã biết ðịnh lý Cook chứng minh toán ñầu tiên NP-ñầy ñủ 457 Chứng minh toán NP-ñầy ñủ NP-ñầy ñủ Sử dụng toán SAT ñể chứng minh toán khác NP-ñầy ñủ NP NP NP NP NP 458 Chi tiết Chapter 34: NP-Completeness, Introduction to algorithms, T.H Cormen, C.E Leiserson, R.R Rivest, Mit Press 1990 rút gọn SAT NP-ñầy ñủ rút gọn Bài toán NP-ñầy ñủ NP NP 459 460 115 Thuật toán xấp xĩ (approximation algorithms) Giải toán NP-ñầy ñủ Thuật toán xấp xĩ (11) Thuật toán hàm mũ Thuật toán quay lui Không hiệu Thuật toán xấp xĩ Nguyễn Thanh Bình Cho kết gần ñúng ðộ phức tạp hàm ña thức Khoa Công nghệ Thông tin Trường ñại học Bách khoa ðại học ðà Nẵng Thuật toán cho kết gần với kết tối ưu ñược gọi thuật toán xấp xĩ 462 Thuật toán xấp xĩ Thuật toán xấp xĩ Tỷ lệ xấp xĩ (2) Tỷ lệ xấp xĩ (approximation ratio) ðịnh nghĩa tỷ lệ xấp xĩ ñúng cho toán cực tiểu hoá toán cực ñại hoá Cần giải toán tối ưu Bài toán có nhiều giải pháp Cần tối ưu hàm hàm mục tiêu Giải pháp tối ưu giải pháp mà cực ñại (hoặc cự tiểu) hoá hàm mục tiêu Bài toán cực tiểu hoá: C ≥ C* > 0, ñó ρ(n) = C/C* Bài toán cực ñại hoá: C* ≥ C > 0, ñó ρ(n) = C*/C Một thuật toán với tỷ lệ xấp xĩ ρ(n) ñược gọi thuật toán xấp xĩ- ρ(n) ðặt C giá trị hàm mục tiêu giải pháp xấp xĩ C* giá trị hàm mục tiêu giải pháp tối ưu Luôn có: ρ(n) ≥ Nếu ρ(n) nhỏ giải pháp xấp xĩ gần với giải pháp tối ưu Một thuật toán xấp xĩ có tỷ lệ xấp xĩ, ký hiệu ρ(n), với liệu vào kích thước n là:  C C*  max  * ,  ≤ ρ (n) C C  Thuật toán xấp xĩ-1 cho giải pháp tối ưu (nghĩa ρ(n) = 1) 463 464 116 Một số thuật toán xấp xĩ Bài toán phủ ñỉnh Bài toán phủ ñỉnh (vertex cover problem) Bài toán người du lịch (traveling salesman problem) Bài toán Cho ñồ thị vô hướng G = (V,E) Phủ ñỉnh G tập V’ ⊂ V cho (u,v) cạnh G u ∈ V’ v ∈ V’ Cần xác ñịnh phủ ñỉnh có kích thước nhỏ Bài toán ñịnh phủ ñỉnh tương ứng NP-ñầy ñủ Với k cho trước, có tồn phủ ñỉnh V’ ñồ thị G cho |V’| ≤ k Rất phức tạp ñể tìm giải pháp tối ưu V’ Tuy nhiên, thuật toán xấp xĩ ñơn giản 465 Bài toán phủ ñỉnh 466 Bài toán phủ ñỉnh Thuật toán xấp xĩ Minh hoạ (1) phucacdinh-xapxi (G=(V,E)) begin C=∅ U=E while (U ≠ ∅) (u,v) cạnh thuộc U C = C ∪ (u,v) xoá U tất cạnh nối ñến u v endwhile return (C) end b c d a e f g b c d a e f Thuật toán có ñộ phức tạp hàm tuyến tính 467 g 468 117 Bài toán phủ ñỉnh Bài toán phủ ñỉnh Minh hoạ (2) Minh hoạ (3) b c d a e f g b c d a e f g Giải pháp xấp xĩ: b, c, d, e, f, g b c d a e f b c d a e f g g Giải pháp tối ưu: b, d, e 469 Bài toán phủ ñỉnh 470 Bài toán người du lịch ðịnh lý: phucacdinh-xapxi thuật toán xấp xĩ-2 (ρ(n) ≤ 2) Chứng minh Gọi A tập cạnh (u,v) ñược chọn thuật toán Bởi cách xây dựng A, có hai cạnh A có chung ñỉnh (do bước xoá cạnh nối ñến u v) Vậy, bước lặp thêm vào C hai ñỉnh u v |C| = x |A| (*) Bài toán Cho ñồ thị vô hướng liên thông hoàn toàn G=(V,E), nghĩa hai ñỉnh tồn cạnh nối chúng Mỗi cạnh (u,v) có trọng số c(u,v) ≥ Tìm chu trình Hamilton có tổng trọng số nhỏ Trong thực tế, ñi từ ñỉnh u ñến trực tiếp ñỉnh v nhanh ñi từ u ñến v qua ñỉnh trung gian w Tình ñược mô tả bất ñằng thức tam giác ñối với hàm trọng số c c(u,v) ≤ c(u,w) + c(w,v), với u, v, w ñỉnh thuộc V Gọi C* phủ ñỉnh với kích thước nhỏ Vì hai cạnh A ñỉnh chung, nên ñỉnh C* nối ñến nhiều cạnh A Theo ñịnh nghĩa phủ ñỉnh, C* phải chứa ñỉnh cạnh thuộc A Vậy |C*| ≥ |A| (**) Giả sử hàm trọng số c toán thoả mãn bất ñằng thức tam giác Hầu hết toán thực tế thoả mãn bất ñằng thức tam giác Kết hợp (*) (**), ta có |C| ≤ 2|C*| Bài toán người du lịch thuộc lớp NP-ñầy ñủ 471 472 118 Bài toán người du lịch Bài toán người du lịch Thuật toán xấp xĩ Minh hoạ (1) nguoidulich-xapxi (G) begin Chọn ñỉnh r G ñỉnh « gốc » Xác ñịnh khung nhỏ T G thuật toán Prim Gọi L danh sách ñỉnh duyệt T theo thứ tứ trước return (trả chu trình Hamilton H thăm ñỉnh L theo thứ tự) end a d a d b f e b f e g c Cây khung nhỏ nhất: chứa tất ñỉnh ñồ thị có tổng trọng số cạnh nhỏ Duyệt thứ tự trước: nút ñược thăm trước thăm nút ðộ phức tạp thuật toán: O(|V|2) ðộ phức tạp thuật toán Prim g c h h ðồ thị G với khoảng cách ñỉnh trọng số cạnh tương ứng Cây khung nhỏ nhất, gốc a 473 Bài toán người du lịch Bài toán người du lịch Minh hoạ (2) a Minh hoạ (3) d a f a d e b 474 d b g c f b g Duyệt T theo thứ tự trước: a, b, c, b, h, b, a, d, e, f, e, g, e, d, a f c c h a d b f e e Chu trình Hamilton, ñỉnh L: a, b, c, h, d, e, f, g, a 475 g c h h e g Giải pháp xấp xĩ h Giải pháp tối ưu Tổng trọng số giải pháp xấp xĩ ≈ 123% tổng trọng số giải pháp tối ưu 476 119 Bài toán người du lịch Bài toán người du lịch ðịnh lý: nguoidulich-xapxi thuật toán xấp xĩ-2 (ρ(n) ≤ 2) Chứng minh H* H chu trình Hamilton xác ñịnh thuật toán xấp xĩ chu trình Hamilton có kích thước nhỏ Cần chứng minh c(H) ≤ 2c(H*) Bằng cách xoá cạnh chu trình Hamilton H* ta có khung T’ Vậy c(T’) ≤ c(H*) Theo thuật toán T khung nhỏ Nên c(T) ≤ c(T’) ≤ c(H*) Một phép duyệt ñầy ñủ T liệt kê tất ñỉnh gặp lần ñầu gặp lại sau ñã duyệt chúng Gọi W phép duyệt ñầy ñủ T Chẳng hạn, ví dụ trước, phép duyệt ñầy ñủ liệt kê ñỉnh theo thứ tự trước: a, b, c, b, h, b, a, d, e, f, e, g, e, d, a 477 Chứng minh (tiếp) Như thế, phép duyệt ñầy ñủ W T thăm cạnh ñúng hai lần Vậy c(W) = 2c(T) ≤ 2c(H*) Ngoài ra, nhờ vào tính chất bất ñẳng thức tam giác, xoá lần thăm ñỉnh W mà không làm tăng trọng số W: ñỉnh w ñược xoá lần thăm ñỉnh u ñỉnh v, danh sách ñỉnh ñi trực tiếp từ u ñến v (với trọng số c(u,v) ≤ c(u,w) + c(w,v)) Áp dụng xoá tất lần thăm ñỉnh W, trừ lần thăm ñầu tiên (nghĩa xoá tất lần thăm sau lần ñầu tiên) trừ lần thăm cuối ñỉnh « gốc » Chẳng hạn, ví dụ trên, chúng la có danh sách: a, b, c, h, d, e, f, g, a Danh sách chu trình Hamilton H cho thuật toán xấp xĩ Vậy chu trình Hamilton H có ñược việc xoá ñỉnh W (áp dụng tính chất bất ñẳng thức tam giác) Như thế: c(H) ≤ c(W) ≤ 2c(H*) 478 120 ... loại ñinh cần lấy Nếu không, loại bỏ ngăn kéo vừa mở, thực mở ngăn kéo khác cách ngẫu nhiên 14 14 13 1 15 *1 + * * + * * * + = 1 i = 15 15 14 15 14 13 15 *1 + * + * + * = 3.26 15 15 15 15 Giải... tử có giá trị khác Hãy 2n 0 1 10 3.32 33.2 10 0 10 3 10 24 10 0 6. 64 6 64 1 04 10 6 1. 2630 10 00 9.965 965 10 6 10 9 ∞ 10 6 19 .9 31 19 9 31 568 10 12 10 18 ∞ 11 9 Xây dựng thuật toán xác ñịnh phần tử nhỏ phần... hàm CminA(n) = 8n2 + 2n + ≤ 8n2 + 2n2 + n2 với n ≥ = 11 n2 chọn c = 11 , n0 = 1, CminA(n) = O(n2) CminB(n) = 10 00n2 + 10 n + ≤ 10 00n2 + 10 n2 + 2n2 với n ≥ = 10 12n2 chọn c = 10 12, n0 = 1, CminB(n)

Ngày đăng: 22/12/2016, 13:15

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w