You are on page 1of 51

Độ phức tạp (3)

Nguyễn Thanh Bình


Khoa Công nghệ Thông tin
Trường đại học Bách khoa
Đại học Đà Nẵng
Nôi dung
p Khái niệm độ phức tạp
p Độ phức tạp: lý thuyết và thực tế
p Đánh giá độ phức tạp: ba trường hợp
p Các hàm tiệm cận
p Hệ thức truy hồi
p Độ phức tạp thực tế

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

p Đánh giá độ phức tạp thuật toán nhằm


n Nghiên cứu hoạt động của thuật toán
p Tối ưu hay không
p Phát hiện những phần phức tạp, làm chậm thuật toán
n So sánh các giải pháp khác nhau trong cùng ngữ cảnh
p vấn đề
p ngôn ngữ
p máy tính

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 Chúng ta thường tìm cách giảm độ phức tạp về mặt thời


gian
n bỏ qua độ phức tạp về mặt bộ nhớ

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ế

p Phương pháp lý thuyết


n đánh giá hoạt động của thuật toán khi kích
thước dữ liệu n rất lớn
n hoạt động của thuật toán được đánh giá bởi
các hàm của n
n không tính đến các chi tiết của thuật toán
5
lý thuyết và thực tế
p Phương pháp thực tế
n Đánh giá một cách chi tiết thuật toán
n Tất cả các câu lệnh đều được xem xét
n Đánh giá riêng rẽ các hoạt động khác nhau
p phép cộng/trừ số nguyên
p phép nhân số nguyên
p phép so sánh
p thao tác đọc/ghi
p truy cập bộ nhớ
p …
n Mang lại các kết quả rất chi tiết
p nhưng thường phức tạp
p thường khó để so sánh (do đánh giá riêng rẽ)
n Phát hiện các vùng phức tạp
n Hỗ trợ tối ưu chương trình

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

n Các thao tác cơ bản được đánh giá riêng rẽ


n Sự lựa chọn tập các thao tác cơ bản phụ thuộc
p kích thước dữ liệu
p chi tiết cần đánh giá
p khả năng phân tích
p …

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

p Trường hợp tốt nhất


n Dữ liệu được tổ chức sao cho thuật toán hoạt động hiệu quả
nhất
n Giá trị nhỏ nhất của độ phức tạp thực tế
p Trường hợp xấu nhất
n Dữ liệu được tổ chức sao cho thuật toán hoạt động kém hiệu
quả nhất
n Giá trị lớn nhất của độ phức tạp thực tế
p Trường hợp trung bình
n Dữ liệu tương ứng với sự tổ chức được xem là trung bình
n Không đơn giản để xác định
n Thường có ý nghĩa nhất
n Không là trung bình của độ phức tạp tốt nhất và độ phức tạp
xấu nhất

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

p Độ phức tạp trong trường hợp tốt nhất: CminA(n)


n CminA(n) = min{CA(d), dÎ Dn}
p Độ phức tạp trong trường hợp xấu nhất: CmaxA(n)
n CmaxA(n) = max{CA(d), dÎ Dn}
p Độ phức tạp trung bình: CavgA(n)
n CavgA(n) = å p(d).CA(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)

p Độ phức tạp trung bình nói chung là


không thể xác định chính xác

p Điều chắc chắn


n CminA(n) £ CavgA(n) £ CmaxA(n)

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

Quan hệ: CminA(n) ? CavgA(n) ? CmaxA(n)


13
Tính độ phức tạp: ba trường hợp
p Ví dụ 2: tìm kiếm tuần tự trong một danh sách
function lookup (L, X, n)
Begin
i=1
While ((i £ n) and (L(i) ¹ X))
i=i+1 Thao tác cơ bản: số các
EndWhile phép so sánh
If (i > n) then
i=0
EndIf
lookup = i
End
n Trường hợp tốt nhất: L(1) = X, CminA(n) = 1
n Trường hợp xấu nhất: X không có trong L hoặc L(n) = X,
CmaxA(n) = n
14
Tính độ phức tạp: ba trường hợp
p Ví dụ 2: độ phức tạp trung bình
n q: xác suất X ở trong danh sách L
n X trong L: khả năng xuất hiện tại các vị trí như nhau
n Dn,i: tập dữ liệu với X ở vị trí i, p(Dn,i) = q/n
n Dn,0: tập dữ liệu với X không thuộc L, p(Dn,0) = 1-q
n CA(Dn,i) = i và CA(Dn,0) = n
n n
CavgA(n) = å p(Dn,i)CA(Dn,i) = (1-q) n + q/n å i
i=0 i=1

