我有这个递归功能。我想知道这个算法的时间复杂度。这个想法给出了一个数字,我们必须找到所有与给定数字相加的子集
public void getSequences(int n, ArrayList<Integer> buffer, int sum) {
if(sum == n) {
for(int j=0; j<buffer.size(); j++) {
System.out.print(buffer.get(j) + " ");
}
System.out.println("");
}
for(int i=1; i<n; i++) {
sum += i;
if(sum > n) {
break;
}
buffer.add(i);
getSequences(n, buffer, sum);
sum -= i;
buffer.remove(i);
}
}
ArrayList<Integer> buffer = new ArrayList<Integer>();
getSequences(3, buffer, 0);
// Output
// 1 1 1
// 1 2
// 2 1
此算法的时间复杂度是多少?
答案 0 :(得分:0)
由于代码生成了总和为n的所有可能序列,并且因为顺序很重要。它的渐近复杂性受序列大小的限制。
计算所有序列的另一种方法是思考如下。
从n
1开始。
示例:1 1 1 1 1
对于长度为n-1
的某个位集,如果该位为该索引的位,则减少相邻序列。
示例:BitSet(0,1,0,0)产生序列:1(1 + 1)1 1 =&gt; 1 2 1 1
示例:BitSet(1,1,0,1)产生序列:(1 + 1 + 1)(1 + 1)=&gt; 3 2
由于大小为n-1
的特定位集产生唯一序列,因此该算法显然为O(2 ^ n)。