You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带Memoization的斐波那契程序运行更慢,求性能差异原因

带Memoization的斐波那契程序性能异常原因分析

你遇到的问题核心是缓存完全没生效,还额外增加了不必要的开销,具体原因和解决方法如下:

问题根源

你的代码里,map<int, int> mp = {}是fibNum函数的局部变量——每次递归调用fibNum,都会新建一个空的map。这意味着:

  • 之前递归计算出的斐波那契值根本不会被缓存下来,所有子问题还是会重复计算,和无缓存版本的递归逻辑完全一致。
  • 每次调用还要承担map的构造、析构,以及find操作的额外性能开销,这直接导致运行时间比无缓存版本还长。

修正方案

要让缓存真正生效,必须让所有递归调用共享同一个缓存容器,最简单的方式是把map改成静态变量:

#include <iostream>
#include <map>

using namespace std;

int fibNum(int n) {
    static map<int, int> mp; // 静态变量,整个程序生命周期内只初始化一次
    if(mp.find(n) != mp.end()){
        return mp[n];
    }
    if (n == 1 || n == 2){
        return 1;
    } else if (n == 0){
        return 0;
    } else {
        int answer = fibNum(n - 1) + fibNum(n - 2);
        mp[n] = answer; 
        return answer;
    }
    return 0;
}

int main() {
    int term; cin >> term;
    
    time_t start,end;
    time(&start);
    ios_base::sync_with_stdio(false); 

    cout << fibNum(term) << endl;

    time(&end);

    double timeTaken = double(end - start);
    cout << "Time taken by program is : " << fixed 
        << timeTaken << ' ' << " sec\n"; 

    return 0;
}

另外,因为斐波那契的参数n是连续的整数,用vector代替map会更高效——vector的随机访问是O(1)时间,比map的O(logn)查找速度更快,能进一步提升性能。

内容的提问来源于stack exchange,提问作者kohtzerui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:30:10