Download as pdf or txt
Download as pdf or txt
You are on page 1of 67

THUẬT TOÁN VÀ ĐỘ PHỨC TẠP CỦA NÓ

Bài giảng điện tử

Ts. Lê Xuân Đại

Trường Đại học Bách Khoa TP HCM

Ngày 30 tháng 3 năm 2011


Nội dung

Thuật toán và độ phức tạp

Đánh giá thời gian thực hiện thuật toán như thế nào?

Dùng O(f (x)) để đánh giá thời gian thực hiện thuật toán

Các quy tắc để đánh giá thời gian thực hiện thuật toán

Các thuật toán cơ bản và độ phức tạp

Bài tập
Thuật toán và độ phức tạp
Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính
xác các phép toán, hoặc hành động cần thực hiện,...để cho ta lời
giải của bài toán.
Thuật toán và độ phức tạp
Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính
xác các phép toán, hoặc hành động cần thực hiện,...để cho ta lời
giải của bài toán.
Một vấn đề quan trọng của thuật toán là ta phải đánh giá và so
sánh được các thuật toán với nhau. Nói chung tiêu chuẩn để đánh
giá một thuật toán là tốt hay không chủ yếu dựa trên độ phức tạp
của nó, tức là dựa trên số thời gian cần dùng để thực hiện nó.
Thuật toán và độ phức tạp
Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính
xác các phép toán, hoặc hành động cần thực hiện,...để cho ta lời
giải của bài toán.
Một vấn đề quan trọng của thuật toán là ta phải đánh giá và so
sánh được các thuật toán với nhau. Nói chung tiêu chuẩn để đánh
giá một thuật toán là tốt hay không chủ yếu dựa trên độ phức tạp
của nó, tức là dựa trên số thời gian cần dùng để thực hiện nó.
Tiêu chuẩn: Thuật toán sử dụng tiết kiệm nhất các nguồn tài
nguyên của máy tính và đặt biệt chạy nhanh nhất có thể được,
được gọi là tính hiệu quả của thuật toán. Tính hiệu quả của thuật
toán gồm 2 nhân tố cơ bản:
Thuật toán và độ phức tạp
Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính
xác các phép toán, hoặc hành động cần thực hiện,...để cho ta lời
giải của bài toán.
Một vấn đề quan trọng của thuật toán là ta phải đánh giá và so
sánh được các thuật toán với nhau. Nói chung tiêu chuẩn để đánh
giá một thuật toán là tốt hay không chủ yếu dựa trên độ phức tạp
của nó, tức là dựa trên số thời gian cần dùng để thực hiện nó.
Tiêu chuẩn: Thuật toán sử dụng tiết kiệm nhất các nguồn tài
nguyên của máy tính và đặt biệt chạy nhanh nhất có thể được,
được gọi là tính hiệu quả của thuật toán. Tính hiệu quả của thuật
toán gồm 2 nhân tố cơ bản:
1. Dung lượng không gian nhớ cần thiết để lưu dữ liệu vào, các
kết quả tính toán trung gian và các kết quả của thuật toán.
Thuật toán và độ phức tạp
Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính
xác các phép toán, hoặc hành động cần thực hiện,...để cho ta lời
giải của bài toán.
Một vấn đề quan trọng của thuật toán là ta phải đánh giá và so
sánh được các thuật toán với nhau. Nói chung tiêu chuẩn để đánh
giá một thuật toán là tốt hay không chủ yếu dựa trên độ phức tạp
của nó, tức là dựa trên số thời gian cần dùng để thực hiện nó.
Tiêu chuẩn: Thuật toán sử dụng tiết kiệm nhất các nguồn tài
nguyên của máy tính và đặt biệt chạy nhanh nhất có thể được,
được gọi là tính hiệu quả của thuật toán. Tính hiệu quả của thuật
toán gồm 2 nhân tố cơ bản:
1. Dung lượng không gian nhớ cần thiết để lưu dữ liệu vào, các
kết quả tính toán trung gian và các kết quả của thuật toán.
2. Thời gian cần thiết để thực hiện thuật toán. Một thuật toán
có hiệu quả được xem là thuật toán có thời gian chạy ít hơn
so với các thuật toán khác.
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Trong phương pháp thử nghiệm, 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 nào
đó. Thời gian chạy chương trình phụ thuộc vào các nhân tố sau:
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Trong phương pháp thử nghiệm, 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 nào
đó. Thời gian chạy chương trình phụ thuộc vào các nhân tố sau:
1. Các dữ liệu vào
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Trong phương pháp thử nghiệm, 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 nào
đó. Thời gian chạy chương trình phụ thuộc vào các nhân tố sau:
1. Các dữ liệu vào
2. Chương trình dịch để chuyển chương trình thành mã máy.
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Trong phương pháp thử nghiệm, 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 nào
đó. Thời gian chạy chương trình phụ thuộc vào các nhân tố sau:
1. Các dữ liệu vào
2. Chương trình dịch để chuyển chương trình thành mã máy.
3. Tốc độ thực hiện các phép toán của máy tính được sử dụng
để chạy chương trình.
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Trong phương pháp thử nghiệm, 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 nào
đó. Thời gian chạy chương trình phụ thuộc vào các nhân tố sau:
1. Các dữ liệu vào
2. Chương trình dịch để chuyển chương trình thành mã máy.
3. Tốc độ thực hiện các phép toán của máy tính được sử dụng
để chạy chương trình.
Vì thời gian chạy chương trình phụ thuộc vào nhiều nhân tố nên ta
không thể biểu diễn chính xác thời gian chạy là bao nhiêu đơn vị
thời gian chuẩn.
Có 2 cách tiếp cận để đánh giá thời gian thực hiện của một thuật
toán: phương pháp thử nghiệm và phương pháp lý thuyết.
Trong phương pháp thử nghiệm, 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 nào
đó. Thời gian chạy chương trình phụ thuộc vào các nhân tố sau:
1. Các dữ liệu vào
2. Chương trình dịch để chuyển chương trình thành mã máy.
3. Tốc độ thực hiện các phép toán của máy tính được sử dụng
để chạy chương trình.
Vì thời gian chạy chương trình phụ thuộc vào nhiều nhân tố nên ta
không thể biểu diễn chính xác thời gian chạy là bao nhiêu đơn vị
thời gian chuẩn.
Trong phương pháp lý thuyết, ta sẽ coi thời gian thực hiện thuật
toán như là 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, có ảnh hưởng quyết định đến
thời gian thực hiện chương trình. Thông thường cỡ của dữ liệu vào
là một số nguyên dương n. Ta sẽ sử dụng hàm số T (n), trong đó n
là cỡ dữ liệu vào, để biểu diễn thời gian thực hiện một thuật toán.
Chúng ta có thể xác định thời gian thực hiện T (n) là số phép toán
sơ cấp cần phải tiến hành khi thực hiện thuật toán. Ví dụ các phép
toán số học +,-,*,/, và các phép toán so sánh =,<,>,6, > là các
phép toán sơ cấp.
Dùng O(f (x)) để đánh giá thời gian thực hiện thuật toán
Dùng O(f (x)) để đánh giá thời gian thực hiện thuật toán

