You are on page 1of 8

2 CÁCH XÁC ĐỊNH ĐỘ PHỨC TẠP CỦA THUẬT TOÁN

O lớn:
Là hàm tiệm cận tính độ phức tạp của thuật toán kí hiệu là O(n)
Giả sử T(n) là thời gian thực hiện một thuật toán nào đó và
f(n),g(n),h(n) là các hàm xác định dương với mọi n.
Hàm Olớn :O(g(n)) nếu tồn tại các hàng số c và n0 sao cho T(n)<=
c.g(n) với mọi n>= n0 ,hàm g(n) được gọi là giới hạn trên của hàm
T(n).
Xác định độ phức tạp :
Quy tắc bỏ hằng số:
T(n) = O(c.f(n)) = O(f(n)) với c là một hằng số
dương
Quy tắc lấy max:
T(n) = O(f(n)+ g(n)) = O(max(f(n), g(n)))
 Quy tắc cộng:
T1(n) = O(f(n))                     T2(n) = O(g(n))

T1(n) + T2(n) = O(f(n) + g(n))


Quy tắc nhân:
Đoạn chương trình có thời gian thực hiện
T(n)=O(f(n))
Ví dụ 1 : Thuật toán nổi bọt

Void Sort( int a[],int n)


{ Độ phức tạp :
int i, j ,temp;
(4)(5)(6) độ phức tạp là O(1)
(1) for(i=0; i<=n-2;i++)
(3) có độ phức tạp là O(1)
(2) for(j=n-1; j>=i+1;j--)
(3) if(a[j] < a[j-1]) (2)vòng lăp (n-1)-(i+1)+1=n-i-1 lần
{ có độ phức tạp O(n-i-1)
(4) temp=a[j-1];
(5) a[j-1]=a[j];
=>T(n)=
(6) a[j] = temp;
SLIDESMANIA.C

}
}
Ví dụ 2
Thuật toán tìm kiếm tuần tự :
int search(int x,int a[],int n)
{ Độ phức tạp
int i; (1)(2)(7) có độ phức tạp là O(1)
int found; (5)(6) có độ phức tạp là O(1)
(1) i=0; Suy ra (4) có độ phức tạp O(1)
(2) found = 0; Trong trường hợp xấu nhất (3)
(3) while(i <=n-1 && !found) thực hiện n lần

(4) if (x==a[i]) =>(3) :O(n)

(5) found = 1; Lấy max: T(n)=O(n)

(6) else i++;


(7) return found;
}
Ví dụ 3
Tính  ex
ex  = 1 + ( x/1!) + (x*x/2!) + (x*x*x/ 3!) + … + (xn /n!)
Thuật giải 1:
double SumDevideFactorial(int n)
{
double S = 1;
double p = 1;
for(int i = 0; i < n; i++)
{
for(int j = 0;  j < i;  j++)
{
p = p*x/ j;
S += p;
}
}
return S;
}
Theta và Omega

Tương tự như Big O, nếu như tìm được các hằng


số C, k1, k2 đều dương, không phụ thuộc vào n,
sao cho với các số n đủ lớn, các hàm R(n), f(n) và
h(n) đều dương và R(n) >= C.f(n) va k1.h(n) =<
R(n) <= k2.h(n) thì ta nói thuật toán có độ phức
tạp cỡ lớn hơn Omega(f(n)) và đúng bằng cỡ
Theta(h(n))
Chúng ta có thể hiểu Big(O), Omega, Theta như
những hàm tiềm cận của hàm tính độ phức tạp
của thuật toán.
Độ phức tạp của máy Turning

Đối với máy Turing, độ phức tạp thời gian đề cập đến số
đo số lần băng di chuyển khi máy được khởi tạo cho một
số ký hiệu đầu vào và độ phức tạp không gian là số ô của
băng được viết.
Thời gian phức tạp tất cả các chức năng hợp lý -
T(n) = O(n log n)

You might also like