1. Trang chủ
  2. » Tất cả

Phân tích thời gian thực hiện thuật toán

13 3 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 thời gian thực thuật tốn Tác giả: Khoa CNTT ĐHSP KT Hưng Yên ĐỘ PHỨC TẠP GIẢI THUẬT Giới thiệu Hầu hết toán có nhiều thuật tốn khác để giải chúng Như vậy, làm để chọn cài đặt tốt nhất? Đây lĩnh vực phát triển tốt nghiên cứu khoa học máy tính Chúng ta thường xuyên có hội tiếp xúc với kết nghiên cứu mơ tả tính thuật toán Tuy nhiên, việc so sánh thuật toán cần thiết chắn vài dòng hướng dẫn tổng quát phân tích thuật tốn hữu dụng • • • • Khi nói đến hiệu thuật tốn, người ta thường quan tâm đến chi phí cần dùng để thực Chi phí thể qua việc sử dụng tài nguyên nhớ, thời gian sử dụng CPU, … Ta đánh giá thuật tốn phương pháp thực nghiệm thơng qua việc cài đặt thuật toán chọn liệu thử nghiệm Thống kê thông số nhận chạy liệu ta có đánh giá thuật toán Tuy nhiên, phương pháp thực nghiệm gặp số nhược điểm sau khiến cho khó có khả áp dụng thực tế: Do phải cài đặt bắng ngơn ngữ lập trình cụ thể nên thuật toán chịu hạn chế ngữ lập trình Đồng thời, hiệu thuật tốn bị ảnh hưởng trình độ người cài đặt Việc chọn liệu thử đặc trưng cho tất tập liệu vào thuật tốn khó khăn tốn nhiều chi phí Các số liệu thu nhận phụ thuộc nhiều vào phần cứng mà thuật toán thử nghiệm Điều khiến cho việc so sánh thuật tốn khó khăn chúng thử nghiệm nơi khác Vì lý trên, người ta tìm kiếm phương pháp đánh giá thuật tốn hình thức hơn, phụ thuộc mơi trường phần cứng Một phương pháp phương pháp đánh giá thuật toán theo hướng xầp xỉ tiệm cận qua khái niệm toán học O-lớn O(), O-nhỏ o() Thông thường vấn đề mà giải có "kích thước" tự nhiên (thường số lượng liệu xử lý) mà gọi N Chúng ta muốn mô tả tài nguyên cần dùng (thông thường thời gian cần thiết để giải vấn đề) hàm số theo N Chúng ta quan tâm đến trường hợp trung bình, tức thời gian cần thiết để xử lý liệu nhập thông thường, quan tâm đến trường hợp xấu nhất, tương ứng với thời gian cần thiết liệu rơi vào trường hợp xấu có Việc xác định chi phí trường hợp trung bình thường quan tâm nhiều đại diện cho đa số trường hợp sử dụng thuật tốn nhiên, việc xác định chi phí trung bình lại gặp nhiều khó khăn Vì vậy, nhiều trường hợp, người ta xác định chi phí trường hợp xấu (chặn trên) thay cho việc xác định chi phí trường hợp trung bình Hơn nữa, số tốn, việc xác định chi phí trường hợp xấu quan trọng Ví dụ, tốn hàng khơng, phẫu thuật, … Các bước phân tích thuật tốn Bước việc phân tích thuật tốn xác định đặc trưng liệu dùng làm liệu nhập thuật tốn định phân tích thích hợp Về mặt lý tưởng, muốn với phân bố tùy ý cho liệu nhập, có phân bố tương ứng thời gian hoạt động thuật tốn Chúng ta khơng thể đạt tới điều lý tưởng nầy cho thuật tốn khơng tầm thường nào, quan tâm đến bao thống kê tính thuật tốn cách cố gắng chứng minh thời gian chạy luôn nhỏ "chận trên" bất chấp liệu nhập cố gắng tính thời gian chạy trung bình cho liệu nhập "ngẫu nhiên" Bước thứ hai phân tích thuật tốn nhận thao tác trừu tượng thuật toán để tách biệt phân tích với cài đặt Ví dụ, tách biệt nghiên cứu có phép so sánh thuật toán xếp khỏi xác định cần micro giây máy tính cụ thể; yếu tố thứ xác định tính chất thuật toán, yếu tố thứ hai lại xác định tính chất máy tính Sự tách biệt cho phép so sánh thuật toán cách độc lập với cài đặt cụ thể hay độc lập với máy tính cụ thể Bước thứ ba q trình phân tích thuật tốn phân tích mặt tốn học, với mục đích tìm giá trị trung bình trường hợp xấu cho đại lượng Chúng ta khơng gặp khó khăn tìm chặn cho thời gian chạy chương trình, vấn đề chỗ phải tìm chận tốt nhất, tức thời gian chạy chương trình gặp liệu nhập trường hợp xấu Trường hợp trung bình thơng thường địi hỏi phân tích tốn học tinh vi trường hợp xấu Mỗi hoàn thành q trình phân tích thuật tốn dựa vào đại lượng bản, thời gian kết hợp với đại lượng xác định rõ ta có biểu thức để tính thời gian chạy Nói chung, tính thuật tốn thường phân tích mức độ vơ xác, bị giới hạn tính khơng chắn máy tính hay khó khăn việc xác định tính chất tốn học vài đại lượng trừu tượng Tuy nhiên, thay phân tích cách chi tiết thường thích ước lượng để tránh sa vào chi tiết Cách đánh giá thời gian thực giải thuật độc lập với máy tính yếu tố liên quan tới máy dẫn đến khái niệm “ cấp độ lớn thời gian thực giải thuật” hay nói cách khác “độ phức tạp tính tốn giải thuật” Nếu thời gian thực giải thuật T(n) = cn2 (c = const) ta nói độ phức tạp tính tốn giải thuật có cấp n2 Kí hiệu : T(n) = O(n2) (kí hiệu chữ O lớn) Định nghĩa: Một hàm f(n) xác định O(g(n)) hay f(n) = O(g(n)) gọi có cấp g(n) tồn số c n0 cho : f(n) ≤ cg(n) n ≥ n0 nghĩa f(n) bị chặn số nhân với g(n), với giá trị n từ điểm Sự phân lớp thuật toán Như ý trên, hầu hết thuật tốn có tham số N, thơng thường số lượng phần tử liệu xử lý mà ảnh hưởng nhiều tới thời gian chạy Tham số N bậc đa thức, kích thước tập tin xếp hay tìm kiếm, số nút đồ thị v.v Hầu hết tất thuật tốn giáo trình có thời gian chạy tiệm cận tới hàm sau: Hằng số: Hầu hết thị chương trình thực lần hay nhiều vài lần Nếu tất thị chương trình có tính chất nầy nói thời gian chạy số Điều nầy hiển nhiên hoàn cảnh phấn đấu để đạt việc thiết kế thuật toán logN: Khi thời gian chạy chương trình logarit tức thời gian chạy chương trình tiến chậm N lớn dần Thời gian chạy thuộc loại nầy xuất chương trình mà giải tốn lớn cách chuyển thành tốn nhỏ hơn, cách cắt bỏ kích thước bớt số Với mục đích chúng ta, thời gian chạy có xem nhỏ số "lớn" Cơ số logarit làm thay đổi số khơng nhiều: N ngàn logN số 10, 10 số 2; N triệu, logN nhân gấp đôi Bất N nhân đôi, logN tăng lên thêm số, logN không bị nhân gấp N tăng tới N2 N: Khi thời gian chạy chương trình tuyến tính, nói chung trường hợp mà số lượng nhỏ xử lý làm cho phần tử liệu nhập Khi N triệu thời gian chạy cỡ Khi N nhân gấp đơi thời gian chạy nhân gấp đôi Đây tình tối ưu cho thuật tốn mà phải xử lý N liệu nhập (hay sản sinh N liệu xuất) NlogN: Đây thời gian chạy tăng dần lên cho thuật toán mà giải tốn cách tách thành tốn nhỏ hơn, giải chúng cách độc lập sau tổ hợp lời giải Bởi thiếu tính từ tốt (có lẻ "tuyến tính logarit"?), nói thời gian chạy thuật toán "NlogN" Khi N triệu, NlogN có lẽ khoảng hai mươi triệu Khi N nhân gấp đôi, thời gian chạy bị nhân lên nhiều gấp đôi (nhưng không nhiều lắm) N2: Khi thời gian chạy thuật toán bậc hai, trường hợp nầy có ý nghĩa thực tế cho toán tương đối nhỏ Thời gian bình phương thường tăng dần lên thuật tốn mà xử lý tất cặp phần tử liệu (có thể hai vịng lặp lồng nhau) Khi N ngàn thời gian chạy triệu Khi N nhân đơi thời gian chạy tăng lên gấp bốn lần N3:Tương tự, thuật toán mà xử lý ba phần tử liệu (có lẻ ba vịng lặp lồng nhau) có thời gian chạy bậc ba có ý nghĩa thực tế toán nhỏ Khi N trăm thời gian chạy triệu Khi N nhân đôi, thời gian chạy tăng lên gấp tám lần 2N: Một số thuật tốn có thời gian chạy lũy thừa lại thích hợp số trường hợp thực tế, thuật tốn "sự ép buộc thơ bạo" để giải tốn Khi N hai mươi thời gian chạy triệu Khi N gấp đôi thời gian chạy nâng lên lũy thừa hai! Thời gian chạy chương trình cụ thể đơi hệ số nhân với số hạng nói ("số hạng dẫn đầu") cộng thêm số hạng nhỏ Giá trị hệ số số hạng phụ thuộc vào kết phân tích chi tiết cài đặt Hệ số số hạng dẫn đầu liên quan tới số thị bên vòng lặp: tầng tùy ý thiết kê thuật tốn phải cẩn thận giới hạn số thị Với N lớn số hạng dẫn đầu đóng vai trị chủ chốt; với N nhỏ số hạng đóng góp vào so sánh thuật tốn khó khăn Trong hầu hết trường hợp, gặp chương trình có thời gian chạy "tuyến tính", "NlogN", "bậc ba", với hiểu ngầm phân tích hay nghiên cứu thực tế phải làm trường hợp mà tính hiệu quan trọng Sau bảng giá trị số hàm đó: CÁC QUY TẮC XÁC ĐỊNH ĐỘ PHỨC TẠP GIẢI THUẬT + Qui tắc cộng: Giả sử T1(n) T2(n) thời gian thực hai đoạn chương trình P1 P2 mà : T1(n) = O(f(n)); T2 = (O(g(n)) thời gian thực P1 P2 : T1(n) + T2(n) = O(max (f(n), g(n)) Ví dụ : Trong chương trình có bước thực mà thời gian thực bước O(n2), O(n3) O(nlog2n) thời gian thực bước đầu O(max(n2, n3)) = O(n3) Thời gian thực chương trình O(max(n3, nlog2n)) = O(n3) Chú ý : Nếu g(n) ≤ f(n) với n ≥ n0 O(f(n)+g(n)) O(f(n)) VD : O(n4 + n2) = O(n4); O(n + log2n) = O(n) + Qui tắc nhân: Nếu T1(n) T2(n) thời gian thực đoạn chương trình P1 P2 (T1(n) = O(f(n)); T2 = (O(g(n))); thời gian thực P1 P2 lồng là: T1(n)T2(n) = O(f(n)g(n)); Ví dụ: Câu lệnh For( i = ,i < n , i++) x = x + 1; có thời gian thực O(n.1) = O(n) Câu lệnh For( i = 1, i

Ngày đăng: 14/08/2016, 15:16

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

TÀI LIỆU LIÊN QUAN

w