有没有办法让这个程序运行得更快?它已经比我尝试制作的HashMap版本更快了,但根据我提交给它的地方,它仍然在45分左右太慢了。我有什么修改可以改进吗?
import java.util.Scanner;
public class Fibo {
static long[] cache;
static long ans;
public static long fibo(int n) {
if (n == 0)
return 1;
if (n < 2)
ans = 1;
else
ans = fibo(n - 1) + fibo(n - 2);
cache[n - 1] = ans;
return ans;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("test");
int num = input.nextInt();
input.close();
cache = new long[num];
long ans = fibo(num);
System.out.println(ans);
}
}
答案 0 :(得分:3)
您试图在缓存中记住答案,但您没有使用它。在进行任何其他计算之前检查缓存。此外,当您到达ArrayIndexOutOfBoundsException
时,您将获得fibo(0)
,因为您正在减去一个public static long fibo(int n) {
// Try cache first.
if (cache[n] != 0) return cache[n];
if (n == 0)
return 1;
if (n < 2)
ans = 1;
else
ans = fibo(n - 1) + fibo(n - 2);
// Don't subtract one.
cache[n] = ans;
return ans;
}
。删除减法并增加数组的大小以解决它。
fibo(num)
主要是为cache = new long[num + 1];
的答案腾出空间。
Big
答案 1 :(得分:2)
您可以通过使用缓存的值来加快速度:
public static long fibo(int n) {
if (cache[n] > 0) {
return cache[n];
}
...
cache[n] = ans; // you are saving at the wrong index
...
}
尽管在O(n)处使用memoization是“快速”的,但是有一个超级快速的ma(O)log解决方案。