Có cái nhìn sâu sắc của bạn là đúng. Đây được gọi là dynamic programming. Nó thường là một thời gian chạy bộ nhớ chung.
Trong trường hợp của fibo, bạn thậm chí không cần bộ nhớ cache tất cả mọi thứ:
[sửa] Tác giả của câu hỏi dường như được tìm kiếm một phương pháp chung để cache chứ không phải là một phương pháp để tính toán Fibonacci . Tìm kiếm wikipedia hoặc xem mã của người đăng khác để nhận câu trả lời này. Những câu trả lời là tuyến tính trong thời gian và bộ nhớ.
** Đây là một thuật toán O tuyến tính thời gian (n), liên tục trong bộ nhớ **
in OCaml:
let rec fibo n =
let rec aux = fun
| 0 -> (1,1)
| n -> let (cur, prec) = aux (n-1) in (cur+prec, cur)
let (cur,prec) = aux n in prec;;
in C++:
int fibo(int n) {
if (n == 0) return 1;
if (n == 1) return 1;
int p = fibo(0);
int c = fibo(1);
int buff = 0;
for (int i=1; i < n; ++i) {
buff = c;
c = p+c;
p = buff;
};
return c;
};
này thực hiện trong thời gian tuyến tính. Nhưng đăng nhập là thực sự có thể !!! Chương trình của Roo cũng tuyến tính, nhưng chậm hơn và sử dụng bộ nhớ.
Đây là thuật toán log O (log (n))
Bây giờ cho các thuật toán log-thời gian (cách cách cách nhanh hơn), đây là một phương pháp: Nếu bạn biết u (n), u (n-1), tính u (n + 1), u (n) có thể được thực hiện bằng cách áp dụng một ma trận:
| u(n+1) | = | 1 1 | | u(n) |
| u(n) | | 1 0 | | u(n-1) |
Vì vậy mà bạn có:
| u(n) | = | 1 1 |^(n-1) | u(1) | = | 1 1 |^(n-1) | 1 |
| u(n-1) | | 1 0 | | u(0) | | 1 0 | | 1 |
Đang tính toán theo hàm mũ của các ma trận có độ phức tạp logarit. Chỉ cần thực hiện một cách đệ quy các ý tưởng:
M^(0) = Id
M^(2p+1) = (M^2p) * M
M^(2p) = (M^p) * (M^p) // of course don't compute M^p twice here.
Bạn cũng có thể chỉ diagonalize nó (không khó), bạn sẽ tìm thấy số vàng và liên hợp của nó trong eigenvalue của nó, và kết quả sẽ cung cấp cho bạn một công thức toán học chính xác cho u (n). Nó chứa các quyền hạn của các giá trị riêng biệt đó, do đó độ phức tạp sẽ vẫn là logarit.
Fibo thường được lấy làm ví dụ để minh họa Lập trình động, nhưng như bạn thấy, nó không thực sự thích hợp.
@John: Tôi không nghĩ rằng nó có liên quan gì đến việc làm với băm.
@ John2: Bản đồ hơi chung chung bạn nghĩ sao? Đối với trường hợp Fibonacci, tất cả các khóa đều tiếp giáp sao cho một vectơ là thích hợp, một lần nữa có nhiều cách nhanh hơn để tính toán trình tự fibo, xem mẫu mã của tôi ở đó.
+1 cho phương trình ma trận, đó là lần đầu tiên tôi nhìn thấy một dẫn xuất của công thức chính xác –
Cảm ơn bạn!(^ - ^) Và bạn có thể sử dụng phương thức này cho bất kỳ chuỗi đệ quy nào. – fulmicoton