Định nghĩa
Giả sử n là số nguyên không âm. T (n) và f (n) là các hàm thực
không âm. Ta viết T (n) = O(f (n)) nếu và chỉ nếu tồn tại các
hằng số dương c, n0 sao cho T (n) 6 c.f (n), ∀n > n0 .
Dùng O(f (x)) để đánh giá thời gian thực hiện thuật toán

Định nghĩa
Giả sử n là số nguyên không âm. T (n) và f (n) là các hàm thực
không âm. Ta viết T (n) = O(f (n)) nếu và chỉ nếu tồn tại các
hằng số dương c, n0 sao cho T (n) 6 c.f (n), ∀n > n0 .

Ví dụ
Giả sử T (n) = 3n2 + 4n + 5. Ta có
3n2 + 4n + 5 6 3n2 + 4n2 + 5n2 = 12n2 , ∀n > 1. Vậy
T (n) = O(n2 ).
Dùng O(f (x)) để đánh giá thời gian thực hiện thuật toán

Định nghĩa
Giả sử n là số nguyên không âm. T (n) và f (n) là các hàm thực
không âm. Ta viết T (n) = O(f (n)) nếu và chỉ nếu tồn tại các
hằng số dương c, n0 sao cho T (n) 6 c.f (n), ∀n > n0 .

