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

Posted

技术标签:

【中文标题】C++ memoization - Fibonacci 函数 - map verus 向量容器执行时间【英文标题】:C++ memoization - Fibonacci function - map verus vector container execution time 【发布时间】:2018-03-07 16:52:27 【问题描述】:

我正在尝试学习 C++ 中的记忆,并使用 mapvector 实现了两个斐波那契函数。我已将它们提交给 Coursera 数据结构课程。 vector 实现由于花费太多时间而失败,map 通过 OK。由于两者都实现了记忆,任何人都可以提出为什么一个失败而另一个通过吗?

#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;

【问题讨论】:

您的矢量不是静态的。这使得它的行为完全不同。 【参考方案1】:

在这段代码中:

int fibonacci_fast_vector(int n)

    vector <int> cache;

您的向量不是静态的,因此您在每次函数调用时都会创建一个新向量,因此您的“记忆”不仅无法正常工作,而且实际上会使其变慢。

顺便说一句:

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;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于C++ memoization - Fibonacci 函数 - map verus 向量容器执行时间的主要内容,如果未能解决你的问题,请参考以下文章

ModuleNotFoundError:没有名为“memoize”的模块

Perl性能优化之Memoize的实现原理

react——memoize-one性能优化方案—— memoization(计算属性/记忆组件)

lodash _.memoize

何时在 Ruby on Rails 中使用 memoization

将 memoization 装饰器理解为闭包