Professional Documents
Culture Documents
Chapter 1 3 Recursion
Chapter 1 3 Recursion
REVIEW
Nội dung Định nghĩa đệ quy
Đối tượng bao gồm chính nó
Định nghĩa đệ quy hoặc được định nghĩa dưới
dạng chính nó.
Thuật toán đệ quy
VD. Định nghĩa một công thức hợp
Phân tích thuật toán đệ quy lệ của các biến, số và các phép toán
, ,∗,/, ^
Đệ quy có nhớ
là công thức hợp lệ nếu là
Thuật toán quay lui (backtracking algorithm) biến hoặc số
Nếu , là công thức hợp lệ thì
, , ∗ , / ,
^ cũng là công thức hợp lệ
1
1/10/2011
Hàm được định nghĩa đệ quy Định nghĩa đệ quy
Mọi định nghĩa đệ quy đều gồm 2 phần
1 ế 0
! Một trường hợp cơ sở (nhỏ nhất) có thể xử lý trực tiếp mà không
1 ! ế 0 cần đệ quy, và
Một phương thức tổng quát mà biến đổi một trường hợp cụ thể về
các trường hợp nhỏ hơn. Do đó biến đổi các trường hợp cho đến
1 ế 1, 2 khi về trường hợp cơ sở.
1 2 ế 2
0 ế 0
1 ế 1
2 1 2 ế 1
Thuật toán đệ quy
Chia lần 1
Thuật toán có chứa lời gọi đệ quy đến chính nó với đầu
vào kích thước nhỏ hơn.
Chia lần 2
VD. Sắp xếp trộn – MergeSort
MergeSort(int A[], int start, int end)
{ Chia lần 3
if(start<end)
{ Danh sách sau
int mid = (start+end)/2; khi chia
MergeSort(A, start, mid); Trộn lần 1
MergeSort(A, mid+1, end);
Merge(A,start,mid,end); Trộn lần 2
}
} Trộn lần 3
2
1/10/2011
Thuật toán đệ quy Phân tích thuật toán đệ quy
Mô tả thời gian thực hiện của thuật toán đệ quy bằng
công thức đệ quy Giải công thức đệ quy để tìm Θ hoặc Ο bằng:
VD. MergeSort có
Ο 1 ế 1 Phương pháp thay thế
2 Ο ế 1 Phương pháp cây đệ quy
2
Dùng định lý thợ
Bỏ qua với các giá trị n nhỏ (coi là hằng). Ta có thể viết lại
là
2 Ο
2
Phương pháp thay thế
Gồm 2 bước:
Đoán dạng của lời giải
Sử dụng quy nạp toán học để tìm ra các hằng và chứng minh
lời giải
Xác định cận trên của công thức đệ quy
Phương pháp thay thế 2 2
Đoán Ο log
Cần chứng minh log với hằng số 0 được chọn
phù hợp
3
1/10/2011
Phương pháp thay thế Phương pháp thay thế
Giả sử log đúng với ⁄ tức là Giả sử trường hợp cơ sở 1 1 nhưng 1log1 0.
⁄ ⁄ log ⁄ . Thay vào Kết quả quy nạp sai trong trường hợp cơ sở.
Ta có thể giải quyết vấn đề này khi sử dụng các ký hiệu
2 ⁄ log ⁄ tiệm cận (Ο, Ω, Θ)
log ⁄ log log2 log với
log Chọn sao cho với mọi thì kết quả luôn đúng
VD với 2 thì 2 2 1 2 4 2log2 với
hằng số ta chọn đủ lớn (VD 5).
Đúng với 1
Vậy Ο log với 5 và 2
Ta cần chỉ ra kết quả quy nạp này đúng trong mọi trường
hợp (đúng cả trong trường hợp cơ sở).
Phương pháp thay thế Phương pháp thay thế
Đoán dạng lời giải tốt: Tránh lỗi hay mắc
Thêm bớt 1 hằng số không làm thay đổi dạng kết quả 2 2 Ο
2 12 3 vẫn có dạng Ο log Sai do ta không chứng minh
Ban đầu nới lỏng cận trên, dưới để chứng minh rồi sau đó Thay đổi biến
giảm dần. 2 log
⁄
đặt log ta có 2 2 2
VD. Với trong ví dụ ban đầu ta có thể chọn Ω và đặt 2 ta có 2 ⁄
Ο rồi sau đó giảm giới hạn trên, tăng giới hạn dưới cho Ο log Ο log loglog
tới khi hội tụ về giá trị chính xác
4
1/10/2011
Một số tính chất của hàm mũ, loga, giai thừa
Ta có các công thức:
a = blogb a ; logb a = 1/(loga b)
Do đó, trong ký hiệu tiệm cận cơ số của log là không quan trọng:
O(lg n) = O(ln n) = O(log n)
Ví dụ. Chứng minh rằng Công thức Stirling:
2 1 là Ο log
1
n
n
n ! 2 n 1
e n
Giai thừa và hàm mũ:
2n < n! < nn với n > 5 ;
log n! = (n log n).
Vấn đề với phương pháp thay thế Ví dụ 2 (tiếp)
T(n) = 4T(n/2) + n
Dự đoán:
4c(n/2)2 + n
T(n) cn2 - dn n>n0
= cn2 + n Không cn2 !
5
1/10/2011
Ví dụ 2 (tiếp) Ví dụ 2 (tiếp)
Giả sử T(k) ck2 - dn, k<n. CM T(n) cn2 - dn. Giả sử T(k) ck2 - dn, k<n. CM T(n) cn2 - dn.
Khi n=1: Chuyển qui nạp, n>1:
T(n) = 4T(n/2) + n (định nghĩa)
T(n) = 1 Theo định nghĩa.
4(c(n/2)2 ‐ d(n/2)) + n (qui nạp)
1 c‐d Có thể chọn c, d thích hợp để có bất đẳng thức này = cn2 ‐ 2dn + n (biến đổi)
= cn2 ‐ dn ‐ (dn ‐ n) (biến đổi)
cn2 ‐ d*n (Chọn d1)
Ví dụ 2 (tiếp)
T(n) = 1 n=1
T(n) = 4T(n/2) + n n>1
Đã chứng minh:
6
1/10/2011
Phương pháp cây đệ quy Phương pháp cây đệ quy
Xét công thức đệ quy Ο
Cây đệ quy cho mergeSort
1 ế 1
2 ế 1
Phương pháp cây đệ quy Phương pháp cây đệ quy
Dùng phương pháp thay thế để chứng minh lời giải công
thức đệ quy tìm được.
VD. Ο Ο log
Bài tập: Xác định một cận trên tốt cho công thức đệ quy
3
log log
2 2 dùng phương pháp thế để xác nhận lại kết quả.
log log 3 log 2 log 3
3 3 3 3
2
log log 3 log 2
3
log
Với (chú ý log 2 1)
7
1/10/2011
Dùng định lý thợ
Dùng để giải các công thức đệ quy dạng
,
đó 1, 1, à à ệ ậ ươ
một cách hiệu quả.
Bài toán ban đầu được chia thành bài toán con có kích
thước mỗi bài là ⁄ , chi phí để tổng hợp các bài toán con
Định lý thợ là
Master theorem VD. Thuật toán sắp xếp trộn
chia thành 2 bài toán con, kích thước /2. Chi phí tổng hợp 2 bài
toán con là Ο
Dùng định lý thợ Dùng định lý thợ
Áp dụng định lý thợ:
Định lý thợ (Master Theorem)
1, 1 là các hằng số, là một hàm. định nghĩa đệ 9 .
quy trên các tham số không âm 9, 3 à ta có ≡ . Đây
⁄ , trong đó ⁄ có thể hiểu là ⁄ hoặc là trường hợp 1 (với 1) do đó Θ
⁄ . Thì có thể bị giới hạn một cách tiệm cận như sau:
1.
1, 3/2 và 1 ta có / 1. Đây là
Nếu Ο , với hằng 0 thì Θ trường hợp 2, do đó Θ log
Nếu Ο thì Θ log
3 log
Nếu Ω , với hằng 0, và nếu
3, 4 và log ta có ≡
⁄ với hằng 1 và với mọi n đủ lớn thì .
Ο , Ω với 0.2, ⁄
Θ
≡3 log với do vậy
Θ log (TH3)
8
1/10/2011
Dùng định lý thợ
Chú ý: Không phải trường hợp nào cũng áp dụng được
định lý thợ !
VD. 2 log
2, 2 và log
≡ do đó có vẻ áp dụng trường hợp 3.
Tuy nhiên log tiệm cận lớn hơn 2 với Đệ quy có nhớ
mọi hằng số do đó không thể áp dụng được.
Đệ quy có nhớ
Trong thuật toán đệ quy, những bài toán con có thể được
giải đi giải lại nhiều lần!
VD. Tính số Fibonacci
1 ế 0,1
1 2 ế 2
Tính 5
Ghi nhận lời giải: dùng mảng Thuật toán quay lui
Khi gặp bài toán con cần giải: Kiểm tra xem bài toán con Back‐tracking algorithm
đã được giải chưa:
Nếu đã giải: lấy kết quả
Ngược lại, giải bài toán con và cập nhật lời giải vào bảng
9
1/10/2011
Thuật toán quay lui Thuật toán quay lui
Bài toán 8 con hậu: “Hãy xếp 8 con hậu trên bàn cờ 8x8 Thuật toán xếp hậu: đặt lần lượt các quân hậu lên bàn cờ
sao cho chúng không thể ăn lẫn nhau” (theo 1 cách nào đó) sao cho quân hậu đặt sau không ăn
được quân đã đặt trước đó.
Thuật toán quay lui Thuật toán quay lui
solve_from (Current_config) Dead end: trạng thái chưa kết thúc, nhưng ta không thể
if Current_config đã chứa đủ 8 hậu đặt thêm được 1 quân hậu nào nữa.
print Current_config Khi rơi vào trạng thái dead end ta phải tiến hành quay lui
else (backtrack) lại lựa chọn gần nhất để thử một khả năng có
Với tập p các ô trên bàn cờ mà chưa bị ảnh hưởng bởi Current_config thể khác.
{
Thêm 1 quân hậu vào p;
Cập nhật lại Current_config
solve_from(Current_config);
Loại bỏ quân hậu khỏi p của Current_config;
}
10
1/10/2011
Thuật toán quay lui Bài toán 8 con hậu
Thuật toán quay lui – backtracking algorithm:
Thử tìm kiếm lời giải đầy đủ cho bài toán từ việc xây dựng
Nhận xét:
lời giải bộ phận, trong đó lời giải bộ phận phải luôn phù
Mỗi cột phải có 1 con hậu
hợp với yêu cầu bài toán.
Con hậu 1 nằm trên cột 1
Trong quá trình thực hiện, thuật toán mở rộng dần lời giải
…
bộ phận. Nếu việc mở rộng khiến lời giải bộ phận vi phạm
Con hậu j nằm trên cột j
yêu cầu bài toán thì tiến hành quay lui, loại bỏ sửa đổi
…
gần nhất và thử một khả năng xây dựng lời giải bộ phận
có thể (hợp lệ) khác. Con hậu 8 nằm trên cột 8
Các con hậu phải không cùng hàng
Các con hậu phải không nằm trên đường chéo của nhau
Giải thuật
function Try (column) { Thử lần lượt từng vị trí hàng Kiểm tra An toàn
for (row = 1; row <= 8; row++) {
if ( [row, column] là an toàn) {
Đặt con hậu vào vị trí [row, column];
Nếu vị trí thử không bị
if (column == 8) Con hậu thứ 8 là an toàn
con hậu nào tấn công
In kết quả;
else Đệ quy để với con hậu tiếp
Try (column + 1);
Xóa con hậu khỏi vị trí [row, column];
}
} Xóa để tiếp tục thử vị trí
} [row+1, column]
11
1/10/2011
12