【发布时间】:2013-03-06 19:24:41
【问题描述】:
在尝试提高我对this contest 的回答速度时,我有一个函数,它采用两个值n 和k 并产生一个输出。计算是重复的,所以我要记住它。我不能使用二维数组,因为n 和k 的约束是10^5!所以我正在使用地图:
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;
}
但显然,这种方法太慢了。我的记忆有问题吗?或者我可以像数组一样获取恒定时间而不是从地图中获取对数?
这个函数解决了这个重复:
f(x,0) = x 和 f(x,1) = (x-1)/2
能否以更好的方式解决这个问题?提前非常感谢。
【问题讨论】:
-
unordered_map 会有所帮助,但您至少需要进行两倍以上的查找。
-
@OliCharlesworth 嗯。显然在我的情况下..
-
我认为对于这段代码,您可以从分析逻辑中获得更多,而不仅仅是缓存结果。简短的一瞥让我觉得你应该能够在 O(1) 中计算这个,而不是你在这里的 O(n*k)。
-
鉴于
if (k<n-1)那么结果为零,可以针对这些情况进行一些重要的优化。此外,map对于相同的数据范围占用 更多 空间,除非它是稀疏的,但快速分析表明您的数据不会稀疏。所以要么(A)使用二维数组,要么(B)只缓存sparcely。 -
@Bruce 重复出现和代码不同。我是从 0 开始还是从 1 开始?那么y
标签: c++ map memoization stdmap