SVTH: Trương Hữu Hòa - 18CNTT3 SLIDESMANIA. Nội dung chính Nội dụng chính gồm những yêu cầu sau : 1. Trình bày cụ thể độ phức tạp củra thuật toán. 2. Trình bày các cách xác định độ phức tạp của thuật toán. Mỗi cách xác định ít nhất 3 ví dụ minh họa. 3. Trình bày độ phức tạp của máy turing SLIDESMANIA. 1. Độ phức tạp thuật toán SLIDESMANIA. Độ phức tạp của thuật toán là thước đo thời gian một thuật toán sẽ mất để hoàn thành một đầu vào có kích thước n. Nếu một thuật toán phải mở rộng quy mô, thì nó sẽ tính toán kết quả trong một giới hạn thời gian hữu hạn và thực tế ngay cả đối với các giá trị lớn của n. Vì lý do này, độ phức tạp được tính theo tiệm cận khi n tiến đến vô cùng. Trong khi độ phức tạp thường là theo thời gian, đôi khi độ phức tạp cũng được phân tích theo không gian, điều này SLIDESMANIA.
chuyển sang yêu cầu bộ nhớ của thuật toán.
2. Xác định độ phức tạp thuật toán SLIDESMANIA. Cách XÁC ĐỊNH ĐỘ PHỨC TẠP thuật toán
● Độ phức tạp tính toán của giải thuật: O(f(n))
● Việc xác định độ phức tạp tính toán của giải thuật trong thực tế có thể tính bằng một số quy tắc đơn giản sau: SLIDESMANIA. - Quy tắc bỏ hằng số : - Quy tắc cộng : T(n) = O(c.f(n)) = O(f(n)) với c là một hằng số T1(n) = O(f(n)) T2(n) = O(g(n)) dương T1(n) + T2(n) = O(f(n) + g(n))
- Quy tắc nhân :
- Quy tắc lấy max : Đoạn chương trình có thời gian thực hiện T(n) = O(f(n)+ g(n)) = O(max(f(n), g(n))) T(n)=O(f(n)) Nếu thực hiện k(n) lần đoạn chương trình với k(n) = O(g(n)) thì độ phức tạp sẽ là O(g(n).f(n)) SLIDESMANIA. PHÉP TOÁN TÍCH CỰC (BEST PROXY) Trong một thuật toán, ta chú ý đặc biệt đến một phép toán gọi là phép toán tích cực. Đó là phép toán mà số lần thực hiện không ít hơn các phép toán khác. Ví dụ 1 //Sử dụng quy tắt max và quy tắt bỏ hằng số: s = 0; for (i=0; i<=n;i++) ( p =1; for (j=1;j<=i;j++) p=p * x / j; s = s+p; ) Phép toán tích cực là p = p * x / j Số lần thực hiện phép toán này là 0+1+2+…+n = n(n-1)/2 = n2/2 – n/2 SLIDESMANIA.
=> Vậy độ phức tạp là O(n2/2 – n/2)
= O(n2/2) sử dụng quy tắc lấy max = O(n2) sử dụng quy tắc bỏ hằng số Ví dụ 2: Sử dụng quy tắc Ví dụ 3: sử dụng quy tắc nhân: nhân : for (i= 1; i<=n; i++) for (i= 1; i<=n; i++) for (j= 1; j<=n; j++) for (j= 1; j<=m; j++) //Lệnh //Lệnh => Dùng quy tắc nhân ta có => Dùng quy tắc nhân ta có O(n^2) O(n*m) tương tự như vậy ta sẽ có O(n^3), O(n^4). SLIDESMANIA. Ví dụ 4: Sử dụng quy tắc cộng và quy tắc lấy max: for (i= 1;i<=n;i++) //lệnh1 for (j= 1;j<=m;j++) //lệnh 2 => Dùng quy tắc cộng và quy tắc lấy max, sẽ có O(max (n,m)) SLIDESMANIA. 3. Độ phức tạp của máy SLIDESMANIA.
Turing A, Độ phức tạp của thuật toán trong máy turing
- Để đánh giá hiệu quả của một thuật toán, ta có thể
đánh giá độ phức tạp của thuật toán về mặt thời gian, tức là thời gian máy tính làm việc và về không gian, tức là dung lượng bộ nhớ của máy tính cần thiết để thực hiện thuật toán, khi nói đến độ phức tạp của thuật toán ta luôn hiểu là độ phức tạp về thời gian. SLIDESMANIA. B, Độ phức tạp về thời gian Thời gian làm việc của máy tính khi chạy một thuật toán nào đó không chỉ phụ thuộc vào thuật toán, mà còn phụ thuộc vào máy tính được sử dụng. Vì thế, để có một tiêu chuẩn chung, ta sẽ đo độ phức tạp của một thuật toán bằng số các phép tính phải thực hiện. Khi thực hiện cùng một thuật toán, số các phép tính phải thực hiện còn phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào. Vì thế, độ phức tạp của thuật toán sẽ là một hàm số phụ thuộc độ lớn của đầu vào. Trong những ứng dụng thực tiễn, chúng ta không cần biết chính xác hàm này, mà chỉ cần biết “cỡ” của chúng, tức là cần có một ước lượng đủ tốt của chúng. SLIDESMANIA. Cảm ơn thầy và các bạn đã lắng nghe bài báo cáo của em SLIDESMANIA.