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