Algorithm 用k-sub算法计算子集生成函数的时间复杂度

Algorithm 用k-sub算法计算子集生成函数的时间复杂度,algorithm,time-complexity,combinations,Algorithm,Time Complexity,Combinations,我制作了一个使用k-sub算法的函数(从n个元素的集合中生成大小为k的所有子集)。我对它进行了n次迭代,以创建所有大小的所有子集(即powerset) 当我已经有了生成功率集的方法时,为什么要使用此函数?因为我希望子集以增加子集长度的方式生成 for(int k = 0; k <= n; k++){ recursiveSelectSubset(){ if(k == n){ for(int i = 0; i < n; i++){

我制作了一个使用k-sub算法的函数(从n个元素的集合中生成大小为k的所有子集)。我对它进行了n次迭代,以创建所有大小的所有子集(即powerset)

当我已经有了生成功率集的方法时,为什么要使用此函数?因为我希望子集以增加子集长度的方式生成

for(int k = 0; k <= n; k++){
  recursiveSelectSubset(){
    if(k == n){
       for(int i = 0; i < n; i++){
               subset[i] = true;               
       }                
    }

    if(k == 0){
       for(int i = 0; i < n; i++){
               subset[i] = false;
       }
    }

    if(k > 0 && k < n){
       subset[n-1] = true;
       recursiveSelectSubset(subset, n-1, k-1, isminimum, io);
       subset[n-1] = false;
       recursiveSelectSubset(subset, n-1, k, isminimum, io);
    }                
  }
}
for(int k=0;k 0&&k
现在函数被调用n次,那么n就存在了。但是递归选择子集函数的复杂性是什么

我觉得这个函数的作用是生成大小为k的所有子集,所以它就像nCk。其复杂性为O(n^k)。现在它运行于从1到n的k的所有可能值,我们可以说,这个片段的最终复杂性是O(n^(n+1))

这就是我计算recursiveSelectSubset复杂性的方法。 要生成大小为k=0的所有子集,需要n^0。要生成大小为k=1的所有子集,需要n^1。用这种方法生成大小为k=n的子集,需要n^n。总时间为n^0+n^1+n^n=n^(n+1)

但这里再次提出疑问,要生成大小为k=n的子集,应该需要恒定的时间,对吗?不是。这样我的计算就错了。但根据nCk,它可能需要n^n=n^0=1。那么,如何对k的所有值求和呢

那么,什么是正确的复杂性


p.S。如果我的分析是错误的,我想澄清一下它是怎么错的?

经过一些浏览和讨论,我找到了一个答案,我在这里发布这个答案是为了将来的帮助

recursiveSelectSubset()将计算nCk并花费时间n^k。正在为k=0到n调用此函数

所以它花费的总时间是所有调用recurseiveSelectSubset()所花费的时间之和

n^0+n^1+n^2+n^n

这实际上是二项式系数之和,它加起来等于2^n。()

所以上述函数的总时间复杂度是2^n