BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
Giáo viên:
Gmail: thayhuetnh@gmail.com
SĐT, Zalo: 0382.1682.32
Blog: thayhuetnh.blogspot.com
1
Chương II: CÁC KHÁI NIỆM VỀ THUẬT TOÁN VÀ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
I. Lựa chọn thuật toán
II. Độ phức tạp của thuật toán.
A. Độ phức tạp không gian (bộ nhớ lưu trữ)
B. Độ phức tạp tính toán (thời gian)
1. Đánh giá thời gian thực hiện thuật toán
2. Xác định độ phức tạp tính toán của thuật toán
3. Một số hàm ký hiệu độ phức tạp thuật toán.
4. Các quy tắc đánh giá thời gian thực hiện thuật toán
5. Một số ví dụ
2
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
I. Lựa chọn thuật toán
- Khi giải một bài toán, chúng ta cần chọn trong số các thuật toán một thuật toán mà chúng ta cho là “tốt” nhất.
- Vậy dựa trên cơ sở nào để đánh giá thuật toán này “tốt” hơn thuật toán kia?
- Thông thường ta dựa trên hai tiêu chuẩn sau:
a. Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương trình).
b. Thuật toán hiệu quả: Chúng ta thường đặc biệt quan tâm đến thời gian thực hiện của thuật toán (gọi là độ phức tạp tính toán), bên cạnh đó chúng ta cũng quan tâm tới dung lượng không gian nhớ cần thiết để lưu giữ các dữ liệu vào, ra và các kết quả trung gian trong quá trình tính toán.
3
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
I. Lựa chọn thuật toán
- Có nhiều ý kiến cho rằng: Kỹ thuật máy tính tiến bộ rất nhanh, ngày nay các máy tính lớn có thể đạt tốc độ tính toán hàng nghìn tỉ phép tính trong một giây. Vậy có cần phải tìm thuật toán hiệu quả với thời gian thực hiện thuật toán thấp hay không?
Ví dụ: một CPU có tốc độ xung nhịp 3.2 GHz thực hiện 3.2 tỷ chu kỳ mỗi giây. (Các CPU cũ hơn có tốc độ được đo bằng megahertz, hoặc hàng triệu chu kỳ mỗi giây.)
4
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
I. Lựa chọn thuật toán
- Chúng ta xem lại ví dụ bài toán kiểm tra tính nguyên tố của một số nguyên dương n (n ≥ 1).
- Đoạn code minh họa:
bool ktsnt(){
for (int i = 2; i <= n-1; i++){
if (n % i == 0)
return 0;//n không là nguyên tố
}
return 1;//n là nguyên tố
}
- Nếu n là một số nguyên tố chúng ta phải mất n - 2 phép toán %.
- Để kiểm tra số nguyên N có 25 chữ số mất bao nhiêu thời gian?
5
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
6
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
7
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
https://codelearn.io/sharing/do-phuc-tap-cua-thuat-toan-va-lua-chon-cach-giai-thuat
https://vnoi.info/wiki/translate/topcoder/Computational-Complexity-Section-1.md
A. Độ phức tạp không gian (bộ nhớ lưu trữ)
- Độ phức tạp không gian của một thuật toán hoặc một chương trình máy tính là lượng không gian bộ nhớ cần thiết để giải quyết một trường hợp của bài toán tính toán dưới dạng một hàm của các đặc tính của đầu vào.
- Độ phức tạp không gian được đo bằng cách sử dụng ký hiệu tương tự như độ phức tạp thời gian, nhưng chúng ta xem xét tổng phân bổ bộ nhớ được yêu cầu, liên quan đến kích thước của dữ liệu đầu vào.
8
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
- Để giải một bài toán không chỉ có một giải thuật. Chọn một giải thuật đưa tới kết quả nhanh nhất là một đòi hỏi thực tế.
-Thời gian thực hiện 1 giải thuật bằng chương trình máy tính phụ thuộc vào rất nhiều yếu tố:
Một yếu tố cần chú ý đó là kích thước của dữ liệu đưa vào. Dữ liệu càng lớn thì thời gian xử lý càng chậm, chẳng hạn như thời gian sắp xếp một dãy số phải chịu ảnh hưởng của số lượng các số thuộc dãy số đó. Nếu gọi n là kích thước dữ liệu đưa vào thì thời gian thực hiện của một giải thuật có thể biểu diễn một cách tương đối như một hàm của n: T(n).
9
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
- Phần cứng máy tính, ngôn ngữ viết chương trình và chương trình dịch ngôn ngữ ấy đều ảnh hưởng tới thời gian thực hiện. Những yếu tố này không giống nhau trên các loại máy, vì vậy không thể dựa vào chúng khi xác định T(n).
- Tức là T(n) không thể biểu diễn bằng đơn vị thời gian: giờ, phút, giây được. Tuy nhiên, không phải vì thế mà không thể so sánh được các giải thuật về mặt tốc độ.
- Nếu như thời gian thực hiện một giải thuật là T1 = n2 và thời gian thực hiện giải thuật khác là T2 (n) = 100n thì khi n đủ lớn, thời gian thực hiện giải thuật T2 nhanh hơn T1 .
Ví dụ: N=10000; T1=100 000 000 T2=1 000 000
10
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
>
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
- Khi đó, nếu nói rằng thời gian thực hiện giải thuật tỉ lệ thuận với n hay tỉ lệ thuận với n2 cũng cho ta một cách đánh giá tương đối về tốc độ thực hiện của giải thuật đó khi n khá lớn. Cách đánh giá thời gian thực hiện giải thuật độc lập với máy tính và các yếu tố liên quan tới máy tính như vậy sẽ được gọi là độ phức tạp của thuật toán.
🡪 độ phức tạp của thuật toán có thời gian thực hiện T(n)
11
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
1. Đánh giá thời gian thực hiện thuật toán
- Có hai cách tiếp cận để đánh giá thời gian thực hiện của một thuật toán:
+ Cách thứ nhất: bằng thực nghiệm, chúng ta viết chương trình và cho chạy chương trình với các dữ liệu vào khác nhau trên một máy tính.
+ Cách thứ hai: bằng phương pháp lí thuyết, chúng ta coi thời gian thực hiện thuật toán như hàm số của cỡ dữ liệu vào (cỡ của dữ liệu vào là một tham số đặc trưng cho dữ liệu vào, nó có ảnh hưởng quyết định đến thời gian thực hiện chương trình)
12
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
1. Đánh giá thời gian thực hiện thuật toán
Ví dụ đối với bài toán kiểm tra số nguyên tố thì cỡ của dữ liệu vào là số n cần kiểm tra; hay với bài toán sắp xếp dãy số, cỡ của dữ liệu vào là số phần tử của dãy.
- Thông thường cỡ của dữ liệu vào là một số nguyên dương n, ta sử dụng hàm số T(n) trong đó n là cỡ của dữ liệu vào để biểu diễn thời thực hiện của một thuật toán.
- Chúng ta hiểu hàm số T(n) là thời gian nhiều nhất cần thiết để thực hiện thuật toán với mọi bộ dữ liệu đầu vào cỡ n.
13
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
1. Đánh giá thời gian thực hiện thuật toán
- Sử dụng ký hiệu toán học ô lớn (O) để mô tả độ lớn của hàm T(n). Giả sử n là một số nguyên dương, T(n) và f(n) là hai hàm thực không âm. Ta viết T(n) = O(f(n)) nếu tồn tại các hằng số dương c và n0 , sao cho T(n) ≤ c.f(n), với mọi n ≥ n0.
- Nếu một thuật toán có thời gian thực hiện T(n) = O(f(n)) chúng ta nói rằng thuật toán có thời gian thực hiện cấp f(n).
14
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
1. Đánh giá thời gian thực hiện thuật toán
Ví dụ 1: nếu T(n) = n2 + 1, thì T(n) = O(n2)
🡪 chọn c = 2 và n0 = 1, khi đó với mọi n ≥ 1
ta có: T(n) = n2 + 1 ≤ 2n2 = 2f(n).
Ví dụ 2: Giả sử T(n) = n2 + 2n, ta có n2 + 2n ≤ n2 + 2n2 với mọi n ≥ 1
🡪 Vậy T(n) = O(n2), trong trường hợp này ta nói thuật toán có thời gian thực hiện cấp n2.
15
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
2. Xác định độ phức tạp tính toán của thuật toán:
Việc xác định độ phức tạp tính toán của thuật toán bất kỳ có thể rất phức tạp. Tuy nhiên độ phức tạp của một số thuật toán trên thực tế có thể tính bằng 1 số quy tắc đơn giản sau:
2.1. Quy tắc bỏ hằng số
Nếu đoạn chương trình P có thời gian thực hiện T(n) = O(c1.f(n)) với c1 là một hằng số dương thì có thể coi đoạn chương trình đó có độ phức tạp tính toán là O(f(n)).
Như vậy, hằng số ở đây không quan trọng.
T(n) = O(f(n))
16
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
2. Xác định độ phức tạp tính toán của thuật toán:
2.2. Quy tắc cộng
Nếu đoạn chương trình P1 có thời gian thực hiện T1(n) = O(f(n)) và đoạn chương trình P2 có thời gian thực hiện là T2(n) = O(g(n)), khi đó thời gian thực hiện thuật toán sẽ là:
T1(n) + T2(n) = O(f(n) + g(n))
2.3. Quy tắc lấy max
Nếu đoạn chương trình P có thời gian thực hiện T(n) = O(f(n) + g(n)) thì có thể coi đoạn chương trình đó có độ phức tạp thuật toán:
O(max(f(n) + g(n)))
17
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
2.3. Quy tắc lấy max.
Ví dụ 1: phân tích thời gian của đoạn chương trình sau:
{
cin>>n; //1
S1=0; //2
for (int i=1; i<=n; i++) //3
S1+ = i ; //4
S2 = 0; //5
for (int j=1; j<=n; j++) //6
S2+ = j*j; //7
cout<< “1+2+…+” << n << “=”<<s1<<endl; //8
cout<< “1^2+2^2+…+” << n << “^2=”<<s2<<endl; //9
}
18
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
O(1)
O(1)
O(n)
O(1)
O(1)
O(1)
O(1)
O(1)
O(n)
Max(O(1), O(1), O(n), O(1), O(1), O(n), O(1), O(1), O(1)) = O(n)
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
2.4. Quy tắc nhân.
- Nếu đoạn chương trình P có thời gian thực hiện là T(n) = O(f(n)).
- Khi đó, nếu thực hiện k(n) lần đoạn chương trình P với �k(n) = O(g(n)) thì độ phức tạp tính toán sẽ là O(g(n).f(n))
19
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
2.4. Quy tắc nhân.
Ví dụ 2: phân tích thời gian của đoạn chương trình sau:
{ for (int i=1; i<=n; i++) //1
cin>>a[i]; //2
for (int i=1; i<=n; i++) //3
for (int j=i; j<=n; j++) //4
if (a[i]>a[j]) //5
swap(a[i],a[j]); //6
}
20
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
O(1)
O(n)
O(1)
O(1)
O(n2)
O(n)
Max(O(n),O(1), O(n2), O(n), O(1), O(1)) = O(n2)
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
3. Một số hàm ký hiệu độ phức tạp thuật toán.
- Tùy vào dạng hàm f(n), ta có các ký pháp sau:
+ Nếu 1 thuật toán có thời gian thực hiện đa thức bậc k: P(n), thì độ phức tạp tính toán của thuật toán đó viết là O(nk).
+ Nếu 1 thuật toán có thời gian thực hiện là logaf(n) với b là một số dương, ta nhận thấy logaf(n) = loga blogb f(n). Tức là: O(logaf(n)) = O(logbf(n)). Vậy ta có thể nói rằng độ phức tạp tính toán của thuật toán đó là O(log f(n)) mà không cần ghi cơ số logarit.
21
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
3. Một số hàm ký hiệu độ phức tạp thuật toán.
- Nếu một thuật toán có độ phức tạp là hằng số, tức thời gian thực hiện không phụ thuộc vào kích thước dữ liệu vào thì ta ký hiệu độ phức tạp thuật toán đó là O(1).
- Một số hàm thường dùng để chỉ lớp bài toán với độ phức tạp của thuật toán là logn, n, nlogn, n2, n3, 2n. Tên gọi hàm thường dùng để chỉ lớp bài toán có độ phức tạp tương ứng.
22
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
3. Một số hàm ký hiệu độ phức tạp thuật toán.
Ví dụ: Nói độ phức tạp tính toán của thuật toán này là đa thức, của thuật toán kia là hàm mũ.
- Dưới đây là một số hàm số hay dùng để ký hiệu độ phức tạp tính toán và bảng giá trị của chúng để tiện theo dõi sự tăng của hàm theo đối số n.
23
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
Logn | n | nlogn | n2 | n3 | 2n |
0 | 1 | 0 | 1 | 1 | 2 |
1 | 2 | 2 | 4 | 8 | 4 |
2 | 4 | 8 | 16 | 64 | 16 |
3 | 8 | 24 | 64 | 512 | 256 |
4 | 16 | 64 | 256 | 4096 | 65536 |
5 | 32 | 160 | 1024 | 32768 | 2147483648 |
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
4. Các quy tắc đánh giá thời gian thực hiện thuật toán
- Để đánh giá, chúng ta phân tích chương trình xuất phát từ các lệnh đơn, rồi đánh giá các lệnh phức tạp hơn, cuối cùng đánh giá được thời gian thực hiện của chương trình, cụ thể:
- Thời gian thực hiện các lệnh đơn: gán, đọc, viết là O(1)
24
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
B. Độ phức tạp tính toán (thời gian)
4. Các quy tắc đánh giá thời gian thực hiện thuật toán
25
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
II. Độ phức tạp của thuật toán.
26
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II
Giá trị N lớn nhất để các thuật toán có độ phức tạp khác nhau chạy trong tối đa 8 giây
complexity | maximum N | |
O(N) | 100 000 000 | 300 000 000 |
O(NlogN) | 40 000 000 | |
O(N2) | 10 000 | |
O(N3) | 500 | |
O(N4) | 90 | |
O(2N) | 20 | |
O(N!) | 11 | |
BÀI 4: ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
Củng cố
I. Lựa chọn thuật toán
II. Độ phức tạp của thuật toán.
A. Độ phức tạp không gian
B. Độ phức tạp tính toán (thời gian)
1. Đánh giá thời gian thực hiện thuật toán
2. Xác định độ phức tạp tính toán của thuật toán
3. Một số hàm ký hiệu độ phức tạp thuật toán.
4. Các quy tắc đánh giá thời gian thực hiện thuật toán
5. Một số ví dụ
27
Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên
Tổ Tin học Chương II