使这个具有memoization的递归斐波那契更快?

时间:2018-04-13 17:40:14

标签: java recursion fibonacci memoization

有没有办法让这个程序运行得更快?它已经比我尝试制作的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);
    }
}

2 个答案:

答案 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解决方案。