Cơ sở dữ liệu - Đệ quy và giải thuật đệ quy
Bạn đang xem 20 trang mẫu của tài liệu "Cơ sở dữ liệu - Đệ quy và giải thuật đệ quy", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- co_so_du_lieu_de_quy_va_giai_thuat_de_quy.ppt
Nội dung text: Cơ sở dữ liệu - Đệ quy và giải thuật đệ quy
- ĐỆ QUY VÀ GiẢI THUẬT ĐỆ QUY CHƯƠNG 2
- Khái niệm đệ quy ⚫ Ta nói một đối tượng là đệ quy nếu nó bao gồm chính nó như một bộ phận hoặc nó được định nghĩa dưới dạng của chính nó. ⚫ Ví dụ: Trong toán học ta gặp các định nghĩa đệ quy sau: ⚫ Số tự nhiên: ⚫ 1 là số tự nhiên. ⚫ n là số tự nhiên nếu n-1 là số tự nhiên. ⚫ Hàm n giai thừa: n! ⚫ 0! = 1 ⚫ Nếu n>0 thì n! = n(n-1)!
- Giải thuật đệ quy ⚫ Giải thuật đệ quy ⚫ Nếu lời giải của của bài toán T được giải bằng lời giải của một bài toán T1, có dạng giống như T, thì lời giải đó được gọi là lời giải đệ quy. ⚫ Giải thuật tương ứng với lời giải đệ quy gọi là giải thuật đệ quy. ⚫ Ở đây T1 có dạng giống T nhưng theo một nghĩa nào đó T1 phải “nhỏ” hơn T. ⚫ Chẳng hạn, với bài toán tính n!, thì tính n! là bài toán T còn tính (n-1)! là bài toán T1 ta thấy T1 cùng dạng với T nhưng nhỏ hơn (n-1 < n).
- Giải thuật đệ quy ⚫ Giải thuật của bài toán tìm từ trong từ điển if (từ điển là một trang) tìm từ trong trang này else { Mở từ điển vào trang “giữa”; Xác định xem nửa nào của từ điển chứa từ cần tìm; if (từ đó nằm ở nửa trước) tìm từ đó ở nửa trước; else tìm từ đó ở nửa sau; } ⚫ Giải thuật này được gọi là giải thuật đệ quy
- Giải thuật đệ quy ⚫ Nhận xét: ⚫ Sau mỗi lần từ điển được tách làm đôi thì một nửa thích hợp sẽ lại được tìm bằng một chiến thuật như đã dùng trước đó (nửa này lại được tách đôi). ⚫ Có một trường hợp đặc biệt, đó là sau nhiều lần tách đôi, từ điển chỉ còn một trang. Khi đó việc tách đôi ngừng lại và bài toán trở thành đủ nhỏ để ta có thể tìm từ mong muốn bằng cách tìm tuần tự. Trường hợp này gọi là trường hợp suy biến.
- Hàm đệ quy ⚫ Hàm đệ quy SEARCH(dict, word) //Tìm từ ‘word’ trong từ điển ‘dict’ { if (Từ điển chỉ còn là một trang) tìm từ word trong trang này else { mở từ điển vào trang giữa xác định xem nửa nào của từ điển chứa từ word if (từ word nằm ở nửa sau của từ điển) return SEARCH(dict\{nửa trước}, word); else return SEARCH(dict\{nửa sau}, word); } }
- Hàm đệ quy ⚫ Đặc điểm của hàm đệ quy: ⚫ Trong hàm đệ quy có lời gọi đến chính nó. Trong hàm SEARCH có lệnh: return SEARCH(dict\{nửa trước}, word); ⚫ Sau mỗi lần có lời gọi đệ quy thì kích thước của bài toán được thu nhỏ hơn trước. ⚫ Trường hợp suy biến là khi lời gọi hàm SEARCH với từ điển dict chỉ còn là một trang. Trường hợp này bài toán còn lại sẽ được giải quyết theo một cách khác hẳn (tìm từ word trong trang đó bằng cách tìm kiếm tuần tự) và việc gọi đệ quy cũng kết thúc.
- Thiết kế giải thuật đệ quy ⚫ Khi bài toán đang xét, hoặc dữ liệu đang xử lý được định nghĩa dưới dạng đệ quy, thì việc thiết kế các giải thuật đệ quy tỏ ra rất thuận lợi. ⚫ Giải thuật đệ quy phản ánh rất sát nội dung của định nghĩa đó. ⚫ Không có giải thuật đệ quy vạn năng cho tất cả các bài toán đệ quy, nghĩa là mỗi bài toán cần thiết kế một giải thuật đệ quy riêng.
- Thiết kế giải thuật đệ quy ⚫ Hàm n! ⚫ Hàm này được định nghĩa như sau: Nếu n=0 -> n! = 1 Nếu n>0 -> n! = n*(n-1)! Giải thuật đệ quy được viết dưới dạng hàm Factorial (n) { if (n==0) return 1; else return n*Factorial(n-1); } ⚫ Trong hàm trên lời gọi đến nó nằm ở câu lệnh gán sau else. ⚫ Mỗi lần gọi đệ quy đến Factorial, thì giá trị của n giảm đi 1. ⚫ Ví du, Factorial(4) gọi đến Factorial(3), gọi đến Factorial(2), gọi đến Factorial(1), gọi đến Factorial(0) đây là trường hợp suy biến, nó được tính theo cách đặc biệt Factorial(0) = 1.
- Thiết kế giải thuật đệ quy ⚫ Bài toán dãy số FIBONACCI ⚫ Dãy số Fibonacci bắt nguồn từ bài toán cổ về việc sinh sản của các cặp thỏ. Bài toán được đặt ra như sau: ⚫ Các con thỏ không bao giờ chết. ⚫ Hai tháng sau khi được sinh ra một cặp thỏ mới sẽ sinh ra một cặp thỏ con. ⚫ Khi đã sinh sản, thì cứ sau mỗi tháng chúng lại sinh được một cặp con mới. ⚫ Giả sử bắt đầu từ một cặp thỏ mới được sinh ra, hỏi đến tháng thứ n sẽ có bao nhiêu cặp?
- Bài toán dãy số FIBONACCI ⚫ Tính trực tiếp số cặp thỏ trong các tháng đầu tiên ⚫ Chẳng hạn với n=6, ta tính được ➢ Tháng thứ 1: 1 cặp (cặp ban đầu) ➢ Tháng thứ 2: 1 cặp (cặp ban đầu vẫn chưa sinh con) ➢ Tháng thứ 3: 2 cặp (đã có thêm 1 cặp con do cặp ban đầu đầu sinh ra) ➢ Tháng thứ 4: 3 cặp (cặp ban đầu vẫn sinh thêm) ➢ Tháng thứ 5: 5 cặp (cặp con bắt đầu sinh) ➢ Tháng thứ 6: 8 cặp (cặp con vẫn sinh tiếp)
- Bài toán dãy số FIBONACCI ⚫ Suy ra định nghĩa cách tính số cặp thỏ ⚫ Đặt F(n) là số cặp thỏ ở tháng thứ n. ⚫ Ta thấy ở tháng thứ 1, và tháng thứ 2 luôn có 1 cặp, chỉ những cặp thỏ đã có ở tháng thứ n-2 mới sinh con ở tháng thứ n, nên số cặp thỏ ở tháng thứ n là: F(n) = F(n-2) + F(n-1) ⚫ Vì vậy F(n) được tính như sau: 1 nếu n=1 hoặc n=2 F(n) = F(n-2) + F(n-1) nếu n>2 ⚫ Dãy số F(n) ứng với các giá trị của n = 1, 2, 3, 4 , có dạng 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 được gọi là dãy số Fibonacci.
- Bài toán dãy số FIBONACCI ⚫ Xây dựng giải thuật đệ quy dạng hàm thể hiện việc tính F(n). Fibonaci (n) { if (n<=2) return 1; else return Fibonaci(n-2) + Fibonaci(n-1); } ⚫ Ở đây trường hợp suy biến ứng với 2 giá trị F(1) = 1 và F(2) = 1.
- Bài toán Tháp Hà Nội ⚫ Bài toán này mang tính chất là một trò chơi, nội dung như sau: ⚫ Có n đĩa, kích thước nhỏ dần, mỗi đĩa có lỗ ở giữa. ⚫ Có thể xếp chồng chúng lên nhau xuyên qua một cọc, đĩa to ở dưới, đĩa nhỏ ở trên để cuối cùng có một chồng đĩa A B C
- Bài toán Tháp Hà Nội ⚫ Yêu cầu đặt ra là: ⚫ Chuyển chồng đĩa từ cọc A sang cọc khác, chẳng hạn cọc C, theo những điều kiện: ⚫ Mỗi lần chỉ được chuyển một đĩa. ⚫ Không khi nào có tình huống đĩa to ở trên đĩa nhỏ (dù là tạm thời). ⚫ Được phép sử dụng một cọc trung gian, chẳng hạn cọc B để đặt tạm đĩa.
- Bài toán Tháp Hà Nội ⚫ Để đi tới cách giải tổng quát, trước hết ta xét vài trường hợp đơn giản. ⚫ Trường hợp có 1 đĩa: ⚫ Chuyển đĩa từ cọc A sang cọc C. A B C
- Bài toán Tháp Hà Nội ⚫ Trường hợp 2 đĩa: ⚫ Chuyển đĩa thứ nhất từ cọc A sang cọc B. ⚫ Chuyển đĩa thứ hai từ cọc A sang cọc C. ⚫ Chuyển đĩa thứ nhất từ cọc B sang cọc C. A B C
- Bài toán Tháp Hà Nội ⚫ Tổng quát với n đĩa (n>2) ⚫ Ta thấy với trường hợp n đĩa (n>2) nếu coi n-1 đĩa ở trên, đóng vai trò như đĩa thứ nhất thì có thể xử lý giống như trường hợp 2 đĩa được, nghĩa là: ⚫ Chuyển n-1 đĩa trên từ cọc A sang cọc B. ⚫ Chuyển đĩa thứ n từ cọc A sang cọc C. ⚫ Chuyển n-1 đĩa từ cọc B sang cọc C.
- A B C Bước 1 A B C Bước 2 A B C Bước 3 A B C
- Bài toán Tháp Hà Nội ⚫ Kết luận: ⚫ Bài toán “Tháp Hà Nội” với n đĩa đã được dẫn đến bài toán tương tự với kích thước nhỏ hơn, chẳng hạn từ chỗ chuyển n đĩa từ cọc A sang cọc C nay là chuyển n-1 đĩa từ cọc A sang cọc B và ở mức này thì giải thuật lại là: ⚫ Chuyển n-2 đĩa từ cọc A sang cọc C. ⚫ Chuyển 1 đĩa tử cọc A sang cọc B. ⚫ Chuyển n-2 đĩa từ cọc C sang cọc B. ⚫ và cứ như thế cho tới khi trường hợp suy biến xảy ra, đó là trường hợp ứng với bài toán chuyển 1 đĩa (n=1).
- Bài toán Tháp Hà Nội ⚫ Giải thuật đệ quy Chuyen(n, A, B, C) { if (n= =1) chuyển đĩa từ A sang C; else { Chuyen(n-1, A, C, B); Chuyen(1, A, B, C); Chuyen(n-1, B, A, C); } }
- Hiệu lực của đệ quy ⚫ Đệ quy là một kỹ thuật giải quyết bài toán khá hữu dụng ⚫ Việc thiết kế giải thuật cũng đơn giản vì nó khá giống với định nghĩa lời giải bài toán ⚫ Tuy nhiên: ⚫ Sử dụng đệ quy rất tốn bộ nhớ và thời gian ⚫ Nên sử dụng giải thuật lặp thay thế nếu được (khử đệ quy) ⚫ Vẫn có những bài toán sử dụng đệ quy khá hữu ích: Giải thuật sắp xếp Quick Sort, Các phép duyệt cây
- Bài tập ⚫ Trong tài liệu