= (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

n Nếu q = ½ (), thì CavgA(n) = (3n+1)/4

n Trường hợp trung bình


p X nằm ở giữa danh sách L, tại vị trí n/2 hoặc (n+1)/2
p độ phức tạp là n/2 hoặc (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

p Các hàm tiệm cận cho phép


n đánh giá độ hiệu quả của thuật toán
n so sánh hiệu quả của các thuật toán

17
Các hàm tiệm cận
p Kí hiệu o nhỏ
n f = o(g) khi n ® ¥ nếu:

"c > 0, $n 0 > 0, "n ³ n 0 ,0 £ f (n) < cg (n)


n g(n) là tiệm cận trên của f(n) với mọi hằng số c
n f(n) tăng chậm hơn g(n):
f ( n)
lim =0
n ®¥ g ( n)
n Ví dụ
p n = o(n2)
p n2 = o(n4)

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 f(n) không tăng nhanh hơn g(n)

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 f(n) và g(n) tăng cùng tốc độ (so sánh trong nghĩa độ


phức tạp)

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

n Nếu f = Q(g) thì:


p f = O(g)
p g = O(f)

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 g(n) là tiệm cận dưới của f(n) với một số hằng số c

n f(n) tăng ít nhất cũng nhanh bằng g(n)

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 Nếu f = Q(g) thì g = Q(f)


p Chứng minh

$( c1 , c2 , n0 ), c1 > 0, c2 > 0, "n > n 0 , 0 £ c1 g ( n ) £ f ( n ) £ c2 g ( n )


1
$(c 2 ,n 0 ), c 2 > 0, "n > n 0 , 0 £ f (n) £ g(n)
c2
1
$(c1 ,n 0 ), c1 > 0, "n > n 0 , 0 £ g(n) £ f (n)
c1
23
Các hàm tiệm cận
p Hàm tương đương
n f ~ g khi n ® ¥ nếu:
f ( n)
lim =1
n ®¥ g ( n)

n f(n) và g(n) tăng cùng tốc độ (một cách chính xác)

n f(n) và g(n) có cùng các giới hạn

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 ® ¥

f = o(g) độ phức tạp của f < độ phức tạp của g

f = O(g) độ phức tạp của f £ độ phức tạp của g


(theo các hằng số xác định)
f = Q(g) độ phức tạp của f cùng cở độ phức tạp
của g (theo các hằng số xác định)
f= W(g) độ phức tạp của f ³ độ phức tạp của g
(theo các hằng số xác định)
f = ~(g) độ phức tạp của f = độ phức tạp của g

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

n Đề cập đến giải hệ thức


p truy hồi tuyến tính bậc nhất
p Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số
p truy hồi phân hoạch

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

Vậy: b1 b2 ... bn yn = b1 b2 ... bn yn-1 + gn

Hay: yn = yn-1 + gn/(b1 b2 ... bn)


n
gi
Dẫn đến: y n = y 0 + å
i =1 b1 b2 ... bi
n n
gi
Cuối cùng: a n = Õ bi (a 0 + å )
i =1 i =1 b1 b2 ... bi
31
Hệ thức truy hồi
p Truy hồi tuyến tính bậc nhất (3)

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)

n Phân tích bài toán thành hai bài toán con


p kích thước ën/2û và én/2ù
p vậy, thông thường b = c (= 1)
p g(n): chi phí phân tích và trộn các giải pháp con

n Khi n lớn, có thể xem


ën/2û = én/2ù = n/2

n Vậy, hệ thức truy hồi trở thành


an = 2 an/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 Hay abk = c abk -1 + g (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

đúng, ghi bi sai, ghi cj


i = i+1 j = j+1

Kết quả

n Nhiều nhất sử dụng n-1 phép so sánh


40
Hệ thức truy hồi
p Ví dụ (3)
n Vậy ta có hệ thức truy hồi (an = C(n))
an = 2 an/2 + n - 1
k -1
k -1 n
an = n logb c n
+ å c g( i )
i an = n log2 2
+ å 2 ( i - 1)
i

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

an = n log2 n + 1 Vậy: C(n) = Q(nlog(n))


41
Độ phức tạp thực tế
p Đánh giá một cách chi tiết thuật toán
p Tất cả các câu lệnh đều được xem xét
p Đánh giá riêng rẽ các loại thao tác khác nhau
n phép cộng/trừ số nguyên
n phép nhân số nguyên
n phép so sánh
n thao tác đọc/ghi
n truy cập bộ nhớ
n …
p Mang lại các kết quả rất chi tiết
n nhưng thường phức tạp
n thường khó để so sánh (do đánh giá riêng rẽ)

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

n Độ phức tạp trong trường hợp tốt nhất: danh sách đã


được sắp xếp đúng thứ tự, khi đó tj = 1 với mọi j. Vậy:
C(n) = c1n + c2(n-1) + c3(n-1) + c4 (n-1) + c7(n-1)
= n(c1 + c2 + c3 + c4 + c7) - (c2 + c3 + c4 + c7)

Có thể viết C(n) = an + b, với a và b là các hằng số


Độ phức tạp trong trường hợp tốt nhất là hàm tuyến
tính n

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

10 3.32 33.2 100 103 1024

100 6.64 664 104 106 1.2630

1000 9.965 9 965 106 109 ¥

106 19.931 19 931 568 1012 1018 ¥

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

You might also like