intTypePromotion=1

Bài giảng Phân tích thiết kế và giải thuật - Chương 1: Kỹ thuật phân tích giải thuật

Chia sẻ: Minh Nhân | Ngày: | Loại File: PDF | Số trang:59

0
6
lượt xem
1
download

Bài giảng Phân tích thiết kế và giải thuật - Chương 1: Kỹ thuật phân tích giải thuật

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng "Phân tích thiết kế và giải thuật - Chương 1: Kỹ thuật phân tích giải thuật" cung cấp cho người học các kiến thức: Tại sao cần phải phân tích giải thuật, tiêu chuẩn đánh giá giải thuật, phương pháp đánh giá. Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Phân tích thiết kế và giải thuật - Chương 1: Kỹ thuật phân tích giải thuật

  1. KỸ THUẬT PHÂN TÍCH GIẢI THUẬT 1
  2. • Tại sao cần phải phân tích giải thuật ? • Tiêu chuẩn đánh giá giải thuật • Phương pháp đánh giá • Bài tập 2
  3. • Với phần lớn các bài toán, thường có nhiều giải thuật khác nhau để giải một bài toán. • Làm cách nào để chọn giải thuật tốt nhất để giải một bài toán? • Làm cách nào để so sánh các giải thuật cùng giải được một bài toán? => Cần đánh giá giải thuật để lựa chọn giải thuật tốt nhất. 3
  4. • Đánh giá giải thuật - Tính đúng đắn • Chạy trên dữ liệu thử • Chứng minh lý thuyết (bằng toán học chẳng hạn) - Tính đơn giản -> Thường chỉ sử dụng vài lần - Tính nhanh chóng (thời gian thực thi) • Quan trọng khi chương trình được thực thi nhiều lần, chương trình có khối lượng dữ liệu nhập lớn. • Hiệu quả thời gian thực thi 4
  5. • Đo thời gian thực hiện chương trình - Lập trình và đo thời gian thực hiện - Phụ thuộc vào tập lệnh của máy tính - Kỹ năng của người lập trình - Dữ liệu đầu vào Tính độ phức tạp thời gian thực hiện của giải thuật = độ đo sự thực thi của giải thuật  Độ phức tạp thời gian thực hiện của giải thuật thường được tính trong trường hợp xấu nhất. 5
  6. • Đo thời gian thực hiện: - Thời gian thực hiện một chương trình là một hàm của kích thước dữ liệu vào, ký hiệu T(n). - Hàm T(n) ≥ 0  n  0, với n là kích thước (độ lớn) của dữ liệu đầu vào - Ví dụ: Chương trình tính tổng của n số có thời gian thực hiện là T(n) = cn trong đó c là một hằng số. • Đơn vị đo thời gian thực hiện - Đơn vị tính: số lệnh cơ bản, số chỉ thị, … - Ví dụ: Khi ta nói thời gian thực hiện của một chương trình là T(n) = Cn thì có nghĩa là chương trình ấy cần Cn chỉ thị thực thi. 6
  7. • Thời gian thực hiện chương trình không chỉ phụ thuộc vào kích thước mà còn phụ thuộc vào tính chất của dữ liệu vào. • Dữ liệu vào có cùng kích thước nhưng thời gian thực hiện chương trình có thể khác nhau. - Ví dụ: chương trình sắp xếp dãy số nguyên tăng dần. Nhập vào dãy số nguyên. => Dãy số nhập vào có thể: có thứ tự, chưa có thứ tự, có thứ tự tăng hoặc có thứ tự giảm. => Thời gian thực hiện trong các trường hợp: tốt nhất, xấu nhất, trung bình 7
  8. • Tỷ suất tăng (growth rate): -T(n) có tỷ suất tăng f(n) nếu tồn tại hằng C > 0 và n0 sao cho T(n)  Cf(n) n  n0 - Cho một hàm không âm T(n), luôn tồn tại tỷ suất tăng f(n) của nó - Ví dụ: T(0) = 1, T(1) = 4, T(n) = (n+1)2, Đặt n0 = 1 và c = 4 thì với mọi n ≥ 1, ta có T(n) = (n+1)2 ≤ 4n2 với mọi n ≥ 1, => Tỷ suất tăng của T(n) là n2. 8
  9. • Ví dụ: chứng minh rằng: Tỷ suất tăng của T(n) = 3n3 + 2n2 là n3 Giải – Chọn n0 = 0 và C = 5 với mọi n ≥ 0, ta có 3n3 + 2n2 ≤ 5n3 Tỷ suất tăng của T(n) là n3. • Quy tắc: T(n) là đa thức của n thì tỷ suất tăng là bậc cao nhất của n 9
  10. • Cho 2 giải thuật - P1 có T1(n) = 100n2  tỷ suất tăng là n2 - P2 có T2(n) = 5n3  tỷ suất tăng là n3 Giải thuật nào chạy nhanh hơn ?  phụ thuộc vào kích thước dữ liệu vào. Xét nếu n  20 thì T1(n) > T2(n) Xét nếu n  20 thì T1(n)  T2(n)  So sánh tỷ suất tăng hơn là so sánh trực tiếp các hàm T(n) 10
  11. • Ký hiệu Ô lớn (big O) – Nếu T(n) có tỷ suất tăng f(n) -> T(n) có độ phức tạp là f(n) và ký hiệu là O(f(n)), đọc là “ô của f(n)”. • Ví dụ: T(n) = (n + 1)2 có tỷ suất tăng là n2 nên hàm T(n) có độ phức tạp O(n2) • Tính chất – O(cf(n)) = O(f(n)), c: hằng số – O(C) = O(1) • Độ phức tạp của giải thuật: hàm chặn trên của thời gian • Một số hàm thể hiện độ phức tạp thường gặp: log2n, n, nlog2n, n2, n3, 2n, n!, nn. 11
  12. n2 NlogN N logN 12
  13. • Các hàm: log2n, n, nlog2n gọi là hàm đa thức • Ba hàm cuối cùng: 2n, n!, nn gọi là dạng hàm mũ, • Nhận xét: – Một giải thuật mà thời gian thực hiện có độ phức tạp là một hàm đa thức thì chấp nhận được tức là có thể cài đặt để thực hiện – Các giải thuật có độ phức tạp hàm mũ thì phải tìm cách cải tiến giải thuật 13
  14. • Khi nói đến độ phức tạp của giải thuật là ta muốn nói đến hiệu quả của thời gian thực hiện của chương trình nên ta có thể xem việc xác định thời gian thực hiện của chương trình chính là xác định độ phức tạp của giải thuật. 14
  15. • Cho 2 chương trình: - P1 có thời gian thực hiện T1(n) = O(f1(n)) - P2 có thời gian thực hiện T2(n) = O(f2(n)) • Quy tắc cộng: - Thời gian thực thi P1 và P2 nối tiếp nhau sẽ là: + T(n) = T1(n) + T2(n) = O(max(f1(n), f2(n)) - Ví dụ: + Lệnh gán x:=15 tốn một hằng thời gian hay O(1) + Lệnh đọc dữ liệu READ(x) tốn một hằng thời gian hay O(1) Vậy thời gian thực hiện cả hai lệnh trên nối tiếp nhau là O(max(1,1))=O(1) 15
  16. • Quy tắc nhân: – Thời gian thực thi P1 và P2 lồng nhau (vd: vòng lặp lồng nhau chẳng hạn): • T(n) = T1(n) x T2(n) = O(f1(n) x f2(n)) – Ví dụ: for (i=1; i
  17. • Quy tắc tổng quát: - Đọc (read, scanf), - Ghi (write, printf),  Thời gian là hằng số hay O(1) - Lệnh gán, so sánh: - Lệnh if:  Thường thời gian kiểm tra điều kiện là O(1) if (điều kiện) lệnh 1 else  max (lệnh 1, lệnh 2) + điều kiện lệnh 2 17
  18. - Vòng lặp: Tổng thời gian thực hiện thân vòng lặp + Trong trường hợp không xác định được số lần lặp ta phải lấy số lần lặp trong trường hợp xấu nhất. + Nếu thời gian thực hiện thân vòng lặp không đổi thì thời gian thực hiện vòng lặp là tích của số lần lặp với thời gian thực hiện thân vòng lặp. 18
  19. • Phương pháp thực hiện: - Xác định đầu vào: thường ký hiệu là n - Cách 1: dùng cho tất cả các loại chương trình + Tính thời gian thực hiện T(n) cho toàn bộ chương trình  O(f(n)) từ T(n) - Cách 2: không áp dụng cho chương trình đệ quy + Chia chương trình nhiều đoạn nhỏ + Tính T(n) và O(f(n)) cho từng đoạn + Áp dụng quy tắc cộng, quy tắc nhân để có O(f(n)) cho cả chương trình 19
  20. • Ví dụ : Tính thời gian thực hiện của đoạn chương trình sắp xếp “nổi bọt” procedure Bubble (var a: array[1..n] of integer); var i,j,temp: integer; 4) Vòng lặp {1} lặp (n-1) lần begin 3) Vòng lặp {2} thực hiện (n-i) lần, {1} for i:=1 to n-1 do mỗi lần O(1),  do đó vòng lặp {2} {2} for j:=n downto i+1 do tốn O((n-i).1)=O(n-i). {3} if a[j-1]>a[j] then begin { đổi chổ a[i], a[j] } {4} temp:=a[j-1]; {5} a[j-1]:=a[j]; 2) do đó lệnh {3} tốn O(1). {6} a[j]:=temp; end; 1) Cả ba lệnh đổi chỗ {4} {5} {6} end; tốn O(1) thời gian 20
ADSENSE
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2