Gọi n là số phần tử dữ liệu hay còn gọi là kích thước của bài toánVới hai hay nhiều thuật toán cùng giải quyết một bài toán, ta sẽ nhận rõ thuật toán nào tốt hơn khi kích thước của bài t
Trang 1Gọi n là số phần tử dữ liệu (hay còn gọi là kích thước của bài toán)
Với hai (hay nhiều) thuật toán cùng giải quyết một bài toán, ta sẽ nhận rõ thuật toán nào tốt hơn khi kích thước của bài toán là một con số vô cùng lớn Tức là n tiến về vô cực (n -> ∞ )
Ký hiệu Ô-lớn (Big-O):
Xét hàm: f,g: IN->IR
Ta viết f=O(g) nếu:
Tồn tại n0,k∈N sao cho
|f(n)| <= k|g(n)| ∀n>=n0
(đọc là f nhỏ thua g)
Ví dụ 1:
Cho f(n)=20000n2
và g(n)=n3
Hỏi “f có nhỏ thua g” hay không?
Giải
Xét bất đẳng thức:
20000n2 <= n3
20000<=n ∀n>=20000
Vậy |f(n)|<= 1.|g(n)| ∀n>=20000
Hay |f(n)|<= k.|g(n)| ∀ n>=n0 (với k=1 và n0 =20000)
Hoặc nói cách khác: |f(n)|<= k.|g(n)| ∀ n>=n0 (với k=20000 và n0 =1)
Do đó ta có thể kết luận: f=O(g) (f nhỏ thua g)
Ví dụ 2:
Cho f(n)=n3+1
và g(n)=20n3+n+7
Hỏi “f có nhỏ thua g” hay không?
Giải
Xét bất đẳng thức:
n3+1<=20n3+n+7
0 <= 19n3+n+6 khi n>=1
Suy ra: |f(n)| <= k.|g(n)| ∀n>=n0 (với k=1 và n0 =1)
Kết luận: f nhỏ thua g
Viết là f=O(g)
Trang 2- Các lệnh ảnh hưởng chủ yếu đến tốc độ thực hiện trong máy tính của một thuật toán là: lệnh gán và lệnh so sánh
- Sau khi đếm tổng số lệnh gán và lệnh so sánh của một thuật toán, ta quy nó
về Big-O để làm căn cứ đánh giá thuật toán nào tốt hơn
Ví dụ 3:
Đếm tổng số lệnh gán và lệnh so sánh của đoạn mã sau rồi tìm Big-O của nó khi n tiến về vô cực
S=0; //1 lệnh gán
i=0; //1 lệnh gán
while(i<n) //n+1 lệnh so sánh
{
S=S+i; //n lệnh gán
i=i+1; //n lệnh gán
}
Tổng số lệnh gán và lệnh so sánh của đoạn mã trên là:
1+1+(n+1)+n+n=3n+3
Gọi f(n)=3n+3
Và gọi g(n)=n
Xét bất đẳng thức:
3n+3 <=4n
3<=n ∀n>=3
Vậy |f(n)| <= k.|g(n)| ∀n>=n0 (với k=4 và n0=3)
Kết luận: 3n+3=O(n)
Vậy độ phức tạp của thuật toán của đoạn mã trên là O(n)
Nếu có hai (hay nhiều) thuật toán cùng để giải một bài toán thì người ta so sánh các Big-O của các thuật toán để chọn thuật toán tốt hơn