c - 查找组合数 nCr,时间复杂度为 O(1)

标签 c math combinations permutation combinatorics

有没有办法在 O(1) 内找到组合的数量(不是实际的组合)?我在这里读到一个答案 - time and space complexity of finding combination (nCr) 。答案是需要 O(n!) 来找到实际的组合,但只需要 O(1) 来找到这样的组合的数量。我不明白这是怎么做到的。请解释一下如何在 O(1) 内做到这一点。这里,O(1)是时间复杂度。

[编辑]:我遇到的主要问题是如何实现 n!时间复杂度为 O(1)。

最佳答案

请检查下面的C程序。它以 nr 作为输入并计算 nCr 值:< br/>

int main(){
    int n, r;
    scanf("%d", &n);
    scanf("%d", &r);

    /*
    *  nCr = n! / !(n-r) / !(r)
    *      = n * n-1 * n-2 * .... * 1 / (n-r * n-r-1 * .. * 1) / 
    *           (r * r-1 * ... * 1)
    *      = n * n-1 * n-2 * n-r+1 / (r * r-1 * ... * 1)
    *      
    */

    int result = 1;
    int i;

    for (i=0; i<r; i++){
        result *= (n-i);    // n * n-1 * n-2 * .... * n-(r-1)
        result /= (i+1);    // r * r-1 * ... * 1
    }

    /*  The loop is going to run only r times for any n
     *  Time to calculate nCr : O(r)
     *  Space complexity: O(1)
    */

    printf("Result of C(%d, %d) = %d", n, r, result);

    return 0;
}

为了计算它,循环仅运行“r”次。

因此,计算 nCr 值的时间复杂度为 O(r) 但是空间复杂度是O(1)

我想您一定对这两个复杂度顺序感到困惑。希望对您有帮助。

关于c - 查找组合数 nCr,时间复杂度为 O(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37777167/

相关文章:

C读取其中包含null的文件

C 预处理器 #define 声明的变量是什么类型?

javascript - 定位父元素以使其子元素在屏幕上居中

c++ - 正弦、余弦、弧度和旋转

c - 在子进程处于事件状态并运行时读取和写入

c - 生成整数的 4 位校验和

javascript - 旋转正弦曲线

java - 将一个组组合成多个组而不重复

matlab - MATLAB中不同长度向量索引的所有组合

python - 使用可变长度字符串的可变长度列表,如何创建所有组合