Tải bản đầy đủ (.pdf) (12 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Thuật toán đệ quy

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.02 MB, 12 trang )

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) = 4T(n/2) + n

n=1
n>1

Dự đoán (chặt hơn!):

T(n)  cn2 n>n0

T(n) = 1
T(n) = 4T(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)  ck2, kT(n) = 4T(n/2) + n
 4c(n/2)2 + n
= cn2 + n

Ví dụ 2 (tiếp)

Khơng  cn2 !

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)  cn2 - dn n>n0
Giả sử T(k)  ck2 - dn, k
5


1/10/2011


Ví dụ 2 (tiếp)

Ví dụ 2 (tiếp)

T(n) = 1
T(n) = 4T(n/2) + n

n=1
Dự đốn:
2 - dn n>n
T(n)

cn
n>1
0

Giả sử T(k)  ck2 - dn, 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) = 4T(n/2) + n


n=1
Dự đoán:
2 - dn n>n
T(n)

cn
n>1
0

Giả sử T(k)  ck2 - dn, kChuyển qui nạp, n>1:
T(n) = 4T(n/2) + n
 4(c(n/2)2 ‐ d(n/2)) + n     
= cn2 ‐ 2dn + n
= cn2 ‐ dn ‐ (dn ‐ n)
 cn2 ‐ d*n

(định nghĩa)
(qui nạp)
(biến đổi)
(biến đổi)
(Chọn d1)

Ví dụ 2 (tiếp)
T(n) = 1
T(n) = 4T(n/2) + n

n=1
n>1


Đã chứng minh:
T(n)  2n2 – 1n 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




×