【发布时间】: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