【问题标题】:Time Complexity Calculation for subsets generation function by k-sub algorithm用k-sub算法计算子集生成函数的时间复杂度
【发布时间】:2018-01-17 07:55:21
【问题描述】:

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

我已经有了生成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);
    }                
  }
}

现在函数被调用 n 次,所以 n 就在那里。但是 recurciveSelectSubset 函数的复杂度是多少?

我觉得这个函数的作用是生成所有大小为 k 的子集,所以它就像 nCk。复杂度为 O(n^k)。现在它运行 k 从 1 到 n 的所有可能值,我们可以说,这个 sn-p 的最终复杂度是 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 的子集,它应该花费恒定的时间,对吧?不是n^n。所以这样我的计算就出错了。但是根据nCk,它可以取n^n = n^0 = 1。那么如何对所有k值求和呢?

那么正确的复杂度是多少?

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

【问题讨论】:

    标签: algorithm time-complexity combinations


    【解决方案1】:

    经过一番浏览和讨论,我找到了答案,我将其发布在这里以供将来帮助。

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

    所以总时间是所有调用 recurseiveSelectSubset() 所用时间的总和。

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

    这实际上是二项式系数的总和,总和为 2^n。 (here)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      相关资源
      最近更新 更多