Ví dụ
Giả sử T (n) = 3n2 + 4n + 5. Ta có
3n2 + 4n + 5 6 3n2 + 4n2 + 5n2 = 12n2 , ∀n > 1. Vậy
T (n) = O(n2 ).
Thông thường f (n) là các hàm số sau:
f (n) = 1; f (n) = log n, f (n) = nα , f (n) = 2n , f (n) = n!.
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
O(n) Tuyến tính
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
O(n) Tuyến tính
O(n log n) n log n
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
O(n) Tuyến tính
O(n log n) n log n
O(n2 ) Bình phương
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
O(n) Tuyến tính
O(n log n) n log n
O(n2 ) Bình phương
O(n3 ) Lập phương
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
O(n) Tuyến tính
O(n log n) n log n
O(n2 ) Bình phương
O(n3 ) Lập phương
O(2n ) Mũ
Kí hiệu O(f (x)) của f (x) Độ phức tạp loại
O(1) Hằng
O(log ) Logarit
O(n) Tuyến tính
O(n log n) n log n
O(n2 ) Bình phương
O(n3 ) Lập phương
O(2n ) Mũ
O(n!) Giai thừa

Danh sách này sắp xếp theo thứ tự tăng dần của hàm thời gian
thực hiện. Ví dụ, giả sử thuật toán A có thời gian thực hiện là
TA (n) = O(n2 ), thuật toán B có thời gian thực hiện là
TB (n) = O(n log2 n) thì với n = 1024 thuật toán A cần 1048576
phép toán sơ cấp, còn thuật toán B đòi hỏi 10240 phép toán sơ
cấp. Với n càng lớn thì thuật toán A càng đòi hỏi thời gian thực
hiện nhiều hơn rất nhiền lần so với thuật toán B.
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Tính chất của hàm thời gian
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Tính chất của hàm thời gian
1. Nếu T (n) = O(f (n)), f (n) = O(g (n)) thì T (n) = O(g (n)).
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Tính chất của hàm thời gian
1. Nếu T (n) = O(f (n)), f (n) = O(g (n)) thì T (n) = O(g (n)).
2. Nếu T1 (n) = O(f1 (n)), T2 (n) = O(f2 (n)) thì
T1 (n) + T2 (n) = O(max(f1 (n), f2 (n)))
Các quy tắc cơ bản tính thời gian thực hiện thuật toán
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Tính chất của hàm thời gian
1. Nếu T (n) = O(f (n)), f (n) = O(g (n)) thì T (n) = O(g (n)).
2. Nếu T1 (n) = O(f1 (n)), T2 (n) = O(f2 (n)) thì
T1 (n) + T2 (n) = O(max(f1 (n), f2 (n)))
Các quy tắc cơ bản tính thời gian thực hiện thuật toán
I Các phép gán, đọc, viết, goto là câu lệnh. Các lệnh này là
lệnh đơn và thời gian thực hiện là O(1).
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Tính chất của hàm thời gian
1. Nếu T (n) = O(f (n)), f (n) = O(g (n)) thì T (n) = O(g (n)).
2. Nếu T1 (n) = O(f1 (n)), T2 (n) = O(f2 (n)) thì
T1 (n) + T2 (n) = O(max(f1 (n), f2 (n)))
Các quy tắc cơ bản tính thời gian thực hiện thuật toán
I Các phép gán, đọc, viết, goto là câu lệnh. Các lệnh này là
lệnh đơn và thời gian thực hiện là O(1).
I Nếu S1 , S2 , . . . , Sn là các câu lệnh thì Begin S1 , S2 , . . . , Sn
End là câu lệnh. Thời gian thực hiện lệnh này được xác định
bởi quy tắc tổng.
Các quy tắc để đánh giá thời gian thực hiện thuật toán
Tính chất của hàm thời gian
1. Nếu T (n) = O(f (n)), f (n) = O(g (n)) thì T (n) = O(g (n)).
2. Nếu T1 (n) = O(f1 (n)), T2 (n) = O(f2 (n)) thì
T1 (n) + T2 (n) = O(max(f1 (n), f2 (n)))
Các quy tắc cơ bản tính thời gian thực hiện thuật toán
I Các phép gán, đọc, viết, goto là câu lệnh. Các lệnh này là
lệnh đơn và thời gian thực hiện là O(1).
I Nếu S1 , S2 , . . . , Sn là các câu lệnh thì Begin S1 , S2 , . . . , Sn
End là câu lệnh. Thời gian thực hiện lệnh này được xác định
bởi quy tắc tổng.
I Nếu S1 , S2 là các câu lệnh và E là biểu thức logic thì If E
then S1 và If E then S1 else S2 là câu lệnh. Giả sử thời gian
thực hiện lệnh S1 , S2 là O(f1 (n)) và O(f2 (n)) thì khi đó thời
gian thực hiện lệnh If là O(max(f1 (n), f2 (n))).
I Nếu S1 , S2 , . . . , Sn là các câu lệnh, E là biểu thức có kiểu thứ
tự đếm được và v1 , v2 , . . . , vn là các giá trị có cùng kiểu với E
thì Case E of v1 : S1 ; v2 : S2 ; . . . , vn : Sn ; End là câu lệnh.
Đánh giá thời gian thực hiện lệnh Case giống như lệnh If.
I Nếu S1 , S2 , . . . , Sn là các câu lệnh, E là biểu thức có kiểu thứ
tự đếm được và v1 , v2 , . . . , vn là các giá trị có cùng kiểu với E
thì Case E of v1 : S1 ; v2 : S2 ; . . . , vn : Sn ; End là câu lệnh.
Đánh giá thời gian thực hiện lệnh Case giống như lệnh If.
I Nếu S là câu lệnh, E là biểu thức logic thì While E do S là
câu lệnh. Thời gian thực hiện lệnh While được đánh giá như
sau: giả sử thời gian thực hiện lệnh S là O(f (n)), giả sử g (n)
là số tối đa các lần thực hiện lệnh S khi thực hiện lệnh While.
Khi đó thời gian thực hiện lệnh While là O(f (n).g (n))
I Nếu S1 , S2 , . . . , Sn là các câu lệnh, E là biểu thức có kiểu thứ
tự đếm được và v1 , v2 , . . . , vn là các giá trị có cùng kiểu với E
thì Case E of v1 : S1 ; v2 : S2 ; . . . , vn : Sn ; End là câu lệnh.
Đánh giá thời gian thực hiện lệnh Case giống như lệnh If.
I Nếu S là câu lệnh, E là biểu thức logic thì While E do S là
câu lệnh. Thời gian thực hiện lệnh While được đánh giá như
sau: giả sử thời gian thực hiện lệnh S là O(f (n)), giả sử g (n)
là số tối đa các lần thực hiện lệnh S khi thực hiện lệnh While.
Khi đó thời gian thực hiện lệnh While là O(f (n).g (n))
I Nếu S1 , S2 , . . . , Sn là các câu lệnh, E là biểu thức logic thì
Repeat S1 , S2 , . . . , Sn Until E là câu lệnh. Thời gian thực hiện
lệnh Repeat được đánh giá như sau: giả sử thời gian thực hiện
lệnh S là O(f (n)), giả sử g (n) là số tối đa các lần thực hiện
lệnh S khi thực hiện lệnh Repeat. Khi đó thời gian thực hiện
lệnh Repeat là O(f (n).g (n)).
I Với S là câu lệnh, E1 , E2 là biểu thức cùng một kiểu thứ tự
đếm được thì For i:=E1 to E2 do S, For i:=E2 downto E1 do S
là câu lệnh. Thời gian thực hiện lệnh For được đánh giá tương
tự như thời gian thời gian thực hiện lệnh While và lệnh
Repeat.
I Với S là câu lệnh, E1 , E2 là biểu thức cùng một kiểu thứ tự
đếm được thì For i:=E1 to E2 do S, For i:=E2 downto E1 do S
là câu lệnh. Thời gian thực hiện lệnh For được đánh giá tương
tự như thời gian thời gian thực hiện lệnh While và lệnh
Repeat.
I Đánh giá thủ tục hoặc hàm đệ quy.
I Với S là câu lệnh, E1 , E2 là biểu thức cùng một kiểu thứ tự
đếm được thì For i:=E1 to E2 do S, For i:=E2 downto E1 do S
là câu lệnh. Thời gian thực hiện lệnh For được đánh giá tương
tự như thời gian thời gian thực hiện lệnh While và lệnh
Repeat.
I Đánh giá thủ tục hoặc hàm đệ quy.
Ví dụ. Đánh giá thời gian thực hiện của hàm đệ quy sau:
Function fact(n: integer): integer;
Begin
If n 6 1 then fact:=1 else fact:=n*fact(n-1);
End;
Với n = 1 chỉ cần thực hiện lệnh gán fact:=1, do đó
T (1) = O(1). Với n > 1 cần thực hiện lệnh gán
fact:=n*fact(n-1). Do đó thời gian T (n) sẽ là O(1) để thực
hiện phép nhân và phép gán cộng với thời gian T (n − 1) để
thực hiện lời gọi đệ quy fact(n-1). Như vậy, T(1)=O(1),
T(n)=O(1)+T(n-1)=(n-1)O(1)+T(1) hay T(n)=O(n).
I Với S là câu lệnh, E1 , E2 là biểu thức cùng một kiểu thứ tự
đếm được thì For i:=E1 to E2 do S, For i:=E2 downto E1 do S
là câu lệnh. Thời gian thực hiện lệnh For được đánh giá tương
tự như thời gian thời gian thực hiện lệnh While và lệnh
Repeat.
I Đánh giá thủ tục hoặc hàm đệ quy.
Ví dụ. Đánh giá thời gian thực hiện của hàm đệ quy sau:
Function fact(n: integer): integer;
Begin
If n 6 1 then fact:=1 else fact:=n*fact(n-1);
End;
Với n = 1 chỉ cần thực hiện lệnh gán fact:=1, do đó
T (1) = O(1). Với n > 1 cần thực hiện lệnh gán
fact:=n*fact(n-1). Do đó thời gian T (n) sẽ là O(1) để thực
hiện phép nhân và phép gán cộng với thời gian T (n − 1) để
thực hiện lời gọi đệ quy fact(n-1). Như vậy, T(1)=O(1),
T(n)=O(1)+T(n-1)=(n-1)O(1)+T(1) hay T(n)=O(n).
Các thuật toán cơ bản và độ phức tạp
Các thuật toán cơ bản và độ phức tạp

