为什么我的斐波那契动态规划没有给出线性时间?

Why my dynamical programming of fibonacci doesn't give a linear time?

本文关键字:线性 时间 动态规划 我的 为什么      更新时间:2023-10-16

我正在看这个视频。基本上,它说使用dictionary (python的语言?)将计算从O(n^2)到O(n)的fibonacci。

我已经编写了以下代码,fibo1应该是0 (n),但实际上它运行得很慢。fibo2是正常的递归,它是O(n^2)解,但实际上它比fibo1快得多。我怎么能理解呢?

#include <iostream>
#include <map>
int fibo1(int i, std::map<int,int>& m);
int fibo2(int i);
int main()
{
    std::map<int,int> m;
    m[1] = 1; m[2] = 1;
    int n = 40;
    std::cout << fibo1(n,m);
    //std::cout << fibo2(n);
    return 0;
}
int fibo1(int i, std::map<int,int>& m)   {
    if(m[i]==0)   {
        return fibo1(i-1,m)+fibo1(i-2,m);
    }
    return m[i];
}
int fibo2(int i) {
    if(i==1 || i==2) {
        return 1;
    }
    return fibo2(i-1)+fibo2(i-2);
}

你从来没有真正写fib[n]m[n],所以你从来没有查找任何东西,总是重新计算它。在if语句中使用m[i] = fibo1(i-1,m) + fibo1(i-2,m);而不是返回行

在fibo1方法中,您只返回值而没有为映射设置适当的值。

int fibo1(int i, std::map<int,int>& m)   {
if(m[i]==0)   {
    m[i] = fibo1(i-1,m)+fibo1(i-2,m);
}
return m[i];
}

另外,您应该考虑使用简单的矢量而不是映射来获得更好的性能

您不将结果存储在映射中,并且您应该记住,std::map::operator[]正在进行查找,这非常昂贵,因此您应该避免对同一键进行多次查找:

int fibo1(int i, std::map<int,int>& m)   {
    int &value = m[i];
    if( value == 0)   {
        value = fibo1(i-1,m)+fibo1(i-2,m);
    }
    return value;
}