Bài giảng Cấu trúc dữ liệu và giải thuật - Thuật toán đệ quy gồm có những nội dung chính sau đây: Định nghĩa đệ quy, thuật toán đệ quy, phân tích thuật toán đệ quy, đệ quy có nhớ, thuật toán quay lui (backtracking algorithm). Mời các bạn cùng tham khảo.
1/10/2011 REVIEW Xác định mối quan hệ giữa các cặp hàm a , b , c và sau , THUẬT TỐN ĐÊ QUY Nội dung Định nghĩa đệ quy Định nghĩa đệ quy Thuật tốn đệ quy Phân tích thuật tốn đệ quy Đệ quy có nhớ Thuật tốn quay lui (backtracking algorithm) Đối tượng bao gồm chính nó hoặc được định nghĩa dưới dạng chính nó VD. Định nghĩa một cơng thức hợp lệ của các biến, số và các phép tốn , ,∗,/, ^ là cơng thức hợp lệ nếu là biến hoặc số Nếu , là cơng thức hợp lệ thì , , ∗ , / , ^ cũng là cơng thức hợp lệ 1/10/2011 Hàm được định nghĩa đệ quy ! ế ! ế Định nghĩa đệ quy 0 Mọi định nghĩa đệ quy đều gồm 2 phần ế 1, 2 ế ế ế 1 ế Một trường hợp cơ sở (nhỏ nhất) có thể xử lý trực tiếp mà khơng cần đệ quy, và Một phương thức tổng qt mà biến đổi một trường hợp cụ thể về các trường hợp nhỏ hơn. Do đó biến đổi các trường hợp cho đến khi về trường hợp cơ sở Danh sách ban đầu Thuật tốn đệ quy Thuật tốn có chứa lời gọi đệ quy đến chính nó với đầu vào kích thước nhỏ hơn VD. Sắp xếp trộn – MergeSort MergeSort(int A[], int start, int end) { if(start ; log n! = (n log n) Vấn đề với phương pháp thay thế T(n) = T(n) = 4T(n/2) + n n=1 n>1 Dự đoán (chặt hơn!): T(n) cn2 n>n0 T(n) = T(n) = 4T(n/2) + n n=1 n>1 Sử dụng dự đốn xác Chuyển qui nạp: Giả sử T(k) ck2, kn0 Giả sử T(k) ck2 - dn, kn T(n) cn n>1 Giả sử T(k) ck2 - dn, kn T(n) cn n>1 Giả sử T(k) ck2 - dn, k1: T(n) = 4T(n/2) + n 4(c(n/2)2 ‐ d(n/2)) + n = cn2 ‐ 2dn + n = cn2 ‐ dn ‐ (dn ‐ n) cn2 ‐ d*n (định nghĩa) (qui nạp) (biến đổi) (biến đổi) (Chọn d1) Ví dụ 2 (tiếp) T(n) = T(n) = 4T(n/2) + n n=1 n>1 Đã chứng minh: T(n) 2n2 – 1n n>0 Phương pháp cây đệ quy Vậy, T(n) = O(n2) 1/10/2011 Phương pháp cây đệ quy Phương pháp cây đệ quy Cây đệ quy cho mergeSort ế ế Phương pháp cây đệ quy Ο Xét cơng thức đệ quy Phương pháp cây đệ quy Dùng phương pháp thay thế để chứng minh lời giải cơng thức đệ quy tìm được Ο Ο log VD. log log log log Với log log log Bài tập: Xác định một cận trên tốt cho công thức đệ quy 2 3 (chú ý log log 2 log dùng phương pháp thế để xác nhận lại kết quả log 1) 1/10/2011 Dùng định lý thợ Dùng để giải các công thức đệ quy dạng , Định lý thợ Master theorem Dùng định lý thợ Nếu Nếu Ο Ο Nếu Ω ⁄ VD. Thuật toán sắp xếp trộn chia thành 2 bài tốn con, kích thước /2. Chi phí tổng hợp 2 bài tốn con là Ο Dùng định lý thợ Định lý thợ (Master Theorem) 1, là các hằng số, là một hàm. định nghĩa đệ quy trên các tham số khơng âm , trong đó ⁄ có thể hiểu là ⁄ hoặc ⁄ có thể bị giới hạn một cách tiệm cận như sau: ⁄ Thì 1, 1, à ệ ậ ươ một cách hiệu quả Bài tốn ban đầu được chia thành bài tốn con có kích thước mỗi bài là ⁄ , chi phí để tổng hợp các bài tốn con là , với hằng thì Θ thì log Áp dụng định lý thợ: Θ , với hằng 0, và nếu với hằng và với mọi n đủ lớn thì Θ 9, là trường hợp 1 (với 1, 3/2 và trường hợp 2, do đó Ο Θ 3, ta có 1) do đó ta có Θ log ≡ Θ / Đây 1. Đây là log và , Ω ≡3 log (TH3) log ta có với log với ≡ 0.2, ⁄ do vậy 1/10/2011 Dùng định lý thợ Chú ý: Không phải trường hợp nào cũng áp dụng được định lý thợ ! VD. 2 và 2, ≡ log log do đó có vẻ áp dụng trường hợp 3. log tiệm cận lớn hơn 2 Tuy nhiên mọi hằng số do đó khơng thể áp dụng được với Đệ quy có nhớ Đệ quy có nhớ Trong thuật tốn đệ quy, những bài tốn con có thể được giải đi giải lại nhiều lần! VD. Tính số Fibonacci ế 0,1 ế Tính Ghi nhận lời giải: dùng mảng Khi gặp bài tốn con cần giải: Kiểm tra xem bài tốn con đã được giải chưa: Thuật tốn quay lui Back‐tracking algorithm Nếu đã giải: lấy kết quả Ngược lại, giải bài tốn con và cập nhật lời giải vào bảng 1/10/2011 Thuật tốn quay lui Bài tốn 8 con hậu: “Hãy xếp 8 con hậu trên bàn cờ 8x8 sao cho chúng khơng thể ăn lẫn nhau” Thuật tốn quay lui Thuật tốn xếp hậu: đặt lần lượt các qn hậu lên bàn cờ (theo 1 cách nào đó) sao cho qn hậu đặt sau khơng ăn được qn đã đặt trước đó Thuật tốn quay lui 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 Thuật tốn quay lui Dead end: trạng thái chưa kết thúc, nhưng ta khơng thể đặt thêm được 1 qn hậu nào nữa Khi rơi vào trạng thái dead end ta phải tiến hành quay lui (backtrack) lại lựa chọn gần nhất để thử một khả năng có thể khác { 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; } 10 1/10/2011 Bài toán 8 con hậu Thuật toán quay lui Thuật toán quay lui – backtracking algorithm: Thử tìm kiếm lời giải đầy đủ cho bài tốn từ việc xây dựng lời giải bộ phận, trong đó lời giải bộ phận phải ln phù hợp với u cầu bài tốn Trong q trình thực hiện, thuật tốn mở rộng dần lời giải bộ phận. Nếu việc mở rộng khiến lời giải bộ phận vi phạm u cầu bài tốn thì tiến hành quay lui, loại bỏ sửa đổi gần nhất và thử một khả năng xây dựng lời giải bộ phận có thể (hợp lệ) khác. Nhận xét: Giải thuật Thử vị trí hàng function Try (column) { for (row = 1; row