Bài giảng Phân tích và thiết kế thuật giải - Bài 3 trình bày kiến thức về giải thuật đệ quy. Bài này gồm có một số nội dung sau: Thiết kế giải thuật đệ quy, tại sao dùng đệ quy, khi nào dùng đệ quy, đệ quy tuyến tính, đệ quy nhị phân,...và một số nội dung khác.
Trang 1GIẢI THUẬT ĐỆ QUY
PHÂN TÍCH THIẾT KẾ GIẢI THUẬT
Trang 3Giới thiệu
Chương trình đệ quy là chương trình gọi đến chính nó
Cần phải có điểm dừng chương trình/hàm (trường hợp suy biến)
Đệ quy tuyến tính
Đệ quy nhị phân
Đệ quy phi tuyến, đệ quy lồng
Đệ quy hỗ tương
Trang 4Thiết kế giải thuật đệ quy
Tham số hoá bài toán
Phân tích trường hợp chung (biểu diễn bài toán đồng dạng nhưng khác phạm vi hay kích thước giải quyết)
Xác định trường hợp dừng (suy biến)
Trang 5Tại sao dùng đệ quy
Ưu điểm: giải thuật đệ quy đơn giản hơn không đệ quy khi giải
quyết cùng một vấn đề => dễ thiết kế, hiểu, cài đặt và thay đổi
Nhược điểm : gọi hàm liên tục (tốn nhiều thời gian và không
gian bộ nhớ trong)
Trong đó, vấn đề chủ yếu phát sinh do số lần gọi hàm có tham
số, dẫn đến cần không gian lưu trữ trong stack
Trang 6Khi nào dùng đệ quy
Dùng đệ quy để thiết kế giải thuật khi muốn đơn giản
về hình thức so với cách viết thông thường
Thường được áp dụng cho các hàm có yếu tố lặp lại với ngữ cảnh thay đổi
Kiểm tra nếu nó không sử dụng quá nhiều bộ nhớ trong
Một số ngôn ngữ (LISP, Scheme) sử dụng đệ quy để tạo vòng lặp, nhưng tiến hành theo cách hiệu quả (dạng tail recursion)
Trang 7int CalAn(int A, int n) {
if(n==0) return A;
else if(n > 0 && (n %2) ==0)
return (n/2)*CalAn(A, n/2);
else
Trang 8}
Đệ quy tuyến tính là trường hợp đặc biệt của đệ quy nhị phân
Trang 10if(n == 0) res = 1;
else { res = n*n*calXn(n-1)+calYn(n-1); }
return res
Trang 11Tail Recursion = Iteration
Khi đệ quy chứa lệnh gọi chính nó ở cuối cùng, phía sau không còn lệnh nào nữa
Được gọi là tail recursion và hiệu quả như giải pháp lặp:
Trang 12Ví dụ tính giai thừa
0! = 1 n! = n*(n-1)!, n>0
} Bài đệ quy (và tail recursion) cho tập tại lớp: hãy viết hàm
yêu cầu trên
Trang 14Ví dụ tính dãy Fibonacci
Hỏi: độ phức tạp bằng bao nhiêu?
Trang 16 Trả về kết quả -1 ( not found)
Yếu tố khác: phần tử hiện hành trùng giá trị tìm
Trả về chỉ mục của phần tử đang xét
Cơ sở đệ quy: tìm phần còn lại, không bao gồm phần
tử đang xét
Trang 17Tìm tuyến tính
1. if the array is empty
2. return -1
3. else if first element matches target
4. return index of first element
5. else
6. return result of searching rest of the array, excluding the first element
Trang 18Tìm nhị phân
1. if array is empty
2. return -1 as result
3. else if middle element matches
4. return index of middle element as result
5. else if target < middle element
6. return result of searching lower portion of array
7. else
8. return result of searching upper portion of array
Trang 19Tìm nhị phân
Trang 20Tháp Hà Nội
• Có ba cột tháp kim cương đặt ở cửa đền Brahma ở Hà Nội
• Cột bên trái có 64 đĩa, mỗi đĩa kích thước khác nhau, được chồng lên nhau:
Trang 22Tháp Hà Nội-Minh hoạ với 3 đĩa
Ký hiệu: cột A, B, C
Dời đĩa trên
cùng từ A
Trang 23Tháp Hà Nội-Minh hoạ với 3 đĩa
Trang 24Tháp Hà Nội-Minh hoạ với 3 đĩa
Trang 25Tháp Hà Nội-Minh hoạ với 3 đĩa
Trang 26Tháp Hà Nội
Vấn đề cần giải quyết số lượng đĩa > 3
Liệu có viết được giải thuật với các vòng lặp được, nhưng hơi khó
Giải quyết bằng đệ quy
Trang 27cout << “\n\nThe Hanoi Towers!\n\n”
<< “Enter how many disks: “;
int numDisks;
cin >> numDisks;
Trang 28cout << “\n\nThe Hanoi Towers!\n\n”
<< “Enter how many disks: “;
int numDisks;
cin >> numDisks;
Move(numDisks, „A‟, „B‟, „C‟);
}
Trang 30Tháp Hà Nội – Thiết kế
b. Dời đĩa còn lại từ “nguồn” sang “đích”
c. Đệ quy: dời N-1 đĩa từ “trung gian” sang “đích”
Trang 31Tháp Hà Nội
Giải thuật:
0 Receive n, src, dest, aux
1 If n > 1:
a Move(n-1, src, aux, dest);
b Move(1, src, dest, aux);
c Move(n-1, aux, dest, src);
Else
Display “Move the top disk from “, src, “ to “, dest
End if
Trang 32Move(n-1, src, aux, dest);
Move(1, src, dest, aux);
Move(n-1, aux, dest, src);
Trang 33Tháp Hà Nội-4 đĩa
The Hanoi Towers
Enter how many disks: 4
move a disk from needle A to needle B
move a disk from needle C to needle B
move a disk from needle A to needle C
move a disk from needle B to needle A
move a disk from needle B to needle C
move a disk from needle A to needle C
move a disk from needle A to needle B
move a disk from needle C to needle B
move a disk from needle C to needle A
move a disk from needle B to needle A
Trang 3464 2 64 -1 (a big number) ~ 2 44 giây (giả sử
máy tính chạy 2 20 lệnh/giây)
Xấp xỉ 2 11 thế kỷ để chạy xong
Trang 35Bài toán đếm ô bất thường
Desire: Xử lý ảnh hai chiều với các thông tin có từ
X-Ray
MRI
Satellite imagery
Etc
Mục tiêu: xác định kích thước của vùng bất thường
dựa trên màu sắc
Trang 36Bài toán đếm ô bất thường
Trang 37Bài toán đếm ô bất thường
Algorithm count_cells(x, y):
Trang 38Bài toán đếm ô bất thường
int countCells(color grid[ROWS][COLS], int r, int c)
}
}
Trang 39Bài tập
Viết chương trình (vòng lặp, và đệ quy) để tìm số hạng
thứ n của dãy xác định bởi:
𝑎0 = 1, 𝑎1 = 3, 𝑎2 = 5, 𝑎𝑛 = 𝑎𝑛−1 + 𝑎𝑛−1 2 + 𝑎𝑛−2 3
Trang 40Giải Bài tập
Trang 41Đệ quy quay lui-Minh hoạ bằng bài toán 8
con hậu
Yêu cầu: các con hậu được đặt trên bàn cờ vua sao cho không “ăn” được lẫn nhau
Trang 42Bài toán 8 con hậu-Dựa trên kinh nghiệm
Nhận xét: mỗi con hậu phải ở trên một cột (domain knowledge)
Đặt con hậu vô mỗi hàng, cũng như chọn hàng cho từng con hậu
Đầu tiên, chọn ngẫu nhiên các hàng và hậu trên đó, sau đó mỗi vòng lặp di chuyển một con hậu sao cho không “ăn” lẫn nhau
Tuy nhiên có thể dẫn tới trường hợp không tìm được lời giải vì trạng thái ngẫu nhiên ban đầu không tốt
Trang 43Bài toán 8 con hậu-Đệ quy quay lui
(backtracking)
chéo của nó (vì hậu “ăn” ngang, dọc, xéo)
chéo Ghi nhận cột, đường chéo của hậu thứ hai này Tiếp tục cho hàng kế
Nếu không còn cột nào cho hậu ở hàng kế tiếp, buộc phải trở lại hàng trước đó và tìm chỗ khác cho hậu đã đặt (có khi xét ngược đến hàng đầu tiên)
Trang 44Bài toán 8 con hậu-Đệ quy quay lui
Trang 45Bài toán hôn nhân bền vững
Tìm stable matching giữa hai tập, trong đó mỗi phần tử
có ‘tiêu chuẩn thích’ khác nhau
Tìm cách ánh xã giữa từng phần tử giữa hai tập sao cho
‘thích’ gặp nhau nhiều nhất
Bài toán: Cho n man+n woman, mỗi người đánh số thứ tự
thích những người khác giới tính Ghép đôi từng cặp, sao cho tính ‘thích’ của họ là cao nhất
Trang 46Hôn nhân bền vững-Giải thuật Gale and Shapley
Mỗi man độc thân đề nghị woman thích nhất
Mỗi woman replies "maybe" man thích nhất and "no" cho các man còn lại
Sau đó, woman chọn man cô thích nhất
http://en.wikipedia.org/wiki/Stable_marriage_problem
Trang 47Hôn nhân bền vững-Giải thuật Gale and Shapley
function stableMatching {
Initialize all m ∈ M and w ∈ W to free
while ∃ free man m who still has a woman w to propose to {
w = m's highest ranked woman to whom he has not yet proposed
Trang 48Khử đệ quy
Một số nnlt không hỗ trợ gọi đệ quy (COBOL, FORTRAN)
thuật lặp Hai phương pháp phổ biến
trước
Trang 49Khử đệ quy-ví dụ quicksort
Sử dụng stack để lưu trữ các chỉ số đầu+cuối của dãy con
QuickSort không dùng đệ quy
Trang 50Bài tập
1. Bài tập thực hành: xây dựng chương trình giải quyết
bài toán toán hôn nhân bền vững
2. Bài tập thực hành: xây dựng chương trình giải quyết
bài toán toán 8 con hậu (nhóm 3 sinh viên)
3. Cài đặt các bài toán mergesort, quicksort, 8 hậu
không dùng đệ quy