Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
3,11 MB
Nội dung
Chương Mở đầu thuật toán độ phức tạp Nguyễn Văn Hạnh Bộ mơn Tốn -tin ứng dụng Email: nvhanh@vnua.edu.vn Webpage: http://fita.vnua.edu.vn/nvhanh/ Nội dung Thuật toán độ phức tạp Đánh giá độ phức tạp thuật toán nào? Dùng O(f(n)) để đánh giá độ phức tạp thuật toán Các quy tắc để đánh giá độ phức tạp thuật toán Các thuật toán độ phức tạp Định nghĩa thuật tốn • Thuật tốn: dãy hữu hạn bước, bước mơ tả xác phép toán, hành động cần thực … ta lời giải tốn • Ví dụ Thuật tốn Euclid: Tìm UCLN hai số ngun dương Input: m, n số nguyên dương Output: g (UCLN m n) Phương pháp: Bước 1: Tìm r, phân dư phép chia m cho n Bước 2: Nếu r = 0, g := n (gán giá trị n cho g) dừng lại Ngược lại (r ≠ 0), m := n; n := r quay lại bước Các yêu cầu thuật toán Input: giá trị cần đưa vào thuật toán bắt đầu làm việc Ví dụ thuật tốn Euclid, input số nguyên dương m, n Output: giá trị có quan hệ hồn tồn xác định với liệu input, kết thực thuật tốn Ví dụ thuật tốn Euclid, output UCLN g Tính xác định: Ở bước, thao tác phải rõ ràng, không gây nên nhập nhằng Thuật tốn cần mơ tả ngơn ngữ lập trình: mệnh đề tạo theo quy tắc cú pháp nghiêm ngặt có nghĩa Tính khả thi: phép tốn thực trực tiếp Tính dừng: thuật tốn phải dừng sau số hữu hạn bước thực Vấn đề giải không giải Vấn đề giải được: vấn đề có thuật tốn giải Ví dụ, tìm nghiệm hệ phương trình tuyến tính vấn đề giải Vấn đề không giải được: vấn đề khơng tồn thuật tốn giải Ví dụ, thuật tốn thắng cho người thứ cờ ca rô; thuật tốn xác định xem máy Turing có dừng lại sau n bước hay không Các vấn đề liên quan đến thuật toán Thiết kế thuật toán: số kỹ thuật thiết kế thuật tốn: • Phương pháp chia để trị (divide-and-conque) • Phương pháp tham lam (greedy method) • Phương pháp quy hoạch động Tính đắn thuật toán: thuật toán thực cho kết với liệu vào hợp lệ Phân tích thuật tốn: với tốn có số thuật giải → cần phân tích, đánh giá độ phức tạp thuật tốn để lựa chọn thuật toán Đánh giá hiệu thuật toán Hai tiêu chuẩn để lựa chọn thuật toán: Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương trình) Thuật tốn sử dụng tiết kiệm nguồn tài nguyên máy tính, chạy nhanh được: tính hiệu thuật tốn: • Dung lượng không gian nhớ cần thiết để lưu liệu vào, kết tính tốn trung gian kết thuật tốn • Thời gian để thực thuật toán: thuật toán hiệu có thời gian chạy so với thuật toán khác Biểu diễn thuật toán Phương pháp biểu diễn thuật tốn: • Phương pháp liệt kê bước • Phương pháp sơ đồ khối • Ngơn ngữ lập trình Phương pháp liệt kê bước Thuật tốn: Giải phương trình bậc hai ax + bx + c = • Bước 1: Xác định hệ số a, b, c • Bước 2: Kiểm tra hệ số a, b, c có khác hay khơng? Nếu a = quay lại thực bước • Bước 3: Tính Δ = b − 4ac • Bước 4: Nếu Δ < thông báo PT vô nghiệm chuyển sang bước −b chuyển sang bước • Bước 5: Nếu Δ = 0, tính x1 = x2 = 2a • Bước 6: Tính x1,2 = −b ∓ 2a Δ chuyển sang bước • Bước 7: Thơng báo nghiệm x1, x2 • Bước 8: Kết thúc thuật toán Phương pháp sơ đồ khối Thuật tốn: Giải phương trình bậc hai ax + bx + c = Quy tắc để đánh giá độ phức tạp câu lệnh If Lệnh If: S1, S2 câu lệnh có độ phức tạp O( f1(n)), O( f2(n)) , E biểu thức logic: If E then S1 If E then S1 else S2 gọi lệnh If có độ phức tạp O(max( f1(n), f2(n))) Quy tắc để đánh giá độ phức tạp câu lệnh Case Lệnh Case: S1, …, Sk câu lệnh có độ phức tạp O( f1(n)), …, O( fk(n)) , E biểu thức có kiểu thứ tự đếm v1, …, vk giá trị có kiểu với E: Case E of v1 : S1; …… vk : Sk; End gọi lệnh Case có độ phức tạp O(max( f1(n), …, fk(n))) Quy tắc để đánh giá độ phức tạp câu lệnh While Lệnh While: Nếu S câu lệnh có độ phức tạp O( f(n)), E biểu thức logic: While E S gọi lệnh While Nếu g(n) số tối đa lần thực lệnh S thực lệnh While độ phức tạp lệnh While O( f(n)g(n)) Quy tắc để đánh giá độ phức tạp câu lệnh Repeat Lệnh Repeat: Nếu S câu lệnh có độ phức tạp O( f(n)), E biểu thức logic: Repeat S Until E gọi lệnh Repeat Nếu g(n) số tối đa lần lặp độ phức tạp lệnh Repeat O( f(n)g(n)) Quy tắc để đánh giá độ phức tạp câu lệnh For Lệnh For: Nếu S câu lệnh có độ phức tạp O( f(n)) , E1, E2 biểu thức kiểu thứ tự đếm thì: For i := E1 to E2 S For i := E2 downto E1 S gọi lệnh For Nếu g(n) số tối đa lần lặp độ phức tạp lệnh For O( f(n)g(n)) Quy tắc để đánh giá độ phức tạp hàm đệ quy Hàm đệ quy: Giả sử độ phức tạp hàm đệ quy T(n) với n cỡ liệu vào • Khi độ phức tạp lời gọi đệ quy thủ tục T(m); với m < n • Đánh giá độ phức tạp T(n0), với n0 cỡ liệu vào nhỏ • Đánh giá thân hàm để nhận quan hệ đệ quy sau T(n) = F(T(n1), T(n2), …, T(nk)) với n1, n2, …, nk < n • Giải phương trình đệ quy ta nhận đánh giá T(n) Ví dụ đánh giá độ phức tạp hàm đệ quy Ví dụ: Đánh giá độ phức tạp hàm đệ quy để tính n! Function fact(n); Begin If n ≤ then fact := Else fact := n*fact(n-1); End; • Độ phức tạp T(n) với n cỡ liệu vào • Với n = 1: T(1) = O(1) thực lệnh gán fact := • Với n > 1: T(n) O(1) để thực phép gán (:=) phép nhân (*) cộng với T(n-1) độ phức tạp lời gọi đệ quy fact(n-1) Nên ta có: T(1) = C1; T(n) = C2 + T(n-1); Ví dụ đánh giá độ phức tạp hàm đệ quy Ví dụ: Đánh giá độ phức tạp hàm đệ quy để tính n! Function fact(n); Begin If n ≤ then fact := Else fact := n*fact(n-1); End; • Khi T(n) = C2 + T(n-1) = C2 + C2 + T(n-2) = C2 + C2 + C2 + T(n-3) = … = (n-1)C2 + T(1) = (n-1)C2 + C1 • Vậy T(n) = O(n) Ví dụ xác định độ phức tạp thuật tốn Ví dụ: Xác định độ phức tạp thuật tốn tính dãy số Fibonacci Cơng thức truy hồi dãy Fibonacci là: Bài tốn áp dụng: Một đôi thỏ (gồm thỏ đực thỏ cái) tháng đẻ đôi thỏ (cũng gồm thỏ đực thỏ cái); đơi thỏ con, trịn tháng tuổi, sau tháng đẻ đôi thỏ con, trình sinh nở tiếp diễn Hỏi sau n tháng có đơi thỏ, đầu năm (tháng Giêng) có đơi thỏ sơ sinh? Ví dụ xác định độ phức tạp thuật tốn Ví dụ: Xác định độ phức tạp thuật tốn tính dãy số Fibonacci Function Fibo(n: integer): integer; Var i, j, k: integer; Begin i := 1; j :=0; For k := to n Begin j := i + j; i := j - i; End; Fibo := j; End; Độ phức tạp thuật tốn O(n) Ví dụ so sánh độ phức tạp thuật toán Ví dụ: Xét tốn tính giá trị đa thức P(x) = an x n + an−1x n−1 + … + a1x + a0 x = x0 Thuật tốn 1: Bước Tính giá trị hạng tử: với i = đến n tính x0i Bước Tính P(x0) = n ∑ i=1 x0i + a0 Thuật toán 2: Ta viết P(x) = (an x n−1 + an−1x n−2 + … + a1)x + a0 = = ((an x + an−1x)x…)x + a0 Bước Gán P Bước Với i := an = đến n: gán P = Px0 + an−i Bước Gán kết P(x0) =P Độ phức tạp thuật toán Thuật toán 1: Bước Tính giá trị hạng tử: với i = đến n tính x0i i = : ta phải thực phép nhân: a1 x0 i = : ta phải thực phép nhân a2 x02 = a2 x0 x0 ……………………………………………………………… i = n : ta thực n phép nhân: an x0n = an x0…x0 n(n + 1) Vậy bước ta phải thực + + … + n = phép nhân Bước Tính P(x0) = n ∑ i=1 x0i + a0 : ta thực n phép cộng n(n + 1) n(n + 3) Vậy thuật tốn cần phép tính nên độ phức tạp thuật +n= 2 toán O(n 2) Độ phức tạp thuật toán Thuật toán 2: Bước Gán P := an : ta thực phép toán Bước Với i = đến n : gán P = Px0 + an−i : ta phải thực n lần, lần cần thực phép toán phép nhân phép cộng nên bước cần thực 2n phép toán Bước Gán kết P(x0) = P: ta thực phép toán Vậy thuật toán cần thức 2n + phép toán nên độ phức tạp thuật toán O(n) Kết luận: Thời gian thực thuật toán thời gian thực thuật tốn Bài tập nhà Hãy xây dựng đánh giá độ phức tạp thuật toán sau: Thuật tốn tìm phần tử lớn dãy hữu hạn số thực Thuật tốn tìm phần tử bé tập tập hợp số tự nhiên Thuật toán xếp lại dãy theo thứ tự tăng dần Thuật tốn tìm dãy số liên tiếp (dài có thể) có tổng dương dãy số thực cho trước The end of chapter ... an−1x n? ?1 + … + a1x + a0 x = x0 Thuật tốn 1: Bước Tính giá trị hạng tử: với i = đến n tính x0i Bước Tính P(x0) = n ∑ i =1 x0i + a0 Thuật toán 2: Ta viết P(x) = (an x n? ?1 + an−1x n−2 + … + a1)x... fact := n*fact(n -1) ; End; • Độ phức tạp T(n) với n cỡ liệu vào • Với n = 1: T (1) = O (1) thực lệnh gán fact := • Với n > 1: T(n) O (1) để thực phép gán (:=) phép nhân (*) cộng với T(n -1) độ phức tạp... vậy, T(n) = O(f(n)) f(n) = O(g(n)) nên tồn c1, c2, n1, n2 để T(n) ≤ c1 f(n) với n ≥ n1 f(n) ≤ c2g(n) với n ≥ n2 • Khi T(n) ≤ c1c2g(n) với n ≥ n0 = max(n1, n2) Nên ta có T(n) = O(g(n)) • Khi biểu