【问题标题】:Combinations using memoization in java在 java 中使用 memoization 的组合
【发布时间】:2012-10-08 00:27:08
【问题描述】:

我正在编写一个程序,计算给定两个数字的组合,例如:

java Combination 5 3 

答案是 10。

我有一个看起来像这样的方法:

public static int choose(int n, int k) {   // chooses k elements out of n total
  if (n == 0 && k > 0)
      return 0;
  else if (k == 0 && n >= 0)
      return 1;
  else return choose(n - 1, k - 1) + choose(n - 1, k);

我如何能够为此使用 memoization 以使其更快地计算更大的数字?

【问题讨论】:

    标签: java recursion combinations memoization


    【解决方案1】:

    使用更有效的公式可能会更好:http://en.wikipedia.org/wiki/Binomial_coefficient#Multiplicative_formula

    如果你想使用这个公式,那么这是一种记忆的方法(没有我可能有的拼写错误):

    private static Map<Pair<Integer, Integer>, Long> cache = new HashMap<>(); // you'll need to implement pair
    
    public static int choose(int n, int k) {
    ... // the base cases are the same as above.
    } else if (cache.contains(new Pair<>(n, k)) {
        return cache.get(new Pair<>(n, k));
    } else {
        Long a = cache.get(new Pair<>(n - 1, k - 1));
        if (a == null) { a = choose(n - 1, k - 1); }
        Long b = cache.get(new Pair<>(n - 1, k));
        if (b == null) { b = choose(n - 1, k); }
    
        cache.put(new Pair<>(n, k), a + b);
        return a + b;
    }
    

    【讨论】:

    • 这似乎是一个更有用的算法,但这个项目的一个要求是我使用上面的递归案例。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2015-11-21
    • 2010-10-16
    • 2017-02-05
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多