Java 计算二项式选择(n,r)=n/(r!(n-r)!)使用记忆

Java 计算二项式选择(n,r)=n/(r!(n-r)!)使用记忆,java,algorithm,Java,Algorithm,二项式函数选择(n,r)=n/(r!(n-r)!) 如何编写一个程序来计算10^8=1亿个随机二项式,其中N从1到52随机选择,R从0到N随机选择 需要使用备忘录或类似的方法计算O(1)时间内的二项式 我的代码是这样的。我知道在每一个递归中,一个元素可能计算两次,我不知道如何通过使用记忆来提高效率 public static int choose(int n, int k){ if(k == 0) return 1; return (n * choose(n - 1, k -

二项式函数选择(n,r)=n/(r!(n-r)!) 如何编写一个程序来计算10^8=1亿个随机二项式,其中N从1到52随机选择,R从0到N随机选择

需要使用备忘录或类似的方法计算O(1)时间内的二项式

我的代码是这样的。我知道在每一个递归中,一个元素可能计算两次,我不知道如何通过使用记忆来提高效率

public static int choose(int n, int k){
    if(k == 0) return 1;

    return (n * choose(n - 1, k - 1)) / k;
}

在这种情况下,有效使用记忆的唯一方法是将结果放入
静态映射
,其中
myObject
是一个以n和k值为键的对象,int是结果。因此,每次计算或返回答案之前,您都必须存储或查找结果。

在这种情况下,有效使用记忆的唯一方法是将结果放入
静态映射中,其中
myObject
是一个以n和k值为键、int为结果的对象。因此,每次计算或返回答案之前,都必须存储或查找结果。

首先,整数数据类型的数字可能太大

想法是你一步一步地走。。。从被除数乘以后续数,从除数除以后续数

public class Binom {

    private long[][] mapped;

    public Binom(){
        mapped = new long[52][52];
    }

    public long binom(int n, int r) {
        if (r == 0)
            return 1;
        if (r == 1)
            return n;

        if(r > n-r)
            r = n-r;
        long toReturn = 1;
        for (int i = 1, m = n; i <= r; i++, m--){
            toReturn = toReturn*m/i;
        }
        return toReturn;
    }

    public long[][] getMapped() {
        return mapped;
    }
}

不打印会更快。。。您只需要为那些
1378=(52*52/2)
对计算二项式系数。

首先,您可能会得到太大的整数数据类型的数字

想法是你一步一步地走。。。从被除数乘以后续数,从除数除以后续数

public class Binom {

    private long[][] mapped;

    public Binom(){
        mapped = new long[52][52];
    }

    public long binom(int n, int r) {
        if (r == 0)
            return 1;
        if (r == 1)
            return n;

        if(r > n-r)
            r = n-r;
        long toReturn = 1;
        for (int i = 1, m = n; i <= r; i++, m--){
            toReturn = toReturn*m/i;
        }
        return toReturn;
    }

    public long[][] getMapped() {
        return mapped;
    }
}

不打印会更快。。。你只需要为那些
1378=(52*52/2)
对计算二项式系数。

这似乎是一个家庭作业问题。请尝试编写代码以完成要求。然后问你是否有具体的问题,因为N和R都很低,你可能想使用帕斯卡三角形公式,而不是你在问题文本中的公式。尽管如此,值C(50,25)不适合
int
,因此需要
long
?只需要建立一个表。或者这是关于二项式本身的计算?并使用
long
避免溢出。这似乎是一个家庭作业问题。请尝试编写代码以完成要求。然后问你是否有具体的问题,因为N和R都很低,你可能想使用帕斯卡三角形公式,而不是你在问题文本中的公式。尽管如此,值C(50,25)不适合
int
,因此需要
long
?只需要建立一个表。或者这是关于二项式本身的计算?并使用
long
避免溢出。这个答案不是很有帮助(因为现在还不清楚什么是
myObject
。另外,您现在不能在Java中使用基元类型
int
。此外,使用
Map
解决问题的效率非常非常非常低。或者只使用数组,因为计算出的二进制数的总数对于加快查找速度来说非常低。
Map
往往会降低速度。)很多。而且这肯定不是唯一的办法。这个答案不是很有帮助(因为现在还不清楚什么是
myObject
。另外,您现在不能在Java中使用基元类型
int
。此外,使用
Map
解决问题的效率非常非常非常低。或者只使用数组,因为计算出的二进制数的总数对于加快查找速度来说非常低。
Map
往往会降低速度。)wn相当多。这肯定不是唯一的方法。@ruakh,不是微缩,而是。@ruakh,更正。从
HashMap
切换到
long[][]
int[][]
是不够的。@ruakh,不是微缩,而是@ruakh,更正。从
HashMap
切换到
long[][]
int[][]
还不够。
99999995. Binomial for n: 3 and r: 3 equals 1.
99999996. Binomial for n: 19 and r: 17 equals 171.
99999997. Binomial for n: 26 and r: 20 equals 230230.
99999998. Binomial for n: 32 and r: 13 equals 347373600.
99999999. Binomial for n: 20 and r: 14 equals 38760.
100000000. Binomial for n: 3 and r: 3 equals 1.
The whole lasted 342 seconds.