Professional Documents
Culture Documents
2 DoPhucTap
2 DoPhucTap
2
Độ phức tạp
p Độ phức tạp
n Độ phức tạp của một thuật toán là đo lường số các thao tác cơ
bản mà thuật toán thực hiện trên một bộ dữ liệu vào
p Phụ thuộc vào dữ liệu vào
n Độ phức tạp là một hàm phụ thuộc vào kích thước n của bộ dữ
liệu vào
n Độ phức tạp có ý nghĩa khi n lớn
3
thời gian và bộ nhớ
p Đánh giá độ phức tạp
n thời gian thực thi
n bộ nhớ sử dụng
è thường mâu thuẫn nhau
p Dẫn đến
n thường làm tăng độ phức tạp về mặt bộ nhớ
n làm tăng « độ phức tạp trí tuệ » của thuật toán
p Thời gian phát triển
p Rủi ro xảy ra lỗi
p Chi phí bảo trì
4
lý thuyết và thực tế
p Hai phương pháp đánh giá độ phức tạp về
mặt thời gian
n Phương pháp lý thuyết
n Phương pháp thực tế
6
lý thuyết và thực tế
p Quan hệ giữa phương pháp lý thuyết và phương pháp thực
tế
n Thường chỉ đánh giá tập các thao tác cơ bản
p thời gian thực thi thuật toán tỷ lệ thuận với số các thao tác này
p Ví dụ
§ Số phép so sánh và trao đổi dữ liệu đối với thuật toán sắp xếp
§ Số các phép cộng và phép nhân đối với thuật toán nhân hai ma trận
§ Số các truy cập đĩa đối với thuật toán thao tác trên CSDL
7
Tính độ phức tạp
p Dựa vào ngữ pháp của thuật toán, chúng ta có
các nguyên tắc tính độ phức tạp như sau:
n Đối với các thao tác cơ bản là các lệnh tuần tự thì cộng
dồn số các thao tác
n Đối với lệnh điều kiện, giả sử P(X) là số thao tác cơ bản
của cấu trúc lệnh X, thì:
P(if C then I1 else I2) £ P(C) + max(P(I1), P(I2))
n Đối với các lệnh lặp, số các thao tác cơ bản trong vòng
lặp là åP(i), trong đó i biến điều khiển lặp, P(i) số thao
tác cơ bản ở lần lặp thứ i
8
Tính độ phức tạp
n Đối với lời gọi hàm:
p Nếu không có hàm đệ quy, chúng ta luôn có thể tổ
chức sao cho mỗi một hàm gọi hàm khác mà số thao
tác cơ bản của hàm đó đã xác định
p Nếu là hàm đệ quy, tính số các thao tác cơ bản
thường dẫn đến hệ thức truy hồi
§ Ví dụ
function factorial(n) Thao tác cơ bản: số phép nhân
Begin
If (n = 1) then
factorial = 1 C(1) = 0
C(n) = C(n-1) + 1
Else
factorial = n * factorial (n-1)
EndIf Vậy: C(n) = n
End
9
Tính độ phức tạp: ba trường hợp
p Độ phức tạp phụ thuộc vào dữ liệu sử dụng bởi thuật toán
10
Tính độ phức tạp: ba trường hợp
p Dn : tập dữ liệu kích thước n
p CA(d) : độ phức tạp của thuật toán A đối với dữ liệu d của
tập Dn
p p(d) : xác xuất xuất hiện của d
11
Tính độ phức tạp: ba trường hợp
p Nếu xác xuất xuất hiện các dữ liệu là như
nhau, thì
n card(Dn) = |Dn|
n CavgA(n) = (1/|Dn|) å CA(d)
12
Tính độ phức tạp: ba trường hợp
p Ví dụ 1: nhân hai ma trận
matrix_product (A, B, C, n)
Begin
For i from 1 to n
For j from 1 to n
C(i,j) = 0
For k from 1 to n
C(i,j) = C(i,j) + A(i,k) * B(k,j)
EndFor
EndFor
EndFor
End
= (1-q) n + q(n+1)/2
15
Tính độ phức tạp: ba trường hợp
p Ví dụ 2: độ phức tạp trung bình
n Nếu q = 1 (X thuộc L), thì CavgA(n) = (n+1)/2
16
Các hàm tiệm cận
p Trong trường hợp tổng quát, chúng ta thường
không tính độ phức tạp chính xác, mà tính độ
phức tạp tiệm cận (khi n rất lớn)
p Chúng ta xem xét các hàm (asymptotic
notations) theo n và thay đổi của hàm khi mà n
rất lớn
17
Các hàm tiệm cận
p Kí hiệu o nhỏ
n f = o(g) khi n ® ¥ nếu:
18
Các hàm tiệm cận
p Kí hiệu O lớn
n f = O(g) khi n ® ¥ nếu:
$c > 0, $n 0 > 0, 0 £ f (n) £ cg (n), "n ³ n0
n g(n) là tiệm cận trên của f(n) với một số hằng số c
p Nếu f = o(g) thì f = O(g)
n Ví dụ
p 2n = O(n2)
p 2n2 = O(n2), nhưng 2n2 ¹ o(n2)
19
Các hàm tiệm cận
p Kí hiệu Q
n f = Q(g) khi n ® ¥ nếu:
$c1 > 0, $c2 > 0, $n 0 > 0, 0 £ c1 g (n) £ f (n) £ c2 g (n), "n ³ n0
n Ví dụ
p f(n) = n2/2 - 3n = n2(1/2 – 3/n), g(n) = n2
p xác định c1 và c2 sao cho: c1<= 1/2 – 3/n <=c2
p Với c2= 1/2, n0 = 12, c1 = 1/2 – 3/12 = 1/4
p Vậy n2/2 - 3n =Q(n2)
20
Các hàm tiệm cận
p Kí hiệu Q
n định nghĩa tiệm cận trên và tiệm cận dưới của f(n)
c2 g
f c1 g
21
Các hàm tiệm cận
p Kí hiệu W
n f = W(g) khi n ® ¥ nếu:
$c > 0, $n 0 > 0, 0 £ cg (n) £ f (n), "n ³ n0
n Ví dụ
p n2 = W(n)
22
Các hàm tiệm cận
p Các tính chất
n Nếu f = Q(g) thì f = O(g) và f = W(g)
p Suy ra từ định nghĩa
n Ví dụ
p f(n) = n2 - n và g(n) = n2
p f(n) ~ g(n)
24
Các hàm tiệm cận
p Độ phức tạp lý thuyết khi n ® ¥
25
Các hàm tiệm cận
p Ví dụ 1
n Giả sử CA(n) = 8n2 + 2n + 1 và CB(n) = 1000n2 + 10n + 2 là
các hàm biểu diễn thời gian thực thi của hai phương pháp cài
đặt cùng một thuật toán trong trường hợp xấu nhất. Xác định
O của hai hàm trên.
n CA(n) = 8n2 + 2n + 1
£ 8n2 + 2n2 + n2 với n ³ 1
= 11n2
chọn c = 11, n0 = 1, thì CA(n) = O(n2)
n CB(n) = 1000n2 + 10n + 2
£ 1000n2 + 10n2 + 2n2 với n ³ 1
= 1012n2
chọn c = 1012, n0 = 1, thì CB(n) = O(n2)
n Thuật toán: O(n2)
26
Các hàm tiệm cận
p Ví dụ 2
å
n
n Chứng minh rằng "kÎN: i =1
i k
= q ( n k +1
)
n
å å
n k +1
n Ta có: i =1
k
i £ n k
= n.n k
=n
i =1
åi =1
n k +1
n Vậy: i k
= O ( n ) với c =1
k +1
n n n n
Ta có: åi =1 i ³ åi = éê n ùú i ³ åi = éê n ùú ( ) ³ ( ) = k +1
n k n k n k k
n
ê2ú ê2ú 2 2 2 2
åi =1
n k +1
n Vậy: i k
= W ( n ) với c = 1/2k+1
27
Hệ thức truy hồi
p Như đã trình bày, tính độ phức tạp hàm đệ quy thường
dẫn đến hệ thức truy hồi
p Các họ hệ thức truy hồi thường gặp
n Truy hồi bậc nhất
p tuyến tính: an = n an-1 + g(n)
p không tuyến tính: an = 1/(n+ an-1) + g(n)
hạng đầu tiên phải có giá trị
n Truy hồi bậc hai
p tuyến tính: an = b an-1 + c an-2 + g(n)
p không tuyến tính: an = 1/(an-1 + an-2) + g(n)
hai hạng đầu tiên phải có giá trị
n Truy hồi bậc k
p tuyến tính: an = b1 an-1 + b2 an-2 + … + bk an-k + g(n)
p tuyến tính thuần nhất hệ số hằng số:
an = b1 an-1 + b2 an-2 + … + bk an-k
p không tuyến tính: …
k hạng đầu tiên phải có giá trị
28
Hệ thức truy hồi
p Các họ hệ thức truy hồi thường gặp (tiếp)
n Truy hồi hoàn toàn
p tuyến tính:
an = b1 an-1 + b2 an-2 + … + bk an-k + … + + bn-1 a1 + g(n)
p không tuyến tính: …
n-1 hạng đầu tiên phải có giá trị
n Truy hồi phân hoạch
an = b aën/2û + c aén/2ù + g(n)
hoặc dưới dạng: an = c an/b + g(n), với điều kiện n/b
là số nguyên
n Nhiều trường hợp, rất phức tạp để giải hệ thức truy hồi
29
Hệ thức truy hồi
p Truy hồi tuyến tính bậc nhất (1)
n Dạng hệ số hằng số: an = b an-1 + gn, biết trước a0
an = b an-1 + gn
an-1 = b an-2 + gn-1 * với hệ số = b
an-2 = b an-3 + gn-2 * với hệ số = b2
…
a1 = b a0 + g1 * với hệ số = bn-1
______________________
n
an = bn a0 + åi
g b n -i
i=1
30
Hệ thức truy hồi
p Truy hồi tuyến tính bậc nhất (2)
n Dạng: an = bn an-1 + gn, biết trước a0
Đặt: an = b1 b2 ... bn yn , a0 = y 0
n Ví dụ tính:
p an = 4 an-1 - 1, a0 = 1/3
p an = 4 an-1 - 1, a0 = 0.333
p an = 3 an-12 và a0 = 1
có thể đặt bn = log2 an
32
Hệ thức truy hồi
p Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số (1)
n Dạng: an = ban-1 + can-2 (1)
n Nghiệm của hệ thức trên có dạng an=rn, r là hằng số
n Nghĩa là: rn = brn-1 + crn-2
n Chia hai vế của hệ thức cho rn-2, ta có:
r2 = br + c
n Khi đó an=rn là nghiệm của hệ thức truy hồi khi r là nghiệm
của phương trình
r2 - br – c = 0 (2)
(gọi là phương trình đặc trưng của hệ thức truy hồi)
n Trong trường hợp tổng quát, ta thu được hai nghiệm phân
biệt r1 và r2
n Khi đó, an = a r1n + b r2n cũng là nghiệm của của (1), với a
và b là các hằng số
p Chứng minh …
33
Hệ thức truy hồi
p Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số (2)
n an = a r1n + b r2n
n các hệ số a và b được xác định bởi các điều kiện đầu
a + b = a0
ar1 + br2 = a1
n Ví dụ
p Tìm nghiệm của hệ thức truy hồi an = an-1 + 2an-2 với các điều
kiện đầu a0=2 và a1=7
p Phương trình đặc trưng của hệ thức truy hồi: r2-r-2=0
p Nghiệm của phương trình đặc trưng: r1 = 2 và r2 = -1
p Vậy an = a (2)n + b (-1)n
p Thay các điều kiện đầu, có
a0 = a + b = 2
a1 = 2a - b = 7
p Vậy: a = 3, b = -1
p Nghiệm của hệ thức truy hồi: an = 3.2n -(-1)n
34
Hệ thức truy hồi
p Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số (3)
n Nếu phương trình đặc trưng có nghiệm kép thì nghiệm của
(1) là:
an = (a n + b) rn
n Ví dụ
p Tìm nghiệm của hệ thức truy hồi an = 4an-1 - 4an-2 với các điều
kiện đầu a0=3 và a1=8
p Phương trình đặc trưng của hệ thức truy hồi: r2-4r+4=0
p Phương trình đặc trưng có nghiệm kép: r = 2
p Vậy an = (an + b)(2)n
p Thay các điều kiện đầu, có
a0 = 3 = b
a1 = (a + b)2 = 8
p Vậy: a = 1, b = 3
p Nghiệm của hệ thức truy hồi: an = n2n + 3.2n
35
Hệ thức truy hồi
p Truy hồi phân hoạch (1)
n Truy hồi dạng: an = b aën/2û + c aén/2ù + g(n)
36
Hệ thức truy hồi
p Truy hồi phân hoạch (2)
n Thường được xét dưới dạng:
an = c an/b + g(n), với n=bk
n Đặt tk = ab k
n Vậy ta có tk = c tk-1 + g(bk)
t0 = 1 (= a1 = 1)
tk = c tk-1 + g(bk)
tk-1 = c tk-2 + g(bk-1)
….
t1 = c t0 + g(b1)
37
Hệ thức truy hồi
p Truy hồi phân hoạch (3)
tk = c tk-1 + g(bk)
tk-1 = c tk-2 + g(bk-1) *c
tk-2 = c tk-3 + g(bk-2) *c2
…
t1 = c t0 + g(b1) *ck-1 t0=1
k -1
tk = c k + å c i g ( b k - i ) với n = bk Û k = logbn
i =0
bk-i = n / bi
k -1
n c logb n = n logb c
an = n logb c
+ å c g( i )i
i =0 b
38
Hệ thức truy hồi
p Ví dụ (1)
n Tính độ phức tạp của thuật toán sắp xếp trộn (merge
sort)
merge-sort (A, p, q)
Begin
If (p < q) then
r = (p+q)/2
merge-sort (A, p, r)
merge-sort (A,r + 1, q)
merge (A, p, r, q)
EndIf
End
n Phân tích thành hai bài toán con có kích thước ën/2û và
én/2ù
39
Hệ thức truy hồi
p Ví dụ (2)
n Trộn hai danh sách b và c kích thước n/2 đã được sắp
xếp: merge()
i j
b bi cj c
bi < cj
Kết quả
i =0 b i =0 2
n
1 - q n +1
sử dụng công thức: å
i =0
q =
i
1- q
(q ¹ 1)
k -1
an = n + k n - å 2i = n + k n - ( 2k - 1) với k = log2n
i =0
log bn log bc
an = n + n log2 n - ( 2 log2 n
- 1) sử dụng c =n
42
Độ phức tạp thực tế
p Ví dụ (1)
n Đánh giá độ phức tạp của thuật toán sắp xếp chèn (insertion sort)
n Mỗi lệnh được gán chi phí (cost) về thời gian thực thi và số lần thực
thi (times). Với mỗi j = 2,3,…n, kí hiệu tj là số lần thực thi lệnh lặp
While
insertion-sort(A) cost times
Begin
For j from 2 to n c1 n
key = A[j] c2 n-1
i=j–1 c3 n-1
While (i > 0 and A[i] > key) do c4
å
n
j =2 j
t
å
n
A[i+1] = A[i] c5
j =2
(t j - 1)
å
n
i=i–1 c6 j =2
(t j - 1)
EndWhile
A[i+1] = key c7 n-1
EndFor
43
End
Độ phức tạp thực tế
p Ví dụ (2)
n Tổng thời gian thực thi là
n
C (n) = c1n + c2 (n - 1) + c3 (n - 1) + c4 å t j + c5 å j = 2 (t j - 1) + c6 å j = 2 (t j - 1) + c7 (n - 1)
n n
j =2
44
Độ phức tạp thực tế
p Ví dụ (2)
n Độ phức tạp trong trường hợp xấu nhất: danh sách đã được
sắp xếp theo thứ tự ngược lại, khi đó tj = j với mọi j.
n Ta có:
n(n + 1) n(n + 1) n
n(n - 1)
å j =1 j = 2 , å j =2 j = 2 - 1, å
n n
n Vậy: ( j - 1) =
j =2 2
æ n(n + 1) ö æ n(n - 1) ö æ n(n - 1) ö
C (n) = c1n + c2 (n - 1) + c3 (n - 1) + c4 ç - 1÷ + c5 ç ÷ + c6 ç ÷ + c7 (n - 1)
è 2 ø è 2 ø è 2 ø
æc c c ö æ c c c ö
= ç 4 + 5 + 6 ÷n 2 + ç c1 + c2 + c3 + 4 - 5 - 6 + c7 ÷n - (c2 + c3 + c4 + c7 )
è2 2 2ø è 2 2 2 ø
Có thể viết C(n) = an2 + bn + c, với a, b và c là các hằng số
Độ phức tạp trong trường hợp xấu nhất là hàm bình phương
n
45
Độ phức tạp thực tế
p Ví dụ (3)
n Độ phức tạp trong trường hợp trung bình
p giả sử áp dụng thuật toán cho danh sách n phân tử được
chọn một cách ngẫu nhiên.
p Giá trị của tj ? Phần tử A[j] được chèn vào vị trí nào trong
danh sách A[1..j-1] ?
p Trường hợp trung bình, một nữa số phần tử của A[1..j-1]
lớn hơn A[j] và một nữa số phần tử của A[1..j-1] nhỏ hơn
A[j]
p Vậy tj = j/2
n Tương tự trường hợp xấu nhất, C(n) sẽ có dạng
C(n) = an2 + bn + c, với a, b và c là các hằng số
n Độ phức tạp trong trường hợp trung bình là hàm bình
phương n
46
Độ phức tạp thực tế
p Ví dụ (4)
n Tuy nhiên, thông thường cái chúng ta quan tâm thực
sự là giá trị của các hàm tiệm cận (thường là O và Q)
n Chỉ có số hạng quan trọng của biểu thức độ phức tạp
có ý nghĩa khi n rất lớn, bỏ qua các số hạng còn lại
n Khi n lớn, chúng ta bỏ qua luôn hằng số của số hạng
quan trọng
n Vậy độ phức tạp của thuật toán sắp xếp chèn trong
p trường hợp tốt nhất: Q(n)
p trường hợp xấu nhất: Q(n2)
p trường hợp trung bình: Q(n2)
47
Các lớp thuật toán theo độ phức
tạp
p Các thuật toán thường được so sánh bởi độ phức tạp
trong trường hợp xấu nhất, tức là giá trị của O(g(n))
p Các lớp thuật toán theo độ phức tạp
n Hằng số: O(1), tất cả các lệnh thực thi đúng một lần không
phụ thuộc kich thước dữ liệu
n Dưới tuyến tính: O(log(n)), kích thước của bài toán được chia
nhỏ bởi một hằng số ở mỗi bước lặp
n Tuyến tính:
p O(n), vòng lặp n lần, thân vòng lặp thực hiện công việc độc lập với
n
p O(nlog(n)), kích thước của bài toán được chia nhỏ bởi một hằng số
ở mỗi bước lặp,và ở mỗi lần chia nhỏ một bước duyệt tuyến tính
các dữ liệu được thực hiện
n Đa thức: O(nk), các thuật toán được xem là chậm khi k>3
n Hàm mũ: O(kn), k³2, các thuật toán là không thể ứng dụng
được
n Các thuật toán sử dụng được thường có độ phức tạp £ O(n3)
48
Các lớp thuật toán theo độ phức
tạp
p Minh hoạ độ phức tạp các lớp thuật toán
n log2(n) nlog2(n) n2 n3 2n
1 0 0 1 1 2
49
Bài tập
p Bài 1
n Giả sử hàm f(n) = log (2n + a) được định
nghĩa, chứng minh rằng: f(n) = Q(log(n))
p Bài 2
n Giả sử có một danh sách n phần tử có giá trị
khác nhau. Hãy
1. Xây dựng thuật toán xác định phần tử nhỏ nhất và
phần tử lớn nhất
2. Đánh giá độ phức tạp của thuật toán bởi số phép so
sánh
3. Đề xuất thuật toán hiệu quả hơn
4. Đánh giá độ phức tạp của thuật toán bởi số phép so
sánh 50
Bài tập
p Bài 3
n Đánh giá độ phức tạp của thuật toán sau
timkiemnhiphan (A, x, l, r)
// tìm x trong danh sách A[l,r]
begin
if (l = r) then return (l)
else
m = (l + r)/2
if (x £ A[m]) then return (timkiemnhiphan (A, x, l, m))
else return (timkiemnhiphan (A, x, m+1, r))
endif
endif
end
51