C ++ memoization - Fibonacci函数 - 映射verus向量容器执行时间

时间:2018-03-07 16:52:28

标签: c++ dictionary vector memoization

我试图在C ++中学习memoization,并使用mapvector实现了两个Fibonacci函数。我已将它们提交到Coursera数据结构课程。由于花费了太多时间并且vector传递正常,map实现失败。由于两者都实现了记忆,任何人都可以建议为什么一个失败而另一个失败?

#include <iostream>
#include <map>
#include <iterator>
#include <vector>

using namespace std;

int fibonacci_fast_vector(int n)
{
    vector <int> cache;

    if(n<=1) {
        return n;
    }
    else if ((unsigned)n >= cache.size()) {
            cache.resize(n+1);
        }

    if(cache[n] != 0) {
        return cache[n];
    }

    // otherwise
    int ret=fibonacci_fast_vector(n-1)+fibonacci_fast_vector(n-2);
    cache[n]=ret;
    return ret;
}


int fibonacci_fast_map(int n)
{
    static map<int,int>memo;

    if(n<=1)
        return n;

    if(memo.count(n)>0) { /*if it is in the map return the element*/
        return memo[n];
    }

    // otherwise
    int ret=fibonacci_fast_map(n-1)+fibonacci_fast_map(n-2);
    memo[n]=ret;
    return ret;
}

int main() {
    int n = 0;
    std::cin >> n;

    std::cout << fibonacci_fast_map(n) << '\n';
    std::cout << fibonacci_fast_vector(n) << '\n';
    return 0;
}

2 个答案:

答案 0 :(得分:4)

在此代码中:

int fibonacci_fast_vector(int n)
{
    vector <int> cache;

你的矢量不是静态的,所以你在每个函数调用上创建一个新的向量,所以你的&#34; memoization&#34;不仅没有工作,反而实际上变慢了。

顺便说一下这段代码:

if(memo.count(n)>0) { /*if it is in the map return the element*/
    return memo[n];
}

是不必要的低效率 - 如果数据存在则进行2次查找;如果不存在则进行2次查找,这在地图上是非常昂贵的操作。你应该使用这样的东西:

auto p = memo.emplace(n,0);
if( p.second ) // data was not there
    p.first->second = fibonacci_fast_map(n-1)+fibonacci_fast_map(n-2);

return p.first->second;

答案 1 :(得分:0)

我猜问题是你的矢量不是静态的。放置一个static关键字或在全局范围内声明它。这将减少巨大的性能时间,因为您避免了许多newsdeletes。如果由于相同的性能原因知道可能的大小,也可以创建一些初始大小向量。