Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (79.41 KB, 10 trang )
Thiết kế thuật toán
Lê Sỹ Vinh
Bộ môn Khoa Học Máy Tính – Khoa CNTT
ðại Học Công Nghệ - ðHQGHN
Email:
Chia ðể Trị (Divide and Conquer)
1. Chia bài toán lớn thành các bài toán có kích thước nhỏ
2. Giải các bài toán có kích thước nhỏ
3. Kết hợp nghiệm của các bài toán có kích thước nhỏ ñể giải 3. Kết hợp nghiệm của các bài toán có kích thước nhỏ ñể giải
bài toán lớn
Ví dụ: Dãy số Fibonacci
Dãy Fibonacci:
0 1 2 3 5 8 13…
f(0) = 0
f(1) = 1
f(k) = f(k-1) + f(k-2)
Fibonacci_DAC (k) {
if (k == 0) return 0
else if (k == 1) return 1
else return Fibonacci _DAC (k-1) + fibonacci_DAC (k-2)
}
Nhận xét: Các bài toán nhỏ ñược giải quyết dựa vào những bài toán nhỏ hơn
giống nhau.
Quy hoạch ñộng (Dynamic programming)
• Giống phương pháp ‘chia-ñể-trị’ (divide-and-conquer) là giải quyết bài
toán lớn dựa vào kết quả các bài toán con.
• ðiểm khác biệt là quy hoạch ñộng lưu lại nghiệm của tất cả các bài toán
con, mỗi bài toán con chỉ phải tính toán 1 lần.
• Quy hoach ñộng thường ñược dùng ñể giải quyết những bài toán liên quan
ñến tối ưu hóa (tìm nghiệm tốt nhất).
Ví dụ: Dãy số Fibonacci