gpt4 book ai didi

c - 哪种计算 nCr 的方法更好

转载 作者:太空狗 更新时间:2023-10-29 16:23:17 25 4
gpt4 key购买 nike

方法一:
C(n,r) = n!/(n-r)!r!

方法二:
在书Combinatorial Algorithms by wilf ,我发现了这个:
C(n,r) 可以写成C(n-1,r) + C(n-1,r-1)

例如

C(7,4) = C(6,4) + C(6,3) 
= C(5,4) + C(5,3) + C(5,3) + C(5,2)
. .
. .
. .
. .
After solving
= C(4,4) + C(4,1) + 3*C(3,3) + 3*C(3,1) + 6*C(2,1) + 6*C(2,2)

如您所见,最终的解决方案不需要任何乘法。在每个形式 C(n,r) 中,n==r 或 r==1。

这是我实现的示例代码:

int foo(int n,int r)
{
if(n==r) return 1;
if(r==1) return n;
return foo(n-1,r) + foo(n-1,r-1);
}

参见 output在这里。

在方法 2 中,存在重叠的子问题,我们调用递归再次解决相同的子问题。我们可以使用 Dynamic Programming 来避免它.

我想知道哪种计算 C(n,r) 的方法更好?。

最佳答案

这两种方法都会节省时间,但第一种很容易出现 integer overflow .

方法一:

这种方法将在最短的时间内生成结果(最多 n/2 次迭代),并且可以通过小心地进行乘法来减少溢出的可能性:

long long C(int n, int r) {
if(r > n - r) r = n - r; // because C(n, r) == C(n, n - r)
long long ans = 1;
int i;

for(i = 1; i <= r; i++) {
ans *= n - r + i;
ans /= i;
}

return ans;
}

此代码将从较小的一端开始计算分子的乘法,并且由于任何 k 连续整数的乘积可以被 k! 整除,因此不会被整除问题。但是溢出的可能性仍然存在,另一个有用的技巧可能是在进行乘法和除法(和 仍然可能会发生溢出)。

方法 2:

在这种方法中,您实际上是在构建 Pascal's Triangle .动态方法比递归方法快得多(第一个是 O(n^2) 而另一个是指数)。但是,您还需要使用 O(n^2) 内存。

# define MAX 100 // assuming we need first 100 rows
long long triangle[MAX + 1][MAX + 1];

void makeTriangle() {
int i, j;

// initialize the first row
triangle[0][0] = 1; // C(0, 0) = 1

for(i = 1; i < MAX; i++) {
triangle[i][0] = 1; // C(i, 0) = 1
for(j = 1; j <= i; j++) {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
}
}

long long C(int n, int r) {
return triangle[n][r];
}

然后你可以在 O(1) 时间内查找任何 C(n, r)

如果您需要特定的C(n, r)(即不需要整个三角形),那么内存消耗可以O(n)从上到下覆盖三角形的同一行。

# define MAX 100
long long row[MAX + 1];

int C(int n, int r) {
int i, j;

// initialize by the first row
row[0] = 1; // this is the value of C(0, 0)

for(i = 1; i <= n; i++) {
for(j = i; j > 0; j--) {
// from the recurrence C(n, r) = C(n - 1, r - 1) + C(n - 1, r)
row[j] += row[j - 1];
}
}

return row[r];
}

内层循环从末尾开始,简化计算。如果您从索引 0 开始,您将需要另一个变量来存储被覆盖的值。

关于c - 哪种计算 nCr 的方法更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11809502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com