Knuth, Kỹ thuật nhánh và cận branch and bound Kỹ thuật biến ựổi Fourier Fourier transform Thuật toán di truyền genetic algorithm Tìm hiểu và trình bày về chủ ựề Minh hoạ và giải thắch ph
Trang 1Thuật toán nâng cao
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
2
Mục ựắch
giải quyết bài toán
Trang 2Tài liệu tham khảo
1 Introduction to algorithms, T.H Cormen, C.E Leiserson,
R.R Rivest, Mit Press 1990
2 Type de Données et Algorithmes, M-C Gaudel, M Soria, C
Froidevaux, Ediscienne international, 1993
3 Cours Complexité, M Daniel, ESIL, 2006
4 Data structures and algorithms, Alfred V Aho, John E
Hopcroft, Addison-Wesley, 1983
5 Algorithm Analysis and Computational Comlexity, Ian
Parberry, Lecture Notes, University of North Texas, 2001
6 The Art of Computer Programming, Volume 2, D Knuth,
Kỹ thuật nhánh và cận (branch and bound)
Kỹ thuật biến ựổi Fourier (Fourier transform)
Thuật toán di truyền (genetic algorithm)
Tìm hiểu và trình bày về chủ ựề
Minh hoạ và giải thắch phương pháp bởi ắt nhất 2 vắ dụ
cụ thể
đánh giá và phân tắch giải pháp các vắ dụ
Học viên tự tìm kiếm các tài liệu liên quan ựến chủ ựề
Báo cáo từ 10 ựến 20 trang
Báo cáo phải trắch dẫn rỏ ràng các tài liệu tham khảo
Giới thiệu (1)
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
8
Giới thiệu
Thuật toán là một dãy xác ựịnh các thao tác cơ bản áp dụng trên dữ liệu vào nhằm ựạt ựược giải pháp cho một vấn ựề
Tìm một giải pháp hiệu quả
Phân biệt giải thuật và chương trình
Chương trình là cài ựặt thuật toán bằng một ngôn ngữ lập trình
Trang 3Giới thiệu
(input) và tạo các dữ liệu ra (output)
nếu thuật toán dừng cho kết quả ñúng với
mọi dữ liệu vào
liệu vào chứ không chỉ là một mẫu dữ liệu vào
Trang 4Giới thiệu
So sánh hai phần tử liên tiếp nhau từ trái qua phải,
nếu không ñúng thứ tự thì hoán ñổi vị trí chúng
n = n – 2endwhile
15
Giới thiệu
Các thao tác trong thuật toán phải ñược ñặc tả chặt chẽ
Ở mỗi bước thực thi, bước tiếp theo sẽ ñược thực thi phải
p = 1for i from 1 to n do
p = p * i;
endforend
gt2 (n)begin
if (n = 0) return (1)else
return (n*gt(n-1))endif
end
Trang 5Kêt hợp ngôn ngữ tự nhiên và các kí hiệu toán học
Sơ ñồ khối, ngôn ngữ giả, …
Ngôn ngữ giả tựa C/Pascal kết hợp ngôn ngữ tự nhiên
if (ñiều kiện) then
…else
…endif
for … from … to … do
…endfor
while () do
…endwhile
19
Giới thiệu
ñặt chúng vào trong 15 ngăn kéo Chúng ta
cần phải thực hiện thế nào ñể có thể lấy ñược
loại ñinh chúng ta cần một cách nhanh nhất?
Trường hợp xấu nhất: phải mở 15 ngăn kéo
Trường hợp trung bình: giả sử xác xuất lấy các loại ñinh ngang nhau, phải mở 8 ngăn kéo
Nếu những loại ñinh trong các ngăn kéo cuối cùng luôn ñược sử dụng, cần nhiều lần mở các ngăn kéo
8 2 16
* 15
* 15
1 15
1 15
∑ i
Trang 6Giới thiệu
Giải pháp Las Vegas
Chúng ta chọn ngăn kéo ñể mở một cách ngẫu nhiên
Nếu may mắn, chúng ta có loại ñinh cần lấy
Nếu không, chúng ta loại bỏ ngăn kéo vừa mở, thực
hiện mở ngăn kéo khác một cách ngẫu nhiên
8151
31311413
*1514214115141
15
1 =
=++
Xếp vào các ngăn kéo theo thứ tự trên
Nếu lại mở các ngăn kéo từ trái sang phải thì sẽ không thu ñược lợi ích gì
Mở các ngăn kéo theo phương pháp tìm kiếm nhị phân
Trường hợp xấu nhất: 4 lần mở ngăn kéo
Trường hợp trung bình: 3.26
Giải pháp chỉ có ý nghĩa khi chúng ta thường xuyên mởcác ngăn kéo lấy ñinh
26.34158315421521151
=+++
23
Giới thiệu
Thuật toán nhân hai số nguyên
Thuật toán nhân Bắc Mỹ
Trang 7Giới thiệu
Thuật toán nhân Ả-rập
So sánh ñộ hiệu quả các thuật toán ?
282420
211815
141210
0706
0 5
ðếm số phép toán nhân và cộng ñược thực hiện
Thuật toán nhân Bắc Mỹ và thuận toán nhân Anh ñều sửdụng 12 phép nhân và 15 phép cộng
Thuật toán Ả-rập sử dụng 12 phép nhân và 20 phép cộng
Số phép toán phụ thuộc vào số chữ số của mỗi số nguyên
Số phép nhân bằng m*n với m và n lần lượt là số chữ số của mỗi số nguyên
3159042
1579524
789768
3948817
1974435
987270
4936141
2468283
1234567
699678
Ưu ñiểm: không cần ghi nhớ các kết quảnhân trung gian, chỉcần thực hiện phép cộng và chia cho 2
28
Giới thiệu
Thuật toán nhân « chia ñể trị »
Số chữ số của hai số nguyên phải bằng nhau và phải bằng luỹ thừa 2
Nếu số chữ số của hai số nguyên khác nhau thì thêm vào các
Trang 8Thuật toán nhân « chia ñể trị »
Giảm số phép nhân a và b bởi các nữa của a và b từ 4 xuống còn 3
Số phép nhân sử dụng bởi thuật toán này ñược ñánh giá
y = xendiffor i from 1 to n do
y = y * xendfor
Trang 9Ý tưởng: sử dụng các kết quả trung gian
Nguyên tắc: nếu n/2 = 0 thì xn= xn/2* xn/2 nếu không thì
1. Biểu diễn n bởi dãy nhị phân
2. Thay mỗi bít nhị phân
Biểu diễn n bởi dãy nhị phân: ek-1ek-2…e0
if ek-1= 0 then
y = 1 // khi n = 0else
y = xendif
for i from k-2 to 0 do
y = y * y
if ei= 1 then
y = y * xendif
1
số phép nhâny
ei
Trang 10Giới thiệu
Thuật toán nhị phân: giải thích
Biểu diễn nhị phân của n:
Giả sử chúng ta ñang trong quá trình tính xn Gọi j là vị trí
bít bên cuối cùng (trái nhất) biểu diễn n, yjlà kết quả cuối
cùng có ñược Ban ñầu: j = p, yp= x = xAp
Có hai khả năng của Aj-1
Aj-1= 1 Thay thế Aj-1bởi SX Vậy yj-1= yj2* x
Aj-1= 0 Thay thế Aj-1bởi S Vậy yj-1= yj2
Cả hai trường hợp: yj-1= yj2* xAj-1
Vậy: yp-1= yp * xAp-1= (xAp)2* xAp-1 = x2Ap + Ap-1
Bằng truy hồi:
∑=
i i
i A
n A
x x
y
p i i
=
= ∑=0 21
Tuy nhiên, chúng ta có thể tính x15bởi:
x2, x3, x6, x12, x15= x12* x3Nghĩa là chỉ cần sử dụng 5 phép nhân
Trang 11Chứng minh sự ựúng ựắn
(2)
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
42
Phân tắch thuật toán
ựợi sau một số bước thực hiện
Chứng minh rằng thuật toán cho kết quả ựúng với
mọi dữ liệu vào
44
Ưu nhược ựiểm
-Khó thực hiện
-Không thể áp dụng cho các thuật toán phức tạp
-Không bảo ựảm hoàn toàn tắnh ựúng ựắn
Nhược ựiểm
-Bảo ựảm tắnh ựúng ựắn
-đơn giản hơn
-Dễ thực hiện
Ưu ựiểm
Lý thuyếtThực nghiệm
Trang 12Chứng minh sự ñúng ñắn
46
Tiền ñiều kiện và hậu ñiều kiện
Tiền ñiều kiện (preconditions)
Các tính chất mà dữ liệu vào phải thoả mãn
Hậu ñiều kiện (postconditions)
Các tính chất mà kết quả của thuật toán phải thoả mãn
Trạng thái của thuật toán
Trạng thái của thuật toán
là tập các giá trị tương ứng với tất cả các biến ñược sử
dụng trong thuật toán
thay ñổi
nó thoả mãn hậu ñiều kiện
Trang 13Chứng minh ñúng ñắn một phần (partial correctness)
Chứng minh rằng khi dữ liệu vào thoả mãn tiền ñiều kiện thìkết quả thuật toán sẽ thoả mãn hậu ñiều kiện
Chứng minh ñúng ñắn toàn phần (total correctness)
Chứng minh rằng thuật toán ñúng ñắn một phần và thuật toán dừng
Các bước trung gian trong chứng minh sự ñúng ñắn
Phân tích trạng thái của thuật toán
Phân tích sự ảnh hưởng của mỗi bước xử lý ñến trạng thái của thuật toán
51
Chứng minh sự ñứng ñắn
A sẽ
cho kết quả thoả mãn Q
dừng sau một số bước xử lý hữu hạn
Xác ñịnh các tiền ñiều kiệnvàhậu ñiều kiện
Chú thích thuật toán bằng cánh chèn thêm các xác nhận liên quan ñến trạng thái của thuật toán sao cho
tiền ñiều kiện ñược thoả mãn
xác nhận cuối cùng phải bao hàm hậu ñiều kiện
Chứng minhrằng mỗi bước xử lý, thuật toán ñi từ xác nhận trước xử lý ñến xác nhận sau xử lý
Trang 14-xác nhận cuối cùng bao hàm hậu ñiều kiện
Thì-dãy lệnh tuần tự A ñúng
55
Quy tắc lệnh tuần tự
Hai biến x và y nhận hai giá trị tương ứng a và b Hoán
ñổi giá trị hai biến x và y
Thì
{P} A {Q}
Nghĩa là:
Nếu-tiền ñiều kiện P bao hàm xác nhận ñầu tiên-C có thể ñược ñịnh giá
-cả hai nhánh ñều bao hàm hậu ñiều kiện
Thì-lệnh ñiều kiện A ñúng
Trang 151 Nếu nó dừng, nóthoả mãn hậu ñiều kiện
2 Nódừngsau một số bước hữu hạn
phần
59
Bất biến vòng lặp
ðịnh nghĩaMột bất biến vòng lặp I làmột xác nhận thoả mãn:
1. Bất biến vòng lặp ñúng khi bắt ñầu vòng lặp
2. Trong quá trình lặp (tức
là ñiều kiện c ñúng) thìbất biến vòng lặp I luôn ñúng
3. Khi thoát khỏi vòng lặp (tức là ñiều kiện c sai) thì bất biến vòng lặp I phải bao hàm hậu ñiều kiện
Khi xác ñịnh ñược bất biến vòng lặp, nghĩa là ñã
chứng minh ñược thuật toán ñúng ñắn một phần
min (x[1 n])begin
Trang 16- nếu i=n, m=min(x[j], j=1 n)
chính là hậu ñiều kiện
T phụ thuộc biến ñếm của vòng lặp p
Sau lần lặp thư nhất p = 1, sau lần lặp thứ hai p = 2, …
Nếu ñiều kiện vòng lặp ñúng,thì ip< n, vậy T(p) > 0Nếu T(p) = 0, thì n – ip = 0Khi ñó ñiều kiện vòng lặp sai
postconditions: ∃i∈[1 n]: a[i]=x, ∀k∈[1 i-1]:a[k]≠x
Chứng minh thuật toán sau là ñúng
timphantu (a[1 n], x)begin
i = 1while (a[i] ≠x) do
i = i + 1endwhilereturn (i)end
Trang 17-nếu a[i+1]≠x thì a[k] ≠x, k=1 i, nghĩa là I ñúng-nếu a[i+1]=x thì ta có hậu ñiều kiện Q
i = 1while (a[i] ≠x) do
i = i + 1
{ip=ip-1+1}
endwhilereturn (i)end
Nếu ñiều kiện a[ip]≠x ñúng, thìk>ip, vậy T(p) >0
Nếu T(p) = 0, thì k=ip, khi ñó ñiều kiện a[ip]≠x sai
67
Nhận xét
kiện
1 Viết thuật toán tính n! và chứng minh nó ñúng ñắn
2 Thuật toán sau làm gì ? Chứng minh câu trả lời
begin
m = n
k = 0b[0] = m MOD 2
m = m DIV 2while (m ≠0) do
k = k + 1b[k] = m MOD 2
m = m DIV 2endwhileend
Trang 18Bài tập
3 Thuật toán sau làm gì ? Chứng minh câu trả lời
4 Viết thuật toán tắnh giá trị trung bình các phần tử của
mảng a[1 n] Chứng minh thuật toán ựúng ựắn
// cho b[1 n], ∀i: b[i] = 0 hoặc b[i] = 1
Phụ thuộc vào dữ liệu vào
độ 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
độ phức tạp có ý nghĩa khi n lớn
đánh giá ựộ phức tạp thuật toán nhằm
Nghiên cứu hoạt ựộng của thuật toán
Tối ưu hay không
Phát hiện những phần phức tạp, làm chậm thuật toán
So sánh các giải pháp khác nhau trong cùng ngữ cảnh
vấn ựề
ngôn ngữ
máy tắnh
Trang 19thường mâu thuẩn nhau
Chúng ta thường tìm cách giảm ựộ phức tạp về mặt thời
gian
bỏ qua ựộ phức tạp về mặt bộ nhớ
Dẫn ựến
thường làm tăng ựộ phức tạp về mặt bộ nhớ
làm tăng ề ựộ phức tạp trắ tuệ Ừ của thuật toán
Thời gian phát triển
Rủi ro xảy ra lỗi
đánh giá một cách chi tiết thuật toán
Tất cả các câu lệnh ựều ựược xem xét
đánh giá riêng rẽ các hoạt ựộng khác nhau
Thường chỉ ựánh giá tập các thao tác cơ bản
thời gian thực thi thuật toán tỷ lệ thuận với số các thao tác này
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
Các thao tác cơ bản ựược ựánh giá riêng rẽ
Sự lựa chọn tập các thao tác cơ bản phụ thuộc
kắch thước dữ liệu
chi tiết cần ựánh giá
khả năng phân tắch
Ầ
Trang 20Tính ñộ phức tạp
các nguyên tắc tính ñộ phức tạp như sau:
ðố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
ðố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 I1else I2) ≤P(C) + max(P(I1), P(I2))
ðố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
78
Tính ñộ phức tạ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
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)Begin
If (n = 1) then
factorial = 1Elsefactorial = n * factorial (n-1)EndIf
End
Thao tác cơ bản: số phép nhân
C(0) = 0C(n) = C(n-1) + 1
Dữ liệu tương ứng với sự tổ chức ñược xem là trung bình
Không ñơn giản ñể xác ñịnh
p(d) : xác xuất xuất hiện của d
Trang 21For i from 1 to nFor j from 1 to nC(i,j) = 0For k from 1 to nC(i,j) = C(i,j) + A(i,k) * B(k,j)EndFor
EndForEndForEnd
Quan hệ: CminA(n) ? CmoyA(n) ? CmaxA(n)
84
Tính ñộ phức tạp: ba trường hợp
q: xác xuất X ở trong danh sách L
X trong L: khả năng xuất hiện tại các vị trí như nhau
Dn,i: tập dữ liệu với X ở vị trí i, p(Dn,i) = q/n
Dn,0: tập dữ liệu với X không thuộc L, p(Dn,0) = 1-q
Trang 22notations) theo n và thay ñổi của hàm khi mà n rất lớn
87
Các hàm tiệm cận
f = o(g) khi n → ∞nếu:
g(n) là tiệm cận trên của f(n) với mọi hằng số c
∞
→ g n n fn
88
Các hàm tiệm cận
f = O(g) khi n → ∞nếu:
g(n) là tiệm cận trên của f(n) với một số hằng số c
Nếu f = o(g) thì f = O(g)
f(n) không tăng nhanh hơn g(n)
,
∃
Trang 230 2
Trang 24n f
f = Ω(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 = Θ(g)
ñộ phức tạp của f ≤ ñộ phức tạp của g (theo các hằng số xác ñịnh)
Giả sử CminA(n) = 8n2+ 2n + 1 và CminB(n) = 1000n2+ 10n
+ 2 là các hàm biểu diễn thoà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
i θ1 1
i
) ( 1 1
2 2
i
i i
) ( 1 1
Trang 25Truy hồi bậc hai
Các họ hệ thức truy hồi thường gặp (tiếp)
Truy hồi hoàn toàn
tuyến tính:
an= b1an-1 + b2an-2 + … + bk an-k + … + + bn-1 a1 + g(n)
không tuyến tính: …
n-1 hạng ñầu tiên phải có giá trị
Truy hồi phân hoạch
an= b an/2+ c an/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
Nhiều trường hợp, rất phức tạp ñể giải hệ thức truy hồi
ðề cập ñến giải hệ thức
truy hồi tuyến tính bậc nhất
Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số
truy hồi phân hoạch
∑ bn -i
Trang 26b b
g y
y
i 2 1 i n
1 i 0
=+
=
b
b b
g (a
a
i 2 1 i n
1 i 0 n
1 i
(gọi là phương trình ñặc trưng của hệ thức truy hồi)
Trong trường hợp tổng quát, ta thu ñược hai nghiệm phân
Phương trình ñặc trưng của hệ thức truy hồi: r2-r-2=0
Nghiệm của phương trình ñặc trưng: r1= 2 và r2= -1
Trang 27Hệ thức truy hồi
Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số (3)
Nếu phương trình ñặc trưng có nghiệm kép thì nghiệm của
Phương trình ñặc trưng của hệ thức truy hồi: r2-4r+4=0
Phương trình ñặc trưng có nghiệm kép: r = 2
vậy, thông thường b = c (= 1)
g(n): chi phí phân tích và trộn các giải pháp con
Truy hồi phân hoạch (2)
Thường ñược xét dưới dạng:
k b
1
0
i k k
i i k
1
0 log
i k
i i c n
b
n g c n
=+
Trang 28n n
i i
) (
1
0 log
i k
i
i c
n
b
n g c n
1
0 2 log 2 + −
k
i i n
n n
a
) 1 2 ( 2
=
− +
=
k k
i i
a
) 1 2 ( log
2 − − +
a
1 log2 +
Trang 29độ phức tạp thực tế
Vắ dụ (1)
đánh giá ựộ phức tạp của thuật toán sắp xếp chèn (insertion sort)
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 tjlà số lần thực thi lệnh lặp
// chèn A[j] vào mảng ựã ựược sắp xếp A[1 j-1]
While (i > 0 and A[i] > key) do c4
Tổng thời gian thực thi là
độ 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:
1()1(
2 4 3 2
=
n c t c t c t c n c n c n c n
n
j j
115
độ phức tạp thực tế
Vắ dụ (2)
độ 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
6 5 4 3 2 1 2 6
5
4
7 6 5 4
3 2
1
2222
2
2
)1(2)1(2)1(12)1()1()1
(
)
c c c c n c c c c c c c n c
c
c
n c n c n c n c n c n
−
+ + + − − ++
+ +
=
−+
−+
−+
+ −+
−+
−
+
=
2)1()1(,12)1(,2)1(
2 2
=+
n
j n
j n
j
116
độ phức tạp thực tế
độ phức tạp trong trường hợp trung bình
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
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] ?
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]
Trang 30độ phức tạp thực tế
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àΘ)
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
Khi n lớn, chúng ta bỏ qua luôn hằng số của số hạng
Các lớp thuật toán theo ựộ phức tạ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))
Các lớp thuật toán theo ựộ phức tạp
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
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
Tuyến tắnh:
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
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
đa thức: O(nk), các thuật toán ựược xem là chậm khi k>3
Hàm mũ: O(kn), k≥2, các thuật toán là không thể ứng dụng ựược
Các thuật toán sử dụng ựược thường có ựộ phức tạp ≤O(n3)
119
Các lớp thuật toán theo ựộ phức tạp
∞
1018
1012
19 931 56819.931
100
1024
103
10033.23.32
10
21
100
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
Trang 31if (x ≤A[m]) then return (timkiemnhiphan (A, x, l, m))
else return (timkiemnhiphan (A, x, m+1, r))
Hàm ñược ñịnh nghĩa ñệ quy
Thuật toán ñệ quy
1khi n x x n khi
function ham_mu (x, n)
begin
if (n=0) then ham_mu = 1else ham_mu = x * ham_mu(x, n-1)endif
ðệ quy
lời gọi ñệ quy
if ((n=0) or (n=1)) then fib = 1else fib = fib(n-1) + fib(n-2)endif
end
Trang 32ðệ quy
Các ñịnh nghĩa ñược gọi là ñệ quy chéo nếu chúng phụ
even
) 1 (
0 )
( )
1 (
0 )
(
function even (n)
begin
if (n=0) then even = true
else even = odd(n-1)
endif
end
function odd (n)begin
if (n=0) then odd = falseelse odd = even(n-1)endif
ðệ quy
Các ñịnh nghĩa ñược gọi ñệ quy lồng nhau
=
else n m A m A
n m if m A m if n n m A
))1,(,1(
0,0)1,1(
01),(
function Ackermann (m, n)begin
if (m=0) then Ackermann = n+1else if (n=0) Ackermann = Ackermann(m-1,1)else Ackermann = Ackermann(m-1, Ackermann(m, n-1))endif
endifend
127
ðệ quy
Chúng ta cần có
một số trường hợp mà giải pháp xác ñịnh – « trường hợp
ñơn giản »: các trường hợp dừng của ñệ quy
Dãy các giá trị liền nhau của các tham số ñược gọi phải
thay ñổi ñơn ñiệu và ñạt ñến một giá trị mà giải pháp
tương ứng ñã ñược xác ñịnh
128
ðệ quy
Dãy các giá trị b, b-a, b-2a … liên tuc giảm cho ñến khi a≥b thì sẽ dừng, trường hợp ñã ñược xác ñịnh
function divisor (a, b) // giả sử a>0, b>0begin
if (a≥b) then
if (a=b) divisor = trueelse divisor = falseendif
else divisor=divisor(a, b-a)endif
end
Trang 33chương trình P
bộ dữ liệu D
Ra
ñúng, nếu chương trình P dừng trên bộ dữ liệu D
sai, nếu ngược lại
end
Vấn ñề dừng là không thể xác ñịnh !
132
ðệ quy
Hãy cho biết kết quả của hai thuật toán sau
Thuật toán ñệ quy in dãy nhị phân tương ứng của một
số nguyên
T(n) // n≥0begin
if (n=0) then do nothingelse
T(n-1)print(n) //in nendif
end
G(n) // n≥0begin
if (n=0) then do nothingelse
print(n) //in nG(n-1)endifend
Trang 34ðệ quy
thể chồng các ñĩa có kích thước khác nhau,
nguyên tắc chồng ñĩa to dưới ñĩa nhỏ trên; yêu
cầu chuyển n ñĩa trên cọc A sang cọc C với các
ñiều kiện:
Mỗi lần chỉ ñược chuyển một ñĩa
Không khi nào có tình huống ñĩa to chồng trên ñĩa
ðể chuyển n ñĩa từ cọc A sang cọc C, thực hiện
chuyển n-1 ñĩa nhỏ hơn từ cọc A sang cọc B
chuyển ñĩa lớn nhất từ cọc A sang cọc C
chuyển n-1 ñĩa nhỏ hơn từ cọc B sang cọc C
Thuật toán
Hanoi(n, A, B, C) begin
if (n=1) then chuyển ñĩa lớn từ cọc A sang cọc Celse Hanoi(n-1, A, C, B)
chuyển ñĩa lớn từ cọc A sang cọc CHanoi(n-1, B, A, C)
endifend
−
=
=
else n
C n
C
n if n
C
1 1 1
1 1
C
n if n
C
1 1 2
1 1
…
f(a, b, c)
…end
Trang 35if (n = 1) thenfactorial = 1elsefactorial = n * factorial(n-1)endif
endn-1 phép nhân
n phép so sánh
n lời gọi hàm
Khử ñệ quy
tương ñương không chứa lời gọi ñệ quy
Sử dụng vòng lặp
ðệ quy kết thúc (terminal recursion)
Thuật toán ñược gọi là ñệ quy kết thúc nếu nó không chứa bất kỳ xử lý nào sau lời gọi ñệ quy
ðệ quy không kết thúc (non terminal recursion)
Thuật toán ñược gọi là ñệ quy không kết thúc nếu nó chứa các xử lý nào sau lời gọi ñệ quy
C : ñiều kiện phụ thuộc U
D : xử lý cơ bản của thuật toán
α(U) : biểu diễn sự chuyển ñổi tham số
T : xử lý dừng
P’(U) beginwhile C doD
U = α(U)endwhileTend
if (l≤r) then
m = (l+r)/2
if (X = A[m]) then bsearch = melse if (X < A[m]) then bsearch = bsearch(X, A, l, m-1)else bsearch = bsearch(X, A, m+1, r)
endifendifelsebsearch = 0endif
end
Trang 36bsearch’ = 0
end
142
Khử ñệ quy
Cần ghi nhớ lại ngữ cảnh của lời gọi ñệ quy
ñiển hình là các tham số của lời gọi ñệ quy
Sử dụng cấu trúc ngăn xếp (stack) ñể ghi nhớ ngữ cảnh
Các thao tác với ngăn xếp
U = α(U)endwhileT(U)while not isempty(S) do
U = top(S)E(U)pop(S)endwhileend
Gọi Q’(U0) ?
Trang 37if (n=0) then do nothingelse
while (n>0) dopush(S, n)
n = n-1endwhilewhile (not isempty(S)) do
n = top(S)print(n) //in npop(S)endwhileendif
if C(U) thenB(U)Q(α(U))E(U)elseT(U)endifend
begincreate(S)push(S, (newcall, U))while not isempty(S) do(state, V) = top(S)pop(S)
if (state = newcall) then
U = V
if C(U) thenB(U)push(S, (end, U))push(S, (newcall, α(U)))else T(U)
endifendif
if (state = end) then
U = VE(U)endifendwhileend
if (n=0) then do nothingelse
T(n-1)print(n) //in nendif
end
T’(n) begincreate(S)push(S, (newcall, n))while not isempty(S) do(state, k) = top(S)pop(S)
if (state = newcall) then
if (k>0) thenpush(S, (end, k))push(S, (newcall, k-1))else do nothingendifendif
if (state = end) thenprint(k)endifendwhileend
Trang 38Hãy thực hiện
1.Xây dựng thuật toán ựệ quy tắnh Fib(n)
2.Chứng minh rằng ựộ phức tạp (bởi số phép cộng) của thuật toán làΩ(2n/2)
3.Xây dựng thuật toán tắnh cặp (Fib(n), Fib(n-1)) với n > 0
4.Sử dụng thuật toán trong câu 3 ựể xây dựng thuật toán mới tắnh Fib(n)
5.đánh giá ựộ phức tạp (bởi số phép cộng) của thuật toán trên
151
Bài tập
Bài 2
Ước số chung lớn nhất của hai số nguyên dương ựược ựịnh
nghĩa như sau
nếu x = y thì usc(x, y) = x
nếu x > y thì usc(x, y) = usc(x-y, y)
nếu x < y thì usc(x, y) = usc(x, y-x)
1. Xây dựng thuật toán ựệ quy tắnh ước số chung lớn nhất
hai số nguyên dương
2. Khử ựệ quy của thuật toán
Trang 39Chia ñể trị (Divide and Conquer)
Nhiều thuật toán có cấu trúc ñệ quy
ðể giải quyết vấn ñề ñặt ra, thuật toán gọi lại chính nó ñể
giải quyết các vấn ñề con có kích thước nhỏ hơn, cuối cùng
kết hợp các kết quả thu ñược giải pháp
Gồm các bước
Chia: chia vấn ñề thành các vấn ñề con
Trị: giải quyết các vấn ñề con một cách ñệ quy, nếu vấn
ñề con có kích thước ñủ nhỏ thì giải quyết trực tiếp
Kết hợp: các kết quả của các vấn ñề con là giải pháp cho
phân tích x thành nhiều bài toán con x1, x2, … xkfor i from 1 to k do
yi = chia-ñể-trị(xi)endfor
kết hợp các giải pháp yithành giải pháp y của xreturn (y)
endifend
Thuật toán vét cạn
maxmin(A, n)beginmax = A[1]
Trang 40(max1, min1) = maxmin(A, x, (x+y)/2)
(max2, min2) = maxmin(A, (x+y)/2+1, y)
return (max(max1, max2), min(min1, min2))
2212
11
)12/)(x y y x y y x n
C n if n
C
2 ) 2 / ( 2
2 1
) (
3 1 2 2 2 2 1 2 1 2
2 ) 2 ( 2 2 ) 2 / ( 2
2 2 2 ) 8 / ( 2
2 2 ) 4 / ( 2 2 ) 2 / ( 2 )
log log 1 log 1 log
1 log
1 1 log 1
2 3 3
2 2
+
=
− +
=
−
− +
=
+
= +
=
+ + +
=
+ +
C
n C n C n C n
C
n n n n
n
k k n
i k k i i
Thuật toán chia ñể trị chỉ sử dụng 75% số phép toán so sánh
so với thuật toán vét cạn
for i from 1 to nfor j from 1 to nC(i,j) = 0for k from 1 to nC(i,j) = C(i,j) + A(i,k) * B(k,j)endfor
endforendforreturn (C)end
Thuật toán thực hiện O(n3) phép cộng và phép nhân