Bài giảng Cấu trúc dữ liệu và Giải thuật - Chương II: Giải thuật đệ qui - Đỗ Bích Diệp

Cu trúc dliu và gii thut  
Cu trúc dliu và Gii thut  
Chương II  
Gii thut đệ qui  
Gii thut đệ qui  
Ni dung  
™ Các khái nim cơ bn  
™ Mt sví dụ  
™ Phân tích gii thut đệ qui  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
1
Cu trúc dliu và gii thut  
Mt số đối tượng đệ qui  
Mt số đối tượng đệ qui  
z Hàm đệ qui:  
Là hàm được xác định phthuc vào mt biến  
nguyên không âm n theo sơ đồ:  
z Bước cơ s: xác định giá trhàm ti mt giá trn giá trị  
nhnht có thca biến  
z Bước đệ qui: Cho giá trf(k) , đưa ra qui tc để tính  
f(k+1)  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
2
Cu trúc dliu và gii thut  
Mt số đối tượng đệ qui  
z Tp hp đệ qui  
Là tp được xác định như sau  
z Bước cơ s: Định nghĩa tp cơ sở  
z Bước đệ qui: Xác định qui tc để sn sinh tp mi từ  
tp đã có  
Mt số đối tượng đệ qui  
z Định nghĩa đệ qui ca xâu ký tự  
A = bng chcái, tp các xâu S trên bng chữ  
cái A được xác định  
z Xâu rng là xâu trong S  
z Nếu w thuc S và x là mt ký ttrong A thì wx là xâu  
trong S  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
3
Cu trúc dliu và gii thut  
Mt số đối tượng đệ qui  
z Cây  
Định nghĩa đệ qui ca cây  
z Mt nút to thành 1 cây  
z Nếu có n cây T1, T2, …, Tn vi nút gc là r1, r2, … , rn; r  
là mt nút có quan hcha-con r1, r2, … , rn thì tn ti mt  
cây mi T nhn r làm gc  
Gii thut đệ qui  
Định nghĩa: Gii thut đệ qui là gii thut được  
định nghĩa sdng chính gii thut có dng  
ging nó  
Cu trúc ca mt thut toán đệ qui bao gm 2  
bước  
z Bước cơ sở  
Vi nhng giá trị đầu vào đủ nh, bài toán có thgii quyết  
trc tiếp  
z Bước đệ qui  
Li gi đến gii thut đang định nghĩa  
Li gi đệ qui phi được định nghĩa để nó tiến gn hơn đến  
bước cơ sở  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
4
Cu trúc dliu và gii thut  
Các dng gii thut đệ qui  
Đệ qui trc tiếp : AÆ A  
Đệ qui gián tiếp: AÆB ÆÆA  
Đệ qui đuôi  
z Li gi đệ qui luôn luôn nm cui cùng trong gii thut  
Gii thut đệ qui  
Ví d: Hàm tính n!  
1if n = 0  
Fact(n) =  
n* Fact(n 1) if n > 0  
Function recursiveFactorial(n)  
Begin  
{Tính giá trn! }  
Trường hp cơ sở  
Li gi đệ qui  
1. if n = 0 then return 1  
else return n*FACT(n-1);  
2. End.  
Thp kết quả  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
5
Cu trúc dliu và gii thut  
Gii thut đệ qui  
Hình dung vic thc hin gii thut tính n!  
return 4 *6 = 24  
final answer  
call  
recursiveFactorial  
(4 )  
call  
return 3*2 = 6  
recursiveFactorial  
(3 )  
call  
return 2 *1 = 2  
recursiveFactorial  
(2 )  
call  
return 1*1 = 1  
recursiveFactorial  
(1 )  
return  
1
call  
recursiveFactorial  
(0 )  
Gii thut đệ qui  
Dãy Fibonacci  
0
if n = 0  
if n =1  
Fibonacci (n 1) + Fibonacci (n 2) otherwise  
Fibonacci (n) = 1  
Function Fibonacci(n)  
Begin  
{Tính giá trn! }  
1. if n <= 1 then return n  
else return (Fibonacci(n-1)+Fibonacci(n-2));  
2. End.  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
6
Cu trúc dliu và gii thut  
Gii thut đệ qui  
Thc hin tính Fibonacci(6)  
Fibonacci(6)  
Fibonacci(5)  
Fibonacci(4) Fibonacci(3)  
Fibonacci(3) Fibonacci(2) Fibonacci(2)  
Fibonacci(1)  
Fionacci(4)  
Fibonacci(3) Fibonacci(2)  
Fibonacci(2)  
Fibonacci(1)  
Fibonacci(2)  
Fibonacci(1)  
Gii thut đệ qui  
Bài toán Tháp Hà ni  
z Có 3 cc A, B, C và n đĩa có kích thước khác nhau  
z Ban đầu, các đĩa được xếp có thtự đĩa to trên, đĩa  
nhỏ ở dưới ti cc A  
z Mc tiêu là chuyn n đĩa này sang cc C vi điu kin  
mi ln được chuyn 1 đĩa, không được đặt đĩa to ở  
trên đĩa nhỏ  
B
n đĩa  
A
C
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
7
Cu trúc dliu và gii thut  
Gii thut đệ qui  
z Bước cơ s: n <= 1, gii quyết trc tiếp  
B
B
A
C
A
C
Move(A, C)  
Gii thut đệ qui  
z Bước đệ qui: Gisrng bài toán chuyn n-1 đĩa đã  
được gii quyết , vy có ththc hin vi n đĩa ?  
B
B
A
C
A
C
B
A
C
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
8
Cu trúc dliu và gii thut  
Gii thut đệ qui  
B
B
B
A
A
C
C
A
C
B
A
C
Gii thut đệ qui  
B
B
TOWER(n-1, A, C, B)  
Move(A, C)  
B
A
C
C
A
C
TOWER(n, A, B, C)  
A
TOWER(n-1, B, A, C)  
B
A
C
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
9
Cu trúc dliu và gii thut  
Gii thut đệ qui  
Procedure TOWER( n, A, B, C)  
Begin  
{n là số đĩa ban đầu trên cc A, cc đầu tiên được chỉ  
định là cc cha các đĩa cn chuyn, cc th2 là cc  
trung chuyn, cc th3 là cc cn chuyn đĩa đến }  
if n < 1 then return  
else begin  
call TOWER(n-1, A, C, B)  
call MOVE(A,C)  
call TOWER( n-1, B, A, C)  
end  
End  
Phân tích thut toán đệ qui  
Hàm thi gian thc hin gii thut T(n) là hàm đệ  
qui vi tham sn  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
10  
Cu trúc dliu và gii thut  
Phân tích thut toán đệ qui  
Ví d1  
Procedure f(n)  
{n là snguyên không âm}  
Begin  
z T(0) = 1  
z T(n) = 2 + T(n-1)  
if (n > 0) then begin  
writeln(n) ;  
Call f(n-1);  
end  
End  
Phân tích gii thut đệ qui  
Ví d2  
Function g( n)  
Begin  
z Trường hp cơ sở  
T(1) = 2  
if (n =1) then  
z Đệ qui  
T(n) = c + 2* T(n/2)  
return 2;  
else  
return 3 * g(n / 2) + g( n / 2) + 5;  
End.  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
11  
Cu trúc dliu và gii thut  
Phân tích thi gian thc hin gii thut  
Cách thc gii công thc đệ qui ca thi gian  
thc hin gii thut đệ qui  
z Phương pháp lp  
Phân tích gii thut đệ qui  
z Phương pháp lp  
Gii công thc đệ qui ca thi gian thành mt  
tng các toán hng cthể  
z Lp li vic thay thế hàm cho đến khi bt gp trường  
hp cơ sở  
z Tính tng  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
12  
Cu trúc dliu và gii thut  
Phân tích gii thut đệ qui  
Ví d: T(n) = c + T(n/2)  
T(n) = c + T(n/2)  
= c + c + T(n/4)  
= c + c + c + T(n/8)  
Gisn = 2k  
T(n) = c + c + … + c + T(1)  
= clogn + T(1)  
Vy ta có T(n) = O(logn)  
Phân tích gii thut đệ qui  
Ví d: T(n) = n + 2T(n/2)  
T(n) = n + 2T(n/2)  
= n + 2(n/2 + 2T(n/4))  
= n + n + 4T(n/4)  
= n + n + 4(n/4 + 2T(n/8))  
= n + n + n + 8T(n/8)  
… = in + 2iT(n/2i)  
Gisn = 2k thì ta srút gn được  
T(n) = kn + 2kT(1)  
= nlogn + nT(1)  
Vy T(n)= O(nlogn)  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
13  
Cu trúc dliu và gii thut  
Phân tích gii thut đệ qui  
z Phân tích gii thut tính giai tha  
T(0) = c  
Function recursiveFactorial(n)  
Begin  
{Tính giá trn! }  
1. if n = 0 then return 1  
T(n) = b + T(n - 1)  
= b + b + T(n - 2)  
= b +b +b + T(n - 3)  
else return n*FACT(n-1);  
2. End.  
= kb + T(n - k)  
Khi k = n, ta có:  
T(n) = nb + T(n - n)  
= bn + T(0)  
= bn + c.  
Vy T(n) = O(n).  
Phân tích gii thut đệ qui  
z Phân tích gii thut Tháp Hà Ni  
T(1) = a  
Procedure TOWER( n, A, B, C)  
T(n) = b+ 2T(n-1)  
Begin  
if n < 1 then return  
else begin  
call TOWER(n-1, A, C, B);  
call MOVE(A,C);  
call TOWER( n-1, B, A, C);  
end  
End  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
14  
Cu trúc dliu và gii thut  
Phân tích gii thut đệ qui  
T(n) = 2T(n – 1) + b  
= 2[2T(n – 2) + b] + b  
= 22 [2T(n – 3) + b] + 2b + b  
= 22 T(n – 2) + 2b + b  
= 23 T(n – 3) + 22b + 2b + b  
= 23 [2T(n – 4) + b] + 22b + 2b + b = 24 T(n – 4) + 23 b + 22b  
+ 21b + 20b  
= ……  
= 2k T(n – k) + b[2k- 1 + 2k– 2 + . . . 21 + 20]  
Khi n = k-1 ta có  
Khử đệ qui  
Mt hàm đệ qui có thể được gii quyết tương  
đương bng vic sdng vòng lp và stack  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
15  
Cu trúc dliu và gii thut  
Khử đệ qui  
Algorithm P (val n <integer>)  
1 if (n = 0)  
1
print ("Stop")  
2 else  
1
2
3
Q(n)  
P(n - 1)  
R(n)  
End P  
Khử đệ qui  
Algorithm P (n)  
Algorithm P (n)  
1 if (n = 0)  
1 createStack (s)  
2 loop (n > 0)  
1 Q(n)  
1
print ("Stop")  
2 else  
1
2
3
Q(n)  
P(n - 1)  
R(n)  
2 push(s, n)  
3 n = n - 1  
print ("Stop")  
3
4
End P  
loop (not emptyStack (s))  
1 popStack(s, n)  
2 R(n)  
End P  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
16  
Cu trúc dliu và gii thut  
Khử đệ qui  
Algorithm P (n)  
1 if (n = 0)  
1
2 else  
1
print("Stop")  
Q(n)  
2
P(n - 1)  
End P  
Khử đệ qui  
Algorithm P (n)  
Algorithm P (n)  
1 if (n = 0)  
1 loop (n > 0)  
1 Q(n)  
1
print("Stop")  
2
else  
1
Q(n)  
P(n - 1)  
2 n = n - 1  
2 print("Stop")  
2
End P  
End P  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
17  
Cu trúc dliu và gii thut  
Đệ qui có nhớ  
z Mt kthut sdng khi trong các bài toán đệ qui có  
vic lp đi lp li li gi mt bài toán con nào đó  
z Làm tăng tính hiu quca gii thut đệ qui  
Fibonacci(6)  
Fibonacci(5)  
Fibonacci(4) Fibonacci(3)  
Fibonacci(3) Fibonacci(2) Fibonacci(2)  
Fibonacci(1)  
Fionacci(4)  
Fibonacci(3) Fibonacci(2)  
Fibonacci(2)  
Fibonacci(1)  
Fibonacci(2)  
Fibonacci(1)  
Đệ qui có nhớ  
Ý tưởng khc phc:  
z Ghi li li gii ca các bài toán con sdng mt biến  
trong gii thut  
z Ví d: Bài toán tính hsnhthc  
C(n,0) =1 (n 0)  
C(n,n) =1 (n 0)  
C(n,k) = C(n 1,k 1) + C(n 1,k) 0 < k < n  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
18  
Cu trúc dliu và gii thut  
Đệ qui có nhớ  
z Hàm đệ qui ca bài toán  
Function C(n,k)  
Begin  
if ( k == 0) || (k ==n) then return 1;  
else return C(n-1,k-1) + C( n-1,k);  
End  
z Hàm đệ qui có nhớ  
Function C(n,k)  
Begin  
if D[n,k] > 0 then return D[n,k];  
else D[n,k] = C(n-1,k-1) + C( n-1,k);  
return D[n,k];  
End  
Đố Bích Dip- Khoa CNTT-ĐHBKHN  
19  
pdf 19 trang baolam 26/04/2022 6720
Bạn đang xem tài liệu "Bài giảng Cấu trúc dữ liệu và Giải thuật - Chương II: Giải thuật đệ qui - Đỗ Bích Diệp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_ii_giai_thua.pdf