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
Cấu trúc dữ liệu và giải thuật
Cấu trúc dữ liệu và Giải thuật
Chương II
Giải thuật đệ qui
Giải thuật đệ qui
Nội dung
Các khái niệm cơ bản
Một số ví dụ
Phân tích giải thuật đệ qui
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
1
Cấu trúc dữ liệu và giải thuật
Một số đối tượng đệ qui
Một số đối tượng đệ qui
z Hàm đệ qui:
– Là hàm được xác định phụ thuộc vào một biến
nguyên không âm n theo sơ đồ:
z Bước cơ sở : xác định giá trị hàm tại một giá trị n giá trị
nhỏ nhất có thể của biến
z Bước đệ qui: Cho giá trị f(k) , đưa ra qui tắc để tính
f(k+1)
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
2
Cấu trúc dữ liệu và giải thuật
Một số đối tượng đệ qui
z Tập hợp đệ qui
– Là tập được xác định như sau
z Bước cơ sở: Định nghĩa tập cơ sở
z Bước đệ qui: Xác định qui tắc để sản sinh tập mới từ
tập đã có
Một số đối tượng đệ qui
z Định nghĩa đệ qui của xâu ký tự
– A = bảng chữ cái, tập các xâu S trên bảng chữ
cái A được xác định
z Xâu rỗng là xâu trong S
z Nếu w thuộc S và x là một ký tự trong A thì wx là xâu
trong S
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
3
Cấu trúc dữ liệu và giải thuật
Một số đối tượng đệ qui
z Cây
– Định nghĩa đệ qui của cây
z Một nút tạo thành 1 cây
z Nếu có n cây T1, T2, …, Tn với nút gốc là r1, r2, … , rn; r
là một nút có quan hệ cha-con r1, r2, … , rn thì tồn tại một
cây mới T nhận r làm gốc
Giải thuật đệ qui
– Định nghĩa: Giải thuật đệ qui là giải thuật được
định nghĩa sử dụng chính giải thuật có dạng
giống nó
– Cấu trúc của một thuật toán đệ qui bao gồm 2
bước
z Bước cơ sở
– Với những giá trị đầu vào đủ nhỏ, bài toán có thể giải quyết
trực tiếp
z Bước đệ qui
– Lời gọi đến giải thuật đang định nghĩa
– Lời gọi đệ qui phải được định nghĩa để nó tiến gần hơn đến
bước cơ sở
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
4
Cấu trúc dữ liệu và giải thuật
Các dạng giải thuật đệ qui
– Đệ qui trực tiếp : AÆ A
– Đệ qui gián tiếp: AÆB Æ…ÆA
– Đệ qui đuôi
z Lời gọi đệ qui luôn luôn nằm cuối cùng trong giải thuật
Giải thuật đệ 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á trị n! }
Trường hợp cơ sở
Lời gọi đệ qui
1. if n = 0 then return 1
else return n*FACT(n-1);
2. End.
Tổ hợp kết quả
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
5
Cấu trúc dữ liệu và giải thuật
Giải thuật đệ qui
– Hình dung việc thực hiện giải thuật 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 )
Giải thuật đệ 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á trị n! }
1. if n <= 1 then return n
else return (Fibonacci(n-1)+Fibonacci(n-2));
2. End.
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
6
Cấu trúc dữ liệu và giải thuật
Giải thuật đệ qui
– Thực hiện 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)
Giải thuật đệ qui
– Bài toán Tháp Hà nội
z Có 3 cọc A, B, C và n đĩa có kích thước khác nhau
z Ban đầu, các đĩa được xếp có thứ tự đĩa to ở trên, đĩa
nhỏ ở dưới tại cọc A
z Mục tiêu là chuyển n đĩa này sang cọc C với điều kiện
mỗi lần được chuyển 1 đĩa, không được đặt đĩa to ở
trên đĩa nhỏ
B
n đĩa
A
C
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
7
Cấu trúc dữ liệu và giải thuật
Giải thuật đệ qui
z Bước cơ sở : n <= 1, giải quyết trực tiếp
B
B
A
C
A
C
Move(A, C)
Giải thuật đệ qui
z Bước đệ qui: Giả sử rằng bài toán chuyển n-1 đĩa đã
được giải quyết , vậy có thể thực hiện với n đĩa ?
B
B
A
C
A
C
B
A
C
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
8
Cấu trúc dữ liệu và giải thuật
Giải thuật đệ qui
B
B
B
A
A
C
C
A
C
B
A
C
Giải thuật đệ 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 Diệp- Khoa CNTT-ĐHBKHN
9
Cấu trúc dữ liệu và giải thuật
Giải thuật đệ qui
Procedure TOWER( n, A, B, C)
Begin
{n là số đĩa ban đầu trên cọc A, cọc đầu tiên được chỉ
định là cọc chứa các đĩa cần chuyển, cọc thứ 2 là cọc
trung chuyển, cọc thứ 3 là cọc cần chuyển đĩ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 thuật toán đệ qui
– Hàm thời gian thực hiện giải thuật T(n) là hàm đệ
qui với tham số n
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
10
Cấu trúc dữ liệu và giải thuật
Phân tích thuật toán đệ qui
– Ví dụ 1
Procedure f(n)
{n là số nguyê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 giải thuật đệ qui
– Ví dụ 2
Function g( n)
Begin
z Trường hợp 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 Diệp- Khoa CNTT-ĐHBKHN
11
Cấu trúc dữ liệu và giải thuật
Phân tích thời gian thực hiện giải thuật
– Cách thức giải công thức đệ qui của thời gian
thực hiện giải thuật đệ qui
z Phương pháp lặp
Phân tích giải thuật đệ qui
z Phương pháp lặp
– Giải công thức đệ qui của thời gian thành một
tổng các toán hạng cụ thể
z Lặp lại việc thay thế hàm cho đến khi bắt gặp trường
hợp cơ sở
z Tính tổng
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
12
Cấu trúc dữ liệu và giải thuật
Phân tích giải thuật đệ 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)
Giả sử n = 2k
T(n) = c + c + … + c + T(1)
= clogn + T(1)
Vậy ta có T(n) = O(logn)
Phân tích giải thuật đệ 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)
Giả sử n = 2k thì ta sẽ rút gọn được
T(n) = kn + 2kT(1)
= nlogn + nT(1)
Vậy T(n)= O(nlogn)
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
13
Cấu trúc dữ liệu và giải thuật
Phân tích giải thuật đệ qui
z Phân tích giải thuật tính giai thừa
T(0) = c
Function recursiveFactorial(n)
Begin
{Tính giá trị n! }
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.
Vậy T(n) = O(n).
Phân tích giải thuật đệ qui
z Phân tích giải thuật Tháp Hà Nội
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 Diệp- Khoa CNTT-ĐHBKHN
14
Cấu trúc dữ liệu và giải thuật
Phân tích giải thuật đệ 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
– Một hàm đệ qui có thể được giải quyết tương
đương bằng việc sử dụng vòng lặp và stack
Đố Bích Diệp- Khoa CNTT-ĐHBKHN
15
Cấu trúc dữ liệu và giải thuật
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 Diệp- Khoa CNTT-ĐHBKHN
16
Cấu trúc dữ liệu và giải thuật
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 Diệp- Khoa CNTT-ĐHBKHN
17
Cấu trúc dữ liệu và giải thuật
Đệ qui có nhớ
z Một kỹ thuật sử dụng khi trong các bài toán đệ qui có
việc lặp đi lặp lại lời gọi một bài toán con nào đó
z Làm tăng tính hiệu quả của giải thuật đệ 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 khắc phục:
z Ghi lại lời giải của các bài toán con sử dụng một biến
trong giải thuật
z Ví dụ: Bài toán tính hệ số nhị thức
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 Diệp- Khoa CNTT-ĐHBKHN
18
Cấu trúc dữ liệu và giải thuật
Đệ qui có nhớ
z Hàm đệ qui của 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 Diệp- Khoa CNTT-ĐHBKHN
19
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:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_ii_giai_thua.pdf