我正在计算给定的两个数字,前一个组合的程序:
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);
我该如何将能够使用记忆化这个以使其具有较大的数字计算速度更快?
你可能会使用更高效的配方会更好: http://en.wikipedia.org/wiki/Binomial_coefficient#Multiplicative_formula
如果你想使用这个公式,那么这是一种方法,memoize的(没有错别字我可能有):
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;
}