Ví dụ
Xác định độ phức tạp của thuật toán của hàm tính dãy số
Fibonacci:
Các thuật toán cơ bản và độ phức tạp

Ví dụ
Xác định độ phức tạp của thuật toán của hàm tính dãy số
Fibonacci:
Function Fibo(n: integer): integer;
var i,j,k: integer;
Begin
i:=1;j:=0;
For k:=1 to n do Begin j:=i+j; i:=j-i; End;
Fibo:=j; End;
Thời gian thực hiện của thuật toán trên là O(n).
Một bài toán thường có nhiều thuật toán để giải, mỗi thuật toán
khác nhau có thể có độ phức tạp khác nhau. Đánh giá độ phức tạp
thuật toán là một trong những cách phân tích, so sánh và tìm ra
trong những thuật toán đó một thuật toán tối ưu.
Một bài toán thường có nhiều thuật toán để giải, mỗi thuật toán
khác nhau có thể có độ phức tạp khác nhau. Đánh giá độ phức tạp
thuật toán là một trong những cách phân tích, so sánh và tìm ra
trong những thuật toán đó một thuật toán tối ưu.
Ví dụ
Xét bài toán tính giá trị đa thức

P(x) = an x n + an−1 x n−1 + . . . + a1 x + a0 , x = x0 ;


