Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 4: Phân tích các thuật toán cung cấp cho người học các kiến thức: Tính hiệu quả của thuật toán, thời gian chạy, phương pháp đánh giá, phương pháp thực nghiệm,... Mời các bạn cùng tham khảo nội dung chi tiết.
Bài Phân tích thuật tốn (Analysis of Algorithms) 3/6/2020 Phân tích thuật tốn Thuật tốn qui trình thực bước, bước giải vấn đề khoảng thời gian hữu hạn 3/6/2020 Phân tích thuật tốn Từ tốn đến chương trình 3/6/2020 Phân tích thuật tốn Tính hiệu thuật toán Thuật toán đơn giản, dễ hiểu Thuật toán dễ cài đặt Thuật tốn cần nhớ Thuật tốn chạy nhanh Khi cài đặt thuật toán để sử dụng số lần ưu tiên tiêu chí Khi cài đặt thuật toán mà sử dụng nhiều lần, nhiều chương trình khác nhau: xếp, tìm kiếm, đồ thị… ưu tiên tiêu chí 3/6/2020 Phân tích thuật tốn Các khía cạnh cần phân tích Bộ nhớ (Space) Xác định tổng dung lượng nhớ cần thiết để lưu trữ toàn liệu đầu vào, trung gian kết đầu Ví dụ: Sắp xếp dãy n phần tử Bộ nhớ cần cho toán là: Bộ nhớ lưu biến n, lưu n phần tử dãy, lưu biến i, j, tg (nếu thuật toán Bubble Sort) Thời gian chạy thuật tốn (Running time) 3/6/2020 Phân tích thuật tốn Thời gian chạy (Running time) Hầu hết thuật toán thực biến đổi đối tượng đầu vào thành đối tượng đầu Thời gian chạy thuật đặc trưng kích thước liệu đầu vào Chúng ta thường đánh giá thời gian chạy thuật toán trường hợp: xấu nhất, trung bình tốt Thời gian chạy trung bình thuật tốn thường khó xác định Chúng ta tập trung vào phân tích thời gian chạy trường hợp xấu (do dễ phân tích) 3/6/2020 Phân tích thuật tốn Thời gian chạy (Running time) 3/6/2020 Phân tích thuật tốn Phương pháp đánh giá Phương pháp thực nghiệm Phương pháp phân tích lý thuyết 3/6/2020 Phân tích thuật tốn Phương pháp thực nghiệm Các bước thực hiện: Viết chương trình thể thuật tốn Chạy chương trình với liệu đầu vào có kích thước khác tổng hợp lại Sử dụng hàm đồng hồ để lấy xác thời gian chạy thuật toán Vẽ đồ thị biểu diễn kết 3/6/2020 Phân tích thuật tốn Hạn chế phương pháp thực nghiệm Cần phải cài đặt thuật tốn ngơn ngữ lập trình, số thuật tốn việc cài đặt khó Kết thu biểu thị cho liệu đầu vào chưa thực nghiệm Phụ thuộc chương trình dịch Phụ thuộc vào phần cứng máy tính Phụ thuộc kỹ người lập trình 3/6/2020 Phân tích thuật tốn 10 Thuật tốn độ phức tạp bình phương Tổng số phép toán tối đa thuật toán thực là: T(n) = 4(1+2+…+(n-1))+10n+4 T(n) = 4(1+2+…+n) + 6n+4 Tổng n số nguyên đầu n(n+1)/2 - Hình bên minh họa tốc độ gia tăng thời gian tnực thuật tốn T(n) = 2n2+ 8n+4 3/6/2020 Phân tích thuật toán 34 Thời gian chạy thuật toán Thời gian chạy thuật toán prefixAverages1 là: O(2n2+ 8n+4) Do thuật tốn prefixAveragres1 có thời gian chạy O(n2) 3/6/2020 Phân tích thuật tốn 35 Thuật tốn độ phức tạp bậc (tuyến tính) Thuật tốn mô tả sau: Algorithm prefxAverage(X, n) Input: mảng X có n số ngun Output: Mảng trung bình phần tử đầu dãy X A new int[n]; s 0; for i 0 to n-1 s s + X[i]; A[i] s/(i+1); return A; n n+3 3n 4n Tổng số phép toán tối đa cần phải thực T(n) = 9n + Độ phức tạp tiệm cận thuật tốn prefixAverages2 O(n) 3/6/2020 Phân tích thuật tốn 36 Xác định độ phức tạp thuật tốn • Qui tắc cộng Nếu thuật toán thực hai đoạn chương trình P1, P2 rời có độ phức tạp tương ứng O(g(n)) O(f(n)) Khi độ phức tạp thuật toán là: T(n) = O(max{g(n),f(n)}) • Ví dụ: for i = to n input a[i]; P1 có thời gian chạy O(n) Min a[0]; P2 có thời gian chạy O(1) for i=1 to n-1 if a[i]