c++ - 有限空间内存

标签 c++ dictionary memoization stdmap

在尝试提高我对 this contest 的回答速度时,我有一个函数,它接受两个值 nk 并产生一个输出。重复计算,所以我正在记住它。我不能使用二维数组,因为 nk 的约束是 10^5!所以我正在使用 map :

std::map<std::pair<int,int>,double> m;

double solve(int n, int k)
{
    if(k==0) return n;
    if(k==1) return (n-1)/2.0;

    std::pair<int,int> p = std::make_pair(n,k);
    std::map<std::pair<int,int>,double>::iterator it;

    if( (it=m.find(p)) != m.end())
        return it->second;

    double ans = 0;
    for(int i=1 ; i<=n-1 ; i++)
        ans += solve(i,k-1);
    ans = ans/n;
    m[p] = ans;

    return ans;
}

但显然,这种方法太慢了。我的内存有问题吗?或者我可以像数组一样获取恒定时间提取,而不是从 map 中获取对数提取吗?

这个函数解决了这个循环:

formula

f(x,0) = xf(x,1) = (x-1)/2

可以用更好的方法解决这个问题吗?非常感谢。

最佳答案

小改进:记住 find 返回的迭代器并取消引用它而不是使用 operator[]。

关于c++ - 有限空间内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15256188/

相关文章:

c++ - 候选函数和声明顺序

c++ - 无法启动 "program.exe"系统找不到指定的文件vs2008

android - 在抽屉导航上出错

matlab - 如何编写一个创建和存储变量的函数?

ruby-on-rails - 如何使用 RSpec 测试内存?

hash - 程序解释期间的高效增量哈希计算

c++ - 是否可以为另一个对象重用智能指针的内存?

c++ - 为什么访问从堆上的对象返回的 c_str 得到垃圾值?

javascript - 如何获得一个国家的交互式地理 map ?

ios - 来自 JSON 的字典中的键