为什么我的记忆计算失败?

Why is my memoized calculation failing?

提问人:computerserf 提问时间:8/30/2016 更新时间:8/30/2016 访问量:46

问:

我正在尝试将二维递归问题转换为动态规划问题。但结果是不同的。

代码如下:

import edu.princeton.cs.algs4.*;
import java.util.Arrays;

public class Test {

    public static double binomial(int N, int k, double p) {
        if(N == 0 && k == 0) return 1.0;
        if(N < 0 || k < 0) return 0.0;
        return (1 - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1, p);
    }

    public static double binomialm(int N, int k, double p) {
        if(N < 0 || k < 0) return 0.0;

        double[][] memory = new double[N+1][k+1];
        memory[0][0] = 1.0;
        memory[1][0] = 1 - p;
        memory[0][1] = 0.0;

        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= k; j++) {
                memory[i][j] = (1 - p)*memory[i-1][j] + p*memory[i-1][j-1];
            }
        }

        return memory[N][k];
    }

    static public void main(String args[]) {
        long stime, stime1, etime, etime1;
        double r, r1;
        stime = System.currentTimeMillis();
        r = binomial(10, 5, 0.25);
        etime = System.currentTimeMillis();
        System.out.println("Regular binomial: result = " + r + ", time = " + (etime - stime));
        stime1 = System.currentTimeMillis();
        r1 = binomialm(10, 5, 0.25);
        etime1 = System.currentTimeMillis();
        System.out.println("Memoized binomial: result = " + r1 + ", time = " + (etime1 - stime1));
    }
}

我真的想不通为什么结果会有所不同。他们来了:

正则二项式:结果 = 0.058399200439453125,时间 = 0

记忆二项式:结果 = 0.045421600341796875,时间 = 0

我缺少一些浮点魔法吗?

算法 动态规划 浮动精度

评论

0赞 displayName 8/30/2016
很少有老师自己知道并能够正确地教授动态编程,以至于我已经对任何试图学习它的人深表敬意。:D如果有人有一个很好的链接,清楚地解释了 DynaPro 并系统地解释了编写其代码,请给我贴上名字标签并告诉我。

答:

1赞 Dietmar 8/30/2016 #1

在记忆版本中,内部循环从 .因此,(2,0)、(3,0)、(4,0)、...永远不会改变,它们仍然是创建双精度数组后的 0.0。它们应该是 1.0、-1.0、1.0、......j = 1

for(int i = 1; i <= N; i++) {
    memory[i][0] = (1 - p)*memory[i-1][0];
    for(int j = 1; j <= k; j++) {
        memory[i][j] = (1 - p)*memory[i-1][j] + p*memory[i-1][j-1];
    }
}