Professional Documents
Culture Documents
2
Ví dụ “Đèn Hiệu Điều khiển GT”
Một ngã năm như hình vẽ, trong đó C và E là lối đi
một chiều. Hãy thiết kế một bảng đèn hiệu điều khiển
giao thông một cách hợp lý để:
1. Phân chia các lối đi thành các nhóm, mỗi nhóm gồm
các lối đi có thể đồng thời nhưng không xảy ra tai nạn
giao thông.
2. Số lượng nhóm là ít nhất có thể được.
D
C
E
B A
3
Ta cần làm những gì để giải bài toán này bằng
Từ bài toán đến chương trình
5
Ví dụ “Đèn Hiệu Điều khiển GT”
D
C
E
B A
B A
EA EB EC ED
1. Mô
AB AC AD
hình
Mô hình hóa bài toán
hóa BA BC BD theo mô hình toán là
bài đồ thị (Graph).
toán DA DB DC
thực
tế EA EB EC ED 7
Ví dụ “Đèn Hiệu Điều khiển GT”
Mô hình hóa bài toán thực tế: phải giải quyết bài
toán “Tô màu cho đồ thị” sao cho:
- Các lối đi được phép đi đồng thời sẽ được tô
cùng một màu => 2 đỉnh có cạnh nối nhau sẽ
không được tô cùng màu.
- Số nhóm là ít nhất <=> ta phải tính toán để
dùng số màu ít nhất.
8
Ví dụ “Đèn Hiệu Điều khiển GT”
15
Từ bài toán đến chương trình
19
Độ phức tạp của giải thuật
22
Độ phức tạp của giải thuật
Bài tập: Kiểm tra xem những câu sau là đúng hay sai ?
a) 10 + n + n2 = O(n2)
b) 10 + n + logn = O(n2)
c) 7log2n + 2nlogn = O(n)
d) (1/3)n + 100 = O(1)
e) 3n + 100 = O(1)
f) 2n + 100n2 + n100 = O(n101)
23
Độ phức tạp của giải thuật
26
Tính độ phức tạp của giải thuật
Thời gian thực hiện của mỗi lệnh gán, nhập, xuất là
O(1).
Thời gian thực hiện của một chuỗi tuần tự các lệnh
được xác định bằng qui tắc cộng.
Thời gian thực hiện cấu trúc IF là thời gian lớn nhất
thực hiện lệnh sau IF hoặc sau ELSE và thời gian kiểm
tra điều kiện. Thường thời gian kiểm tra điều kiện là
O(1).
Thời gian thực hiện vòng lặp là tổng (trên tất cả các lần
lặp) thời gian thực hiện thân vòng lặp. 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. 28
Tính độ phức tạp của giải thuật
Ví dụ: tính độ phức tạp của hàm tìm phần tử lớn nhất
trong một mảng có n số nguyên?
int FindMaxElement(int[] a, int n)
{
int max = int.MinValue; O(1)
O(max(1, n, 1)) for (int i = 0; i < n; i++){
=O(n)
if (a[i] > max) {
O(1)
O(n*1) max = a[i]; O(1) O(max(1,1))=O(1)
=O(n) }
}
return max; O(1)
https://introprogramming.info/english-intro-csharp-book/read-o
} nline/chapter-19-data-structures-and-algorithm-complexity/
29
Tính độ phức tạp của giải thuật
Bài tập: tính độ phức tạp của đoạn chương trình sau:
/*1*/ Sum1=0;
/*2*/ k=1;
/*3*/ while (k<=n) {
/*4*/ for(j=1;j<=n;j++)
/*5*/ Sum1=Sum1+1;
/*6*/ k=k*2;
} 32
Tính độ phức tạp của giải thuật
35
Tính độ phức tạp n
1
A
0.1s
B
0.005s
của giải thuật 2
3
0.4s
0.9s
0.04s
0.135s
4 1.6s 0.32s
5 2.5s 0.625s
6 3.6s 1.08s
Ví dụ: để giải một bài toán 7 4.9s 1.715s
8 6.4s 2.56s
thực tế, ta có thể sử dụng 9 8.1s 3.645s
một trong hai giải thuật A 10 10s 5s
hoặc B. Giải thuật A có 11 12.1s 6.655s
12 14.4s 8.64s
TA(n)=100*n*n ms = O(n2); 13 16.9s 10.985s
giải thuật B có TB(n)=5*n*n*n 14 19.6s 13.72s
15 22.5s 16.875s
ms = O(n3). Ta nên chọn giải 16 25.6s 20.48s
thuật A hay giải thuật B? 17 28.9s 24.565s
18 32.4s 29.16s
19 36.1s 34.295s
20 40s 40s
21 44.1s 46.305s
… … …
30 90s 135s
http://www.dcs.gla.ac.uk/~pat/52233/complexity.html 40 160s 320s
36
Q&A?
37