1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Phân tích và thiết kế thuật giải: Bài 3 - TS. Ngô Quốc Việt

50 39 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 1,68 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Phân tích và thiết kế thuật giải - Bài 3 trình bày kiến thức về giải thuật đệ quy. Bài này gồm có một số nội dung sau: Thiết kế giải thuật đệ quy, tại sao dùng đệ quy, khi nào dùng đệ quy, đệ quy tuyến tính, đệ quy nhị phân,...và một số nội dung khác.

Trang 1

GIẢI THUẬT ĐỆ QUY

PHÂN TÍCH THIẾT KẾ GIẢI THUẬT

Trang 3

Giới thiệu

 Chương trình đệ quy là chương trình gọi đến chính nó

 Cần phải có điểm dừng chương trình/hàm (trường hợp suy biến)

 Đệ quy tuyến tính

 Đệ quy nhị phân

 Đệ quy phi tuyến, đệ quy lồng

 Đệ quy hỗ tương

Trang 4

Thiết kế giải thuật đệ quy

 Tham số hoá bài toán

 Phân tích trường hợp chung (biểu diễn bài toán đồng dạng nhưng khác phạm vi hay kích thước giải quyết)

 Xác định trường hợp dừng (suy biến)

Trang 5

Tại sao dùng đệ quy

Ưu điểm: giải thuật đệ quy đơn giản hơn không đệ quy khi giải

quyết cùng một vấn đề => dễ thiết kế, hiểu, cài đặt và thay đổi

Nhược điểm : gọi hàm liên tục (tốn nhiều thời gian và không

gian bộ nhớ trong)

Trong đó, vấn đề chủ yếu phát sinh do số lần gọi hàm có tham

số, dẫn đến cần không gian lưu trữ trong stack

Trang 6

Khi nào dùng đệ quy

 Dùng đệ quy để thiết kế giải thuật khi muốn đơn giản

về hình thức so với cách viết thông thường

 Thường được áp dụng cho các hàm có yếu tố lặp lại với ngữ cảnh thay đổi

 Kiểm tra nếu nó không sử dụng quá nhiều bộ nhớ trong

Một số ngôn ngữ (LISP, Scheme) sử dụng đệ quy để tạo vòng lặp, nhưng tiến hành theo cách hiệu quả (dạng tail recursion)

Trang 7

int CalAn(int A, int n) {

if(n==0) return A;

else if(n > 0 && (n %2) ==0)

return (n/2)*CalAn(A, n/2);

else

Trang 8

}

 Đệ quy tuyến tính là trường hợp đặc biệt của đệ quy nhị phân

Trang 10

if(n == 0) res = 1;

else { res = n*n*calXn(n-1)+calYn(n-1); }

return res

Trang 11

Tail Recursion = Iteration

 Khi đệ quy chứa lệnh gọi chính nó ở cuối cùng, phía sau không còn lệnh nào nữa

Được gọi là tail recursion và hiệu quả như giải pháp lặp:

Trang 12

Ví dụ tính giai thừa

0! = 1 n! = n*(n-1)!, n>0

} Bài đệ quy (và tail recursion) cho tập tại lớp: hãy viết hàm

yêu cầu trên

Trang 14

Ví dụ tính dãy Fibonacci

Hỏi: độ phức tạp bằng bao nhiêu?

Trang 16

 Trả về kết quả -1 ( not found)

Yếu tố khác: phần tử hiện hành trùng giá trị tìm

 Trả về chỉ mục của phần tử đang xét

Cơ sở đệ quy: tìm phần còn lại, không bao gồm phần

tử đang xét

Trang 17

Tìm tuyến tính

1. if the array is empty

2. return -1

3. else if first element matches target

4. return index of first element

5. else

6. return result of searching rest of the array, excluding the first element

Trang 18

Tìm nhị phân

1. if array is empty

2. return -1 as result

3. else if middle element matches

4. return index of middle element as result

5. else if target < middle element

6. return result of searching lower portion of array

7. else

8. return result of searching upper portion of array

Trang 19

Tìm nhị phân

Trang 20

Tháp Hà Nội

• Có ba cột tháp kim cương đặt ở cửa đền Brahma ở Hà Nội

• Cột bên trái có 64 đĩa, mỗi đĩa kích thước khác nhau, được chồng lên nhau:

Trang 22

Tháp Hà Nội-Minh hoạ với 3 đĩa

 Ký hiệu: cột A, B, C

Dời đĩa trên

cùng từ A

Trang 23

Tháp Hà Nội-Minh hoạ với 3 đĩa

Trang 24

Tháp Hà Nội-Minh hoạ với 3 đĩa

Trang 25

Tháp Hà Nội-Minh hoạ với 3 đĩa

Trang 26

Tháp Hà Nội

 Vấn đề cần giải quyết số lượng đĩa > 3

 Liệu có viết được giải thuật với các vòng lặp  được, nhưng hơi khó

 Giải quyết bằng đệ quy

Trang 27

cout << “\n\nThe Hanoi Towers!\n\n”

<< “Enter how many disks: “;

int numDisks;

cin >> numDisks;

Trang 28

cout << “\n\nThe Hanoi Towers!\n\n”

<< “Enter how many disks: “;

int numDisks;

cin >> numDisks;

Move(numDisks, „A‟, „B‟, „C‟);

}

Trang 30

Tháp Hà Nội – Thiết kế

b. Dời đĩa còn lại từ “nguồn” sang “đích”

