【发布时间】:2016-03-21 12:28:03
【问题描述】:
为了使用记忆法查找第 n 个斐波那契数,我找到了一个在 c++ 中使用 map 的代码。
我曾尝试在 java 中转换此代码,但失败了。
c++ 代码:
#include <bits/stdc++.h>
typedef long long int ll;
map<ll, ll> mp;
ll M = 1000000007;
long long fibonacci(long long n) {
if (mp.count(n))return mp[n];
long long k=n/2;
if (n%2==0) {
return mp[n] = fibonacci(k)*(fibonacci(k+1)+fibonacci(k-1)) % M;
} else {
return mp[n] = (fibonacci(k+1)*fibonacci(k+1) + fibonacci(k)*fibonacci(k)) % M;
}
}
int main()
{
mp[0]=mp[1]=1;
ll t;
scanf("%lld",&t);
printf("%lld\n",fibonacci(t));
}
我在 java 中使用HashMap 尝试了相同的代码。
java代码:
static HashMap<Long,Long> hm=new HashMap<Long,Long>();
static long f(long n) {
if (hm.containsKey(n)) return hm.get(n);
long k=n/2;
if (n%2==0) {
return hm.put(n,f(k)*(f(k+1)+f(k-1)) % M);
} else {
return hm.put(n, (f(k+1)*f(k+1) + f(k)*f(k)) % M);
}
}
public static void main(String[] args) throws IOException {
hm.put(1L,1L);
hm.put(0L,1L);
long b=f(2L);
}
但是java中的这段代码给出了StackOverflowError。
我在 java 中使用 LinkedHashMap 和 TreeMap 尝试了这段代码,两者都给出了相同的错误。
我必须使用哪个类与 c++ 中的map 相同?
请有人解释一下map 在 C++ 中的工作原理。
【问题讨论】:
-
这是一种非常复杂的实现方式。为什么不使用循环来记录适合数组中
long的所有值。这将花费 3 毫秒,不仅更快,而且更简单。 -
我正在解决这个问题spoj.com/problems/POWFIB
-
我尝试过使用矩阵乘法,但它给出了超出时间限制