• Nhằm xác định thời gian chạy (độ phức tạp) của thuật toán dưới dạng một hàm f của kích thước đầu vào n.. − VD: Thời gian tìm tuần tự một phần tử x trong một dãy n phần tử là f(n) = n[r]
(1)Phân tích thuật tốn
Nguyễn Mạnh Hiển
(2)Nội dung
1 Phân tích thuật tốn gì? 2 Các ký hiệu tiệm cận
3 Tốc độ tăng hàm
(3)(4)Phân tích thuật tốn
• Nhằm xác định thời gian chạy (độ phức tạp) thuật toán dạng hàm f kích thước đầu vào n
− VD: Thời gian tìm phần tử x dãy n phần tử f(n) = n
• Đơn vị thời gian:
− Không phải giờ, phút, giây
− Mà thao tác bản, VD: cộng, nhân, so sánh
(5)Đếm số thao tác bản
• Nhận diện thao tác thuật tốn
• Xác định thao tác T chiếm nhiều thời gian chạy so với thao tác lại
− Thao tác T thường xuất vịng lặp • Đếm số lần thực thao tác T, thu hàm thời
(6)Ví dụ đếm số thao tác bản Ví dụ 1: In phần tử (C++)
for (i = 0; i < n; i++) cout << a[i] << endl;
Ví dụ 3: Kiểm tra tính xếp (C++) template <class T>
bool isSorted(T *a, int n) {
bool sorted = true;
for (int i=0; i<n-1; i++) if (a[i] > a[i+1])
sorted = false; return sorted;
}
Số lần in hình = n
Số phép so sánh = n – 1
Có thể cải tiến thuật tốn bên trên?
Ví dụ 2: Nhân ma trận tam giác với véctơ (mã giả)
for i to n ci
for i to n for j to i
ci ci + aij * bj
(7)(8)Phân tích tiệm cận
• Nhằm xem xét tốc độ tăng trưởng hàm f(n) n dần tới +
• Cho phép quy dạng hàm f(n) khác vài dạng (như log n, n, n2), từ giúp so sánh thời gian chạy thuật tốn dễ dàng hơn
• Có cách phân tích tiệm cận tương ứng với ba ký hiệu tiệm cận sau đây:
− Ô lớn: O tìm cận f(n)
− Ơ-mê-ga lớn: tìm cận f(n)
(9)Ký hiệu O
f(n) = O(g(n))
khi c > n0 > cho f(n) cg(n) n n0
f(n) cg(n)
n0
(10)Ký hiệu
f(n) = (g(n))
khi c > n0 > cho cg(n) f(n) n n0
f(n) cg(n)
n0