Ví dụ: Với thuật toán Insertion-Sort - Thuật toán mô tả chính xác từng bước thực hiện - Thuật toán dừng sau hữu hạn bước - Các kết quả trung gian ở mỗi bước được xác định một cách đơn t
Trang 11 Khái niệm thuật toán
- Thuật toán (Algorithm) được biết đến từ
thế kỷ IX do nhà toán học người Ba tư al-Khowarizmi đưa ra
ánh xạ từ tập các đầu vào nào đó vào tập các đầu ra nhất định.
gồm một dãy các bước cần thực hiện
để từ một đầu vào cho trước nó cho một đầu ra.
Trang 2Ví dụ: Bài toán sắp xếp một dãy số theo
thứ tự tăng dần.
Đầu vào : Một dãy số (a1, , an)
Đầu ra : Một hoán vị (a1(k), ,an(k)) sao cho
a1(k) <= <= an(k)
Trang 3Thuật toán Insertion-Sort:
Procedure Insertion-Sort (a, n)
Trang 62 Các tính chất của thuật toán
- Tính chính xác (Precision): Thuật toán phải được mô
tả chính xác.
- Tính hữu hạn (Finiteness): Dừng và cho kết quả sau
hữu hạn bước.
- Tính đơn trị (Uniqueness): Các kết quả trung gian ở
mỗi bước phải được xác định đơn trị phụ thuộc vào đầu vào và kết quả của bước trước.
- Tính phổ dụng (Generality): Áp dụng được cho một
lớp bài toán.
Ví dụ: Với thuật toán Insertion-Sort
- Thuật toán mô tả chính xác từng bước thực hiện
- Thuật toán dừng sau hữu hạn bước
- Các kết quả trung gian ở mỗi bước được xác định một
cách đơn trị, chỉ phụ thuộc vào và kết quả ở bước trước
- Thuật toán áp dụng được cho một lớp bài toán
Trang 73 Các cấu trúc của thuật toán
- Cấu trúc tuần tự
- Cấu trúc lựa chọn
- Cấu trúc lặp
Trang 84 Biểu diễn thuật toán
- Có nhiều cách biểu diễn
- Quy ước về biểu diễn thuật toán bằng ngôn
ngữ giả code:
+ Việc viết dòng thụt vào biểu thị cấu trúc khối + Ký hiệu “” : Lời chỉ dẫn phía sau
+ j i: Gán giá trị của i cho j
+ j i e: Gán giá trị của e cho i và j
+ Các cấu trúc lặp WHILE, FOR, và REPEAT
và các cấu trúc điều kiện IF, THEN, và ELSE được thể hiện giống như trong Pascal
Trang 95 Phân tích thuật toán?
những đánh giá về thời gian tính và bộ nhớ cần thiết để thực hiện thuật toán.
- Phân tích có thể cho biết tính khả thi
của thuật toán từ đó có thể loại các thuật toán không tốt
- Lượng thời gian tính và bộ nhớ cần
thiết để thực hiện thuật toán được gọi là
độ phức tạp của thuật toán
* Ở đậy ta chỉ quan tâm đánh giá về thời gian
tính.
Trang 106 Một số khái niệm cơ bản.
- Kích thước dữ liệu đầu vào: Số bít cần thiết
để biểu diễn nó
- Phép toán cơ bản: Phép toán có thể thực
hiện với thời gian bị chặn bởi một hằng số không phụ thuộc vào kích thước dữ liệu đầu vào (Phép tính số học, so sánh, gán, )
Từ số lượng phép toán cơ bản => Thời gian
thuật toán đòi hỏi.
Đánh giá độ phức tạp thuật toán là đánh giá
số phép toán cơ bản như là hàm của kích thước dữ liệu đầu vào.
Trang 116 Một số khái niệm cơ bản (tiếp)
- Thời gian tính tốt nhất của thuật toán là thời
gian tối thiểu để thực hiện thuật toán với mọi
bộ dữ liệu đầu vào kích thước n
- Thời gian tính tồi nhất của thuật toán là thời
gian nhiều nhất để thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n
- Thời gian tính trung bình của thuật toán là
thời gian trung bình để thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n
Trang 12Ví dụ Xét thuật toán tìm số lớn nhất trong một dãy hữu
hạn số.
Đầu vào: Một dãy số (a1, , an)
Đầu ra: Số lớn nhất của dãy – max
Trong thuật toán này, số n là đại lượng hợp lý nhất
để đánh giá kích thước đầu vào Khi đó thời gian
Trang 137 Các ký hiệu tiệm cận
Trong thực tế, người ta thường quan tâm
tốc độ tăng của thời gian tính khi tăng kích thước đầu vào hơn thời gian chính xác mà thuật toán đòi hỏi Chẳng hạn thời gian tính của một thuật toán với kích đầu vào n là
t(n)=60n2 + 9n+9 Với n đủ lớn, t(n) xấp xỉ bằng n2 Khi đó ta
nói t(n) có bậc là n2 Viết t(n)= Θ (n2).
Ta có các định nghĩa:
Trang 147 Các ký hiệu tiệm cận (tiếp)
Giả sử f và g là các hàm đối số nguyên dương
- Ta nói f(n) có bậc không quá g(n), viết
f(n)=O(g(n)) nếu tồn tại hằng số dương c
và số nguyên dương n0 sao cho
|f(n)| ≤ c |g(n)| với mọi n>n0.
- Ta nói f(n) có bậc ít nhất là g(n), viết
f(n)= Ω (g(n)) nếu tồn tại hằng số dương c
và số nguyên dương n0 sao cho
|f(n)| ≥ c |g(n)| với mọi n>n0.
- Ta nói f(n) có bậc là g(n), viết f(n)= Θ (g(n))
nếu f(n)=O(g(n)) và f(n)= Ω (g(n))
Trang 15Ví dụ Giả sử k là số nguyên dương Chứng
minh rằng 1k +2k+ +nk có bậc là nk+1.
Ta có
1k +2k+ +nk ≤ nk+nk+ +nk = n.nk = nk+1Suy ra 1k +2k+ +nk =O(nk+1)
Mặt khác
1k +2k+ +nk ≥ [n/2]k+ +nk
≥ [n/2]k+ +[n/2]k ≥ n/2.[n/2]k = nk+1/2k+1Suy ra 1k +2k+ +nk = Ω (nk+1)
Vậy 1k +2k+ +nk = Θ (nk+1)
Trang 16Bài tập.
1 Chứng minh rằng mọi đa thức bậc k hệ số dương
Pk(n)=aknk + ak-1nk-1+ +a1n+a0
có bậc là nk (nghĩa là Pk(n)= Θ(nk)
2 Chứng minh rằng
lg n!= Θ(n lg n)Hướng dẫn lgn! =lgn+lgn-1+ +lg1>=lgn+ +lgn/2
>=lgn/2+ +lgn/2=n/2.lgn/2
>= (nlgn)/4
Trang 17Định nghĩa thời gian tính của thuật toán.
Nếu thuật toán đòi hỏi thời gian tính tốt nhất là t(n) với
kích thước đầu vào n và t(n)=O(g(n)) thì thời gian tính tốt nhất của thuật toán có bậc không quá g(n)
(hay thời gian tính tốt nhất của thuật toán có bậc
là O(g(n))
Nếu thuật toán đòi hỏi thời gian tính tồi nhất là t(n) với
kích thước đầu vào n và t(n)=O(g(n)) thì thời gian tính tồi nhất của thuật toán có bậc không quá g(n) (hay thời gian tính tồi nhất của thuật toán có bậc
là O(g(n))
Nếu thuật toán đòi hỏi thời gian tính trung bình là t(n)
với kích thước đầu vào n và t(n)=O(g(n)) thì thời gian tính tồi nhất của thuật toán có bậc không quá g(n) (hay thời gian tính trung bình của thuật toán
có bậc là O(g(n))
Trang 18Khái niệm bậc ít nhất của thời gian tính tốt nhất, tồi
nhất, trung bình của thuật toán được định nghĩa tương tự bằng cách thay O bởi Ω và “không quá” bởi “ít nhất” trong định nghĩa trên
Nếu thời gian tính tốt nhất (tồi nhất, trung bình) của
thuật toán vừa là O(g(n)) vừa là Ω(g(n)) thì ta nói thời gian tính tốt nhất (tồi nhất, trung bình) của thuật toán là Θ(g(n))
!!! Khi nói thời gian tính của thuật toán là O(f(n)) ta hiểu đó là
thời gian tính trong tình huống tồi nhất Còn khi nói thời gian tính của thuật toán là Ω(f(n)) ta hiểu đó là thời gian tính trong tình huống tốt nhất.
Trang 19Ví dụ 1 Đánh giá số lần thực hiện câu lệnh
x:=x+1 trong đoạn chương trình sau:
Trang 20Ví dụ 2 Đánh giá số lần thực hiện câu lệnh x:=x+1 trong đoạn
Ký hiệu số lần thực hiện của câu lệnh là t(n) Ta có:
+ Lần lặp while đầu tiên (j=n), câu lệnh x:=x+1 thực hiện n lần
Vì vậy t(n)= Ω (n) (vì t(n)>n)
+ Sau lần lặp đầu tiên đó, j:=j div 2 => j<n/2.
+ Ký hiệu k là số lần lặp của vòng while, khi đó số lần lặp của
câu lệnh x:=x+1 không quá n+n/2+n/4+ +n/2 k-1 Nghĩa là
t(n) < n+n/2+n/4+ +n/2 k-1 = n(1-1/2 k )/(1-1/2) = 2n(1-1/2 k )<2n Suy ra t(n)=O(n)
Vậy số lần thực hiện câu lênh x:=x+1 là t(n) = Θ (n 2 )
Trang 21Ví dụ 3 Đánh giá thời gian tính của thuật toán
Trang 22Rõ ràng, thời gian tính của thuật toán có thể đánh giá bởi số lần thực
hiện của câu lệnh i:=i+1;
Ta có:
Nếu s1:=key => câu lệnh i:=i+1 thực hiện 1 lần => thời gian tính tốt nhất
Nếu key không có trong dãy => câu lệnh i:=i+1 thực hiện n+1 lần =>
Ta sẽ tính thời gian trung bình t(n) của thuật toán
bình của thuật toán là
Trang 23Đánh giá độ phức tập của thuật toán là việc làm
không đơn giản Thông thường, ta sử dụng các đánh giá sau:
Dạng đánh giá Tên gọi
Trang 24Một số tính chất của các ký hiệu tiệm cận
Trang 261 Phân tích độ phức tạp của các cấu trúc
1.1 Cấu trúc tuần tự
Giả sử P, Q là 2 đoạn độc lập của một thuật
toán với thời gian tính tương ứng là T(P) và T(Q).
Quy tắc tuần tự Thời gian đòi hỏi bởi (P; Q)
(thực hiện P rồi tiếp theo thực hiện Q) sẽ là
T(P;Q) = T(P)+T(Q).
Vì vậy
T(P; Q) = Θ (max(T(P),T(Q));
Trang 271.2 Cấu trúc lặp
a) Vòng lặp For
Xét vòng lặp
For i:=1 to n do P(i);
Nếu thời gian tính của P(i) là t với mọi i:=1 n
và không tính đến thời gian tổ chức vòng
lặp thì thời gian thực hiện vòng lặp là mxt
Trong trường hợp tổng quát, gọi t(i) là thời gian
thực hiện P(i) Nếu không tính đến thời gian
tổ chức vòng lặp thì thời gian tính của vòng lặp trên là
T= ∑m
i=1t(i).
Trang 28Ví dụ Xét thuật toán tìm số Fibonacci thứ n sau:
Nếu xem các phép toán số học đòi hỏi thời gian là
hằng số thì thời gian tính của thuật toán là Θ(n)
Trang 29b) Vòng lặp While và Repeat
Xét vòng lặp
While B do P; hoặc Repeat P Until B;
Việc phân tích các vòng lặp này rất khó khăn vì
không biết số lần lặp.
Kỹ thuật cơ bản:
- Cần xác định một hàm của các biến trong
vòng lặp sao cho nó có giá trị giảm dần trong quá trình lặp Vòng lặp dừng nếu hàm nhận giá trị nguyên dương
- Coi vòng lặp như một thuật toán đệ quy
Trang 30Ví dụ Xét thuật toán tìm tìm kiếm nhị phân sau:
Trang 31Hướng dẫn Để phân tích thuật toán này, ta xác định
hàm d:=j-i+1 Như vậy d là số lượng phần tử của mảng T cần được khảo sát
Vòng lặp bắt đầu với d=n và kết thúc khi d<=1 (tương
ứng với i>=j)
Thời gian tính của thuật toán này là O(log n)
Ký hiệu d, d’ là giá trị của j-i+1 và i, j, i’, j’ là giá trị của
i, j trước và sau khi thực hiện vòng lặp
Khi đó:
- Nếu x<T[k], thì i’=i, j’=(i+j) div 2 -1
do đó d’=j’-i’+1=(i+j) div 2 -1-i+1
<=(i+j)/2 – i < (j-i+1)/2=d/2
Trang 32- Nếu x >T[k], thì j’=j, i’=(i+j) div 2 +1
do đó d’=j’-i’+1=j-(i+j) div 2
<=j-(i+j-1)/2 – i < (j-i+1)/2=d/2
- Nếu x = T[k] thì d’=1 và d>=2
Vậy ta luôn có d’<=d/2 Do vòng lặp dừng khi d<=1
nên thuật toán phải dừng
Tính thời gian tính của thuật toán:
Gọi dm là giá trị của j-i+1 ở lần lặp thứ m, m>=1 và d0 =
Vì mỗi lần lặp, thời gian tính là hằng số nên ta có thời
gian tính của thuật toán là O(logn)
Trang 332 Công thức đệ quy
Việc đánh giá thời gian tính của các thuật toán đệ quy
là rất khó Ta thường xây dựng công thức đệ quy
để đánh giá thuật toán đệ quy
Công thức đệ quy thường gặp:
T(n)= Θ(1) nếu n<=cT(n)=T(n/b)+D(n)+C(n) nếu ngược lạiCác phương pháp giả công thức đệ quy:
+ Phương pháp đoán nhận
+ Phương pháp lặp
+ Định lý thợ
Trang 34C-1) Phương pháp đoán nhận
- Dự đoán lời giải
- Dùng quy nạp để chứng minh tính đúng đắn của
dự đoán
Ví dụ Giải công thức đệ quy T(n)=3T(n/3) +n
- Dự đoán: T(n)=O(n log n)
- Chứng minh điều dự đoán trên:
Ta cần chứng minh T(n)≤ c.n.logn Ta có
T(n) = 3T(n/3) +n ≤ 3.c n/3.log n/3+n
≤ c.n.log(n/3) + n ≤ c’.n.log(n), với c’≥ max(c,1/log3)
Vậy công thức đúng
Trang 35! Để dự đoán lời giải, ta thường sử dụng các cách
sau:
i) Dựa vào các lời giải tương tự đã gặp
ii) Chứng minh cận trên và cần dưới cho công thức
đệ quy Chẳng hạn nếu T(n)= Ω(n) và T(n)=O(n2)
- Do đó S(m)=O(mlogm) => T(n)=O(log n loglog n).
iv) Nếu không chứng minh được dự đoán => Điều
chỉnh số hạng tăng chậm trong dự đoán
Trang 36C-2) Phương pháp lặp
Thực hiện thế dần công thức đệ quy để biểu
diễn nó như là tổng của các số hạng chỉ phụ thuộc điều kiện đầu vào n.
Ví dụ Giải công thức đệ quy T(n)=3T(n/4)+n
Trang 37Khi đó T(n) có thể đánh giá tiệm cận như sau:
1 Nếu f(n)=O(nlogba- ε) với hằng số ε >0 nào đó,
thì T(n)= Θ (nlogba)
Trang 382 Nếu f(n)= Θ (nlogba), thì T(n)= Θ (nlogbalogn)
3 Nếu f(n)= Ω (nlogba+ ε) với hằng số ε >0 nào đó
và nếu a.f(n/b)< c.f(n) với hằng số c<1, thì T(n)= Θ (f(n)).
Định lý thợ rút gọn Giả sử a ≥ 1, b>1 là các
hằng số và T(n)=a.T(n/b)+c.nk, với n>0 Khi
đó ta có
1 Nếu a>bk thì T(n)= Θ (nlogba)
2 Nếu a=bk thì T(n)= Θ (nk log n)
3 Nếu a<bk thì T(n)= Θ (nk )
Trang 39Ví dụ 1 Giải công thức đệ quy T(n)=16T(n/4)+n
Áp dung định lý thợ với trường hợp (1): a=16, b=4 và
ε=1 ta có, f(n)=n= Θ(nlogba- ε ) => T(n)= Θ(nlogba)=
Θ(n2)
Ví dụ 2 Giải công thức đệ quy T(n)=T(3n/7)+1
Áp dung định lý thợ với trường hợp (2): a=1, b=7/3 ta
có, f(n)=1= O(nlogba) => T(n)= Θ(nlogbalogn)=
Θ(logn)
Ví dụ 3 Giải công thức đệ quy T(n)=3T(n/4)+nlogn
Áp dung định lý thợ với trường hợp (3): a=3, b=4 và
ε=(1-log43) ≈ 0.2 ta có, f(n)=n.logn=Ω(nlog43+ ε) (vì
nlog43+ ε≈n => n.logn > n) và lấy c=3/4
=> a.f (n/b)<c.f(n) Vậy T(n)= Θ(f(n))= Θ(nlogn)
Chú ý Có thể áp dụng định lý thợ rút gọn với các ví
dụ 1 và 2
Trang 403 Phương pháp sử dụng câu lệnh đặc trưng
- Câu lệnh đặc trưng là câu lệnh có số lần thực
hiện không ít hơn bất kỳ câu lệnh nào trong thuật toán
- Khi phân tích thuật toán ta chỉ quan tâm đến việc
đếm số lần thực hiện của câu lệnh đặc trưng
Ví dụ Với thuật toán Fibiter trên, ta chọn câu lệnh
j:=i+j là câu lệnh đặc trưng Khi đó ta có thời gian tính của thuật toán là Θ(n)
!Ngoài các phương pháp trên còn có các phương
pháp phân tích thuật toán khác, chẳng hạn phương pháp phân tích khấu trừ.
Trang 413 Phương pháp phân tích khấu trừ
- Giới thiệu
- Phương pháp tính toán chi li
Trang 43 Một bài toán có thể có nhiều lời giải khác
nhau Các lời giải có thể đã biết hoặc chưa biết
toán là đưa ra thời gian tính của thuật toán tốt nhất trong tất cả các thuật toán
Có 2 cách tiếp cận để giải quyết vấn đề
Trang 443.1 Đánh giá cận dưới
3.1.1 Độ phức tạp tính toán của bài toán
Ký hiệu T(A) là thời gian tính của thuật toán A với đầu
vào X Khi đó, thời gian tính trong tình huống tồi nhất của thuật toán A đối với dữ liệu vào kích thước n là
TA(n)=max{TA(X): |X|=n}
Độ phức tạp trong tình huống tồi nhất của bài toán P
là thời gian tính trong tình huống tồi nhất của thuật toán tốt nhất để giải nó Nghĩa là
TP(n) = min{TA(n): A ∈ ∆}=min{max{TA(X)|X|=n}:A ∈ ∆}Trong đó ∆ là tập tất cả các thuật toán giải bài toán P
Trang 45Cận trên Nếu thuật toán A giải bài toán P có thời gian tính trong
tình huống tồi nhất là TA(n) = O(f(n)) thì
TP(n) <= TA(n) =O(f(n)).
Nghĩa là ta có cận trên cho độ phức tập của bài toán P (vì mọi
thuật toán tốt hơn sẽ cho cận trên tốt hơn)
Cận dưới Việc đánh giá cận dưới của bài toán là chỉ ra mức độ
khó của bài toán
Để chỉ ra
Tp(n) = Ω (f(n))
ta cần chỉ ra rằng
i) Có thuật toán với thời gian tính Ω (f(n)) để giải bài toán P
ii) Mọi thuật toán giải bài toán P đều đòi hỏi thời gian tính trong
tình huống tồi nhất là Ω (f(n)).
Đòi hỏi ii) có thể thay bởi: Cận dưới cho độ phức tạp tính toán
của bài toán P là Ω (f(n)).
Trang 463.1.2 Các phương pháp đánh giá cận dưới độ phức tạp tính
toán của bài toán
a) PP sử dụng cây quyết định
• Cây quyết định là cây mà mỗi đỉnh của nó tương ứng với
một truy vấn dữ liệu Các cạnh của nó tương ứng với các khả năng trả lời câu hỏi Mỗi lá tương ứng với một đầu ra.
• Để tính toán với cây quyết định, ta bắt đầu từ gốc và đi
theo một đường đi đến lá Tại mỗi nút trung gian, câu trả lời cho truy vấn sẽ dẫn ta tới nut tiếp theo Khi đến lá, ta thu được một đầu ra.
• Thời gian tính của thuật toán cây quyết định là số truy vấn
trên đường đi từ gốc đến lá.
Như vậy,
⇒ Thời gian tính trong tình huống tồi nhất của thuật toán
sẽ là độ cao của cây quyết định
⇒ Số truy vấn là cận dưới cho thời gian tính.
Trang 47• Việc xác định cận dưới nhờ sử dụng cây
quyết định được dựa trên lập luận:
- “Các truy vấn đối với dữ liệu phải đảm bảo
đủ thông tin để có thể xác định được đầu ra
có thể”.
- Nếu bài toán có N đầu ra thì mọi cây quyết
đều có N lá
- Nếu cây có N lá và mỗi nút có nhiều nhất k
con thì độ cao của cây ít nhất là
logkN = Ω (log N)
- Số trung vấn là cận dưới cho thời gian tính.