c. Đệ quy: dời N-1 đĩa từ “trung gian” sang “đích”

Trang 31

Tháp Hà Nội

Giải thuật:

0 Receive n, src, dest, aux

1 If n > 1:

a Move(n-1, src, aux, dest);

b Move(1, src, dest, aux);

c Move(n-1, aux, dest, src);

Else

Display “Move the top disk from “, src, “ to “, dest

End if

Trang 32

Move(n-1, src, aux, dest);

Move(1, src, dest, aux);

Move(n-1, aux, dest, src);

Trang 33

Tháp Hà Nội-4 đĩa

The Hanoi Towers

Enter how many disks: 4

move a disk from needle A to needle B

move a disk from needle C to needle B

move a disk from needle A to needle C

move a disk from needle B to needle A

move a disk from needle B to needle C

move a disk from needle A to needle C

move a disk from needle A to needle B

move a disk from needle C to needle B

move a disk from needle C to needle A

move a disk from needle B to needle A

Trang 34

64 2 64 -1 (a big number) ~ 2 44 giây (giả sử

máy tính chạy 2 20 lệnh/giây)

Xấp xỉ 2 11 thế kỷ để chạy xong

Trang 35

Bài toán đếm ô bất thường

Desire: Xử lý ảnh hai chiều với các thông tin có từ

 X-Ray

 MRI

 Satellite imagery

 Etc

Mục tiêu: xác định kích thước của vùng bất thường

dựa trên màu sắc

Trang 36

Bài toán đếm ô bất thường

Trang 37

Bài toán đếm ô bất thường

Algorithm count_cells(x, y):

Trang 38

Bài toán đếm ô bất thường

int countCells(color grid[ROWS][COLS], int r, int c)

}

}

Trang 39

Bài tập

 Viết chương trình (vòng lặp, và đệ quy) để tìm số hạng

thứ n của dãy xác định bởi:

𝑎0 = 1, 𝑎1 = 3, 𝑎2 = 5, 𝑎𝑛 = 𝑎𝑛−1 + 𝑎𝑛−1 2 + 𝑎𝑛−2 3

Trang 40

Giải Bài tập

Trang 41

Đệ quy quay lui-Minh hoạ bằng bài toán 8

con hậu

 Yêu cầu: các con hậu được đặt trên bàn cờ vua sao cho không “ăn” được lẫn nhau

Trang 42

Bài toán 8 con hậu-Dựa trên kinh nghiệm

 Nhận xét: mỗi con hậu phải ở trên một cột (domain knowledge)

 Đặt con hậu vô mỗi hàng, cũng như chọn hàng cho từng con hậu

 Đầu tiên, chọn ngẫu nhiên các hàng và hậu trên đó, sau đó mỗi vòng lặp di chuyển một con hậu sao cho không “ăn” lẫn nhau

 Tuy nhiên có thể dẫn tới trường hợp không tìm được lời giải vì trạng thái ngẫu nhiên ban đầu không tốt

Trang 43

Bài toán 8 con hậu-Đệ quy quay lui

(backtracking)

chéo của nó (vì hậu “ăn” ngang, dọc, xéo)

chéo Ghi nhận cột, đường chéo của hậu thứ hai này Tiếp tục cho hàng kế

 Nếu không còn cột nào cho hậu ở hàng kế tiếp, buộc phải trở lại hàng trước đó và tìm chỗ khác cho hậu đã đặt (có khi xét ngược đến hàng đầu tiên)

Trang 44

Bài toán 8 con hậu-Đệ quy quay lui

Trang 45

Bài toán hôn nhân bền vững

 Tìm stable matching giữa hai tập, trong đó mỗi phần tử

có ‘tiêu chuẩn thích’ khác nhau

 Tìm cách ánh xã giữa từng phần tử giữa hai tập sao cho

‘thích’ gặp nhau nhiều nhất

Bài toán: Cho n man+n woman, mỗi người đánh số thứ tự

thích những người khác giới tính Ghép đôi từng cặp, sao cho tính ‘thích’ của họ là cao nhất

Trang 46

Hôn nhân bền vững-Giải thuật Gale and Shapley

Mỗi man độc thân đề nghị woman thích nhất

Mỗi woman replies "maybe" man thích nhất and "no" cho các man còn lại

Sau đó, woman chọn man cô thích nhất

http://en.wikipedia.org/wiki/Stable_marriage_problem

Trang 47

Hôn nhân bền vững-Giải thuật Gale and Shapley

function stableMatching {

Initialize all m M and w W to free

while free man m who still has a woman w to propose to {

w = m's highest ranked woman to whom he has not yet proposed

Trang 48

Khử đệ quy

 Một số nnlt không hỗ trợ gọi đệ quy (COBOL, FORTRAN)

thuật lặp Hai phương pháp phổ biến

trước

Trang 49

Khử đệ quy-ví dụ quicksort

 Sử dụng stack để lưu trữ các chỉ số đầu+cuối của dãy con

QuickSort không dùng đệ quy

Trang 50

Bài tập

1. Bài tập thực hành: xây dựng chương trình giải quyết

bài toán toán hôn nhân bền vững

2. Bài tập thực hành: xây dựng chương trình giải quyết

bài toán toán 8 con hậu (nhóm 3 sinh viên)

3. Cài đặt các bài toán mergesort, quicksort, 8 hậu

không dùng đệ quy

Ngày đăng: 09/05/2021, 18:15

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm