Ghi nhớ kết quả
Bài học 4 trên 15 trong khóa học Nhập môn quy hoạch động của Coddy.
Ghi nhớ (memoization) là một kỹ thuật tối ưu hóa trong lập trình động, giúp tăng tốc chương trình bằng cách lưu kết quả của các lần gọi hàm tốn nhiều tài nguyên và trả về kết quả đã lưu khi gặp lại cùng đầu vào.
Để triển khai kỹ thuật ghi nhớ, bạn có thể tạo một từ điển để lưu các kết quả đã tính, trong đó khóa là các đối số đầu vào và giá trị là kết quả đầu ra tương ứng. Trước khi tính kết quả của một hàm, bạn có thể kiểm tra xem đầu vào đã được tính và lưu trong từ điển hay chưa. Nếu rồi, bạn có thể trả về kết quả đã lưu thay vì tính lại. Nếu chưa, bạn tính kết quả rồi lưu vào từ điển.
listcũng có thể được dùng để triển khai kỹ thuật ghi nhớ.
Kỹ thuật ghi nhớ có thể tăng tốc đáng kể các thuật toán lập trình động, đặc biệt khi có nhiều bài toán con chồng lấn.
Thử thách
DễViết một hàm Python có tên fib để tính số Fibonacci thứ n bằng phương pháp ghi nhớ.
- Dùng từ điển
memođể lưu các số Fibonacci đã tính. - Trước khi tính số Fibonacci thứ n, hãy kiểm tra xem số đó đã được tính và lưu trong
memochưa. - Nếu đã có, hãy trả về kết quả đã lưu. Nếu chưa, hãy tính số Fibonacci thứ n bằng hệ thức truy hồi
fib(n) = fib(n-1) + fib(n-2)rồi lưu kết quả vào từ điển để dùng sau.
Gợi ý: xem lời giải ở cuối để kiểm tra xem bạn đã dùng phương pháp ghi nhớ đúng cách chưa!
Tự làm thử
memo = {0: 0, 1: 1}
def fib(n):
Tất cả bài học trong Nhập môn quy hoạch động
1Giới thiệu về quy hoạch động
Quy hoạch động là gì?Vì sao quy hoạch động quan trọng?Ứng dụng trong nhiều lĩnh vực3Thuật toán quy hoạch động
Dãy con chung dài nhấtBài toán cái ba lôBài toán đổi tiềnKhoảng cách chỉnh sửaTự luyện tập: Trình biên dịch Python online