备忘录斐波那契未运行与常规斐波那契解决方案

时间:2018-12-03 23:37:03

标签: java algorithm dynamic-programming

因此,我自己学习动态编程,并且尝试测试记忆化的解决方案与正常的斐波那契解决方案。 当我输入一个相当大的数字(如43)时,我的记忆解决方案将永远运行,而普通解决方案将在5-6秒后运行。这是否意味着我记住的解决方案不被记住?

这是我的传统解决方案:

public static int fibonacci(int i) 
{
    if(i == 0) 
    {
        return 0;
    }
    if(i <= 2) 
    {
        return 1;
    }
    return fibonacci(i - 1) + fibonacci(i - 2);
}

已解决的解决方案:

public static int fibonacci(int n) 
{
    Map<Integer, Integer> memo = new HashMap<>();
    if(n == 0) 
    {
        return 0;
    }
    if(n <= 2)
    {
        return 1;
    }
    if(memo.containsKey(n))
    {
        return memo.get(n);
    }
    int result = fibonacci(n - 1) + fibonacci(n - 2);
    memo.put(n, result); 

    return result;
}

主要方法:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    scanner.close();
    System.out.println(fibonacci(n));
}

对于这种情况的任何解释,将不胜感激:)

1 个答案:

答案 0 :(得分:3)

由于@shmosel,我能够弄清楚在“ memoized”解决方案中,每次调用该方法时,都会调用一个新地图,这将导致它非常慢!我通过将地图添加为实例变量来规避此问题,如下所示:

{{1}}

这大大提高了性能。