Professional Documents
Culture Documents
Chương 2. Thuật toán đệ quy
Chương 2. Thuật toán đệ quy
hiep.nguyenduy@hust.edu.vn 1
Nội dung
• Khái niệm thuật toán cài đặt đệ quy
• Đánh giá thuật toán đệ quy
• Một số chú ý với thuật toán đệ quy
• Thuật toán quy lui – back tracking
• Bài tập
hiep.nguyenduy@hust.edu.vn 2
1
10/7/2021
1 𝑛ế𝑢 𝑛 = 0
• 𝑛! =
𝑛× 𝑛−1 ! 𝑛ế𝑢 𝑛 > 0
1 𝑛ế𝑢 𝑛 = 1, 2
• 𝐹𝑖𝑏 𝑛 =
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏 𝑛 − 2 𝑛ế𝑢 𝑛 > 2
0 𝑛ế𝑢 𝑛 = 0
• 𝑃 𝑛 = 1 𝑛ế𝑢 𝑛 = 1
2𝑃 𝑛 − 1 + 𝑃 𝑛 − 2 𝑛ế𝑢 𝑛 > 1
hiep.nguyenduy@hust.edu.vn 4
2
10/7/2021
hiep.nguyenduy@hust.edu.vn 5
3
10/7/2021
4
10/7/2021
hiep.nguyenduy@hust.edu.vn 9
5
10/7/2021
𝑛
𝑇 𝑛 = 2𝑇 +𝑛
2
hiep.nguyenduy@hust.edu.vn 12
6
10/7/2021
𝑇 𝑛 = 𝑇 𝑛 − 1 + 1 = 𝑇 𝑛 − 2 + 1 + 1 = 𝑇 𝑛 − 3 + 1 + 1 + 1 = 𝑇 1 + 1+. . +1 = 1 + 1+. . +1 = 𝑛
hiep.nguyenduy@hust.edu.vn 13
hiep.nguyenduy@hust.edu.vn 14
7
10/7/2021
hiep.nguyenduy@hust.edu.vn 15
Đú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ở).
hiep.nguyenduy@hust.edu.vn 16
8
10/7/2021
b) 𝑇 𝑛 = 2𝑇 + 𝑛 là Ο(𝑛 log 𝑛)
c) 𝑇 𝑛 = 𝑇 + 12 + 1 là Ο(log 𝑛)
d) 𝑇 𝑛 = 4𝑇 + 𝑛 là 𝑂(𝑛 )
e) 𝑇 𝑛 = 2𝑇 + 1 là 𝑂(𝑛)
hiep.nguyenduy@hust.edu.vn 18
9
10/7/2021
𝛰 1 𝑛ế𝑢 𝑛 = 1
• Cây đệ quy cho mergeSort 𝑇 𝑛 =
2𝑇 +𝛰 𝑛 𝑛ế𝑢 𝑛 > 1
hiep.nguyenduy@hust.edu.vn 19
Cây đệ quy
• Công thức đệ quy
𝑛 2𝑛
𝑇 𝑛 =𝑇 +𝑇 + Ο(𝑛)
3 3
• Cây đệ quy lệch
• Nhánh đi theo 𝑛/3 là thấp nhất
• Nhánh đi theo 2𝑛/3 là cao nhất
hiep.nguyenduy@hust.edu.vn 20
10
10/7/2021
Cây đệ quy
• Dùng phương pháp thế để chứng minh lời giải công thức đệ quy tìm được.
VD. 𝑇 𝑛 = 𝑇 +𝑇 + Ο 𝑛 = Ο(𝑛log𝑛)
• 𝑇 𝑛 ≤𝑇 +𝑇 + 𝑐𝑛
≤ 𝑑 log + 𝑑 log + 𝑐𝑛
𝑑𝑛 𝑑𝑛 2𝑑𝑛 2𝑑𝑛
= 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)
hiep.nguyenduy@hust.edu.vn 21
Cây đệ quy
• VD 1. Xác định một cận trên tốt cho công thức đệ quy 𝑇 𝑛 = 3𝑇 + 𝑛 dùng
phương pháp thế để xác nhận lại kết quả.
• VD 2. Vẽ cây đệ quy cho 𝑇 𝑛 = 4𝑇 + 𝑐𝑛 với 𝑐 là hằng số. Đưa ra tiệm cận
chặt cho công thức đệ quy trên. Xác nhận lại lời giải bằng phương pháp thế.
hiep.nguyenduy@hust.edu.vn 22
11
10/7/2021
hiep.nguyenduy@hust.edu.vn 23
Định lý thợ
Định lý thợ xét mối quan hệ về tốc độ tăng của 𝑛 và 𝑓(𝑛)
• TH 1. Nếu 𝑓 𝑛 = Ο(𝑛 ), với hằng 𝜖 > 0 thì 𝑇 𝑛 = Θ(𝑛 )
• TH 2. Nếu 𝑓 𝑛 = Θ(𝑛 ) thì 𝑇 𝑛 = Θ(𝑛 log 𝑛)
• TH 3. Nếu 𝑓 𝑛 = Ω(𝑛 ), với hằng 𝜖 > 0, và
nếu 𝑎𝑓 < 𝑐𝑓(𝑛) với hằng 𝑐 < 1 và với mọi n đủ lớn thì 𝑇 𝑛 = Θ(𝑓(𝑛))
12
10/7/2021
• 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 mọi hằng số 𝜖 do đó không thể áp dụng
được.
hiep.nguyenduy@hust.edu.vn 26
13
10/7/2021
• 𝑇 𝑛 = 4𝑇 +𝑛
• 𝑇 𝑛 = 4𝑇 +𝑛
Bài 2. Dùng định lý thợ để chứng minh thời gian thực hiện của thuật toán tìm kiếm nhị phân
𝑇 𝑛 =𝑇 + Θ(1) là Θ(log 𝑛)
Bài 3. Định lý thợ có thể áp dụng cho công thức đệ quy 𝑇 𝑛 = 4𝑇 + 𝑛 log 𝑛 được
không, Tại sao? Tìm tiệm cận giới hạn trên cho 𝑇(𝑛)
hiep.nguyenduy@hust.edu.vn 28
14
10/7/2021
A=findMin(S,start,start+div);
B=findMin(S,start+div+1,end);
return Min(A,B);
}
Trong đó hàm Min(A,B) trả về giá trị hiep.nguyenduy@hust.edu.vn
nhỏ nhất trong 2 số A, B và thời gian thực hiện là29 Θ(1)
hiep.nguyenduy@hust.edu.vn 30
15
10/7/2021
THÁP HÀ NỘI
Hàm move di chuyển từ cột A sang cột B với cột
trung gian là C
16
10/7/2021
hiep.nguyenduy@hust.edu.vn 34
17
10/7/2021
hiep.nguyenduy@hust.edu.vn 35
hiep.nguyenduy@hust.edu.vn 36
18
10/7/2021
hiep.nguyenduy@hust.edu.vn 38
19
10/7/2021
Ý tưởng:
• Các quân hậu cần được xếp riêng trên mỗi cột (hoặc hàng)
• Thử xếp các quân hậu trong các cột lần lượt từ 1 tới 8
• Mỗi cột thử đặt quân hậu tại lần lượt các hàng (của cột đó)
• Nếu có vị trí đặt hợp lệ thì chuyển qua đặt hậu ở cột kế bên
• Ngược lại, nếu không thể tìm được vị trí đặt hậu tại cột hiện tại, cần quay lui lại lựa
chọn vị trí đặt của cột ngay trước để sửa lại
• Nếu đặt đủ 8 hậu tìm được 1 phương án giải
hiep.nguyenduy@hust.edu.vn 40
20
10/7/2021
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
{
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;
}
}
hiep.nguyenduy@hust.edu.vn 42
21
10/7/2021
Giải thuật
function Try (column) { Thử lần lượt từng vị trí hàng
for (row = 1; row <= 8; row++) {
if (Check [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 Gọi đệ 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]
hiep.nguyenduy@hust.edu.vn 43
22
10/7/2021
int main() {
int x[5], n = 5;
TRY(x, n, 0);
}
hiep.nguyenduy@hust.edu.vn 45
{1, 0, 0, 0}
return false;
hiep.nguyenduy@hust.edu.vn 46
}
23
10/7/2021
if (isSafe(maze, x, y) == true) {
// Check if the current block is already part of solution path.
if (sol[x][y] == 1) return false;
𝑇 𝑛 = 𝑂(9 )
https://www.geeksforgeeks.org/sudoku-backtracking-7/
hiep.nguyenduy@hust.edu.vn 48
24
10/7/2021
58
10011111
hiep.nguyenduy@hust.edu.vn 50
25
10/7/2021
8 12
hiep.nguyenduy@hust.edu.vn 52
26