Một bài toán thường có nhiều thuật toán để giải, mỗi thuật toán
khác nhau có thể có độ phức tạp khác nhau. Đánh giá độ phức tạp
thuật toán là một trong những cách phân tích, so sánh và tìm ra
trong những thuật toán đó một thuật toán tối ưu.
Ví dụ
Xét bài toán tính giá trị đa thức

P(x) = an x n + an−1 x n−1 + . . . + a1 x + a0 , x = x0 ;

Thuật toán 1. Tính giá trị từng hạng tử của đa thức


Với i=1 đến n tính ai x0i .
n
ai x0i + a0 = P(x0 ).
P
Tính
i=1
Một bài toán thường có nhiều thuật toán để giải, mỗi thuật toán
khác nhau có thể có độ phức tạp khác nhau. Đánh giá độ phức tạp
thuật toán là một trong những cách phân tích, so sánh và tìm ra
trong những thuật toán đó một thuật toán tối ưu.
Ví dụ
Xét bài toán tính giá trị đa thức

P(x) = an x n + an−1 x n−1 + . . . + a1 x + a0 , x = x0 ;

Thuật toán 1. Tính giá trị từng hạng tử của đa thức


Với i=1 đến n tính ai x0i .
n
ai x0i + a0 = P(x0 ).
P
Tính
i=1
Thuật toán 2. Đa thức P(x) có thể viết dưới dạng
P(x) = (. . . ((an x + an−1 )x . . .)x + a0 .
P := an . Với i=1 đến n: P = Px0 + an−i . Như vậy, P(x0 ) = P.
Một bài toán thường có nhiều thuật toán để giải, mỗi thuật toán
khác nhau có thể có độ phức tạp khác nhau. Đánh giá độ phức tạp
thuật toán là một trong những cách phân tích, so sánh và tìm ra
trong những thuật toán đó một thuật toán tối ưu.
Ví dụ
Xét bài toán tính giá trị đa thức

P(x) = an x n + an−1 x n−1 + . . . + a1 x + a0 , x = x0 ;

Thuật toán 1. Tính giá trị từng hạng tử của đa thức


Với i=1 đến n tính ai x0i .
n
ai x0i + a0 = P(x0 ).
P
Tính
i=1
Thuật toán 2. Đa thức P(x) có thể viết dưới dạng
P(x) = (. . . ((an x + an−1 )x . . .)x + a0 .
P := an . Với i=1 đến n: P = Px0 + an−i . Như vậy, P(x0 ) = P.
n(n + 1) n(n + 3)
Thuật toán 1 cần +n = phép tính.
2 2
Một bài toán thường có nhiều thuật toán để giải, mỗi thuật toán
khác nhau có thể có độ phức tạp khác nhau. Đánh giá độ phức tạp
thuật toán là một trong những cách phân tích, so sánh và tìm ra
trong những thuật toán đó một thuật toán tối ưu.
Ví dụ
Xét bài toán tính giá trị đa thức

P(x) = an x n + an−1 x n−1 + . . . + a1 x + a0 , x = x0 ;

Thuật toán 1. Tính giá trị từng hạng tử của đa thức


Với i=1 đến n tính ai x0i .
n
ai x0i + a0 = P(x0 ).
P
Tính
i=1
Thuật toán 2. Đa thức P(x) có thể viết dưới dạng
P(x) = (. . . ((an x + an−1 )x . . .)x + a0 .
P := an . Với i=1 đến n: P = Px0 + an−i . Như vậy, P(x0 ) = P.
n(n + 1) n(n + 3)
Thuật toán 1 cần +n = phép tính.
2 2
Thuật toán 2 cần 2n phép tính
Ví dụ
Phân tích thuật toán Euclide tìm ước số chung lớn nhất của 2 số
nguyên dương a,b.
Input: a,b là 2 số nguyên dương
Output: ước số chung lớn nhất của hai số a,b.
Function USCLN(a,b)
Begin
x:=a; y:=b;
While y 6= 0 Begin r:=x mod y; x:=y; y:=r; End;
USCLN:=x;
End;
Ví dụ
Phân tích thuật toán Euclide tìm ước số chung lớn nhất của 2 số
nguyên dương a,b.
Input: a,b là 2 số nguyên dương
Output: ước số chung lớn nhất của hai số a,b.
Function USCLN(a,b)
Begin
x:=a; y:=b;
While y 6= 0 Begin r:=x mod y; x:=y; y:=r; End;
USCLN:=x;
End;
Để đánh giá độ phức tạp của thuật toán trên, ta đếm số phép chia
thực hiện theo thuật toán.
Mệnh đề
Giả sử cặp số a, b (a>b) đòi hỏi n > 1 phép chia trong thuật toán
Euclide. Khi đó a > fn+1 , b > fn , trong đó {fn } là dãy Fibonacci,
được xác định bởi công thức truy hồi
fn+2 = fn+ fn+1 , n > 2, f0 = f1 = 1 và có công
 thức tường minh
√ !n+1 √ !n+1
1 1+ 5 1− 5
fn = √  − 
5 2 2
Mệnh đề
Giả sử cặp số a, b (a>b) đòi hỏi n > 1 phép chia trong thuật toán
Euclide. Khi đó a > fn+1 , b > fn , trong đó {fn } là dãy Fibonacci,
được xác định bởi công thức truy hồi
fn+2 = fn+ fn+1 , n > 2, f0 = f1 = 1 và có công
 thức tường minh
√ !n+1 √ !n+1
1 1+ 5 1− 5
fn = √  − 
5 2 2

Mệnh đề
Đặt m = max{a, b}, khi đó thuật toán đòi hỏi không quá
log3/2 (2m/3) phép chia.
Vậy độ phức tạp của thuật toán Euclide là O(log3/2 (2m/3))
Bài tập
Bài tập

Đánh giá độ phức tạp của các thuật toán sau:


1. Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số
thực.
Bài tập

Đánh giá độ phức tạp của các thuật toán sau:


1. Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số
thực.
2. Thuật toán tìm phần tử bé nhất của một tập con của tập hợp
số tự nhiên.
Bài tập

Đánh giá độ phức tạp của các thuật toán sau:


1. Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số
thực.
2. Thuật toán tìm phần tử bé nhất của một tập con của tập hợp
số tự nhiên.
3. Thuật toán xếp lại một dãy theo thứ tự tăng dần.
Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số thực.

You might also like