Algorithm 用k-sub算法计算子集生成函数的时间复杂度
我制作了一个使用k-sub算法的函数(从n个元素的集合中生成大小为k的所有子集)。我对它进行了n次迭代,以创建所有大小的所有子集(即powerset) 当我已经有了生成功率集的方法时,为什么要使用此函数?因为我希望子集以增加子集长度的方式生成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++){
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