为什么我的斐波那契动态规划没有给出线性时间?
Why my dynamical programming of fibonacci doesn't give a linear time?
我正在看这个视频。基本上,它说使用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;
}
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 是否可以显示需要线性搜索的时间才能找到您在程序中找到的密钥
- 在线性时间内使用邻接列表创建对顶点
- 从文件中获取亚线性时间的输入
- 拆分动态分配的数组,无需线性时间复制
- 返回C++和时间复杂度的线性列表
- 使用递归在常量空间和线性时间中向后打印链表
- 如何在线性时间内生成一类稳定的二进制值
- 线性时间欧拉全函数计算
- 如何在次线性时间内从行主数组中选择列
- 向量复制构造函数C++:它必须是线性时间吗
- 为什么我的斐波那契动态规划没有给出线性时间?
- 一个数据结构的线性时间构造,如果两个字符串有两个共同的字母,则在常数时间内回答
- 线性搜索向量[i]的响应时间为0ms,而向量.at(i)的响应时间为0ms
- 有可能在线性时间内进行一般排序吗
- 给定一个排序数组和一个参数 k,求出线性时间内大于或等于 k 的两个数字的总和