这种递归函数的时间复杂度

时间:2014-10-22 00:56:57

标签: java algorithm recursion

我有这个递归功能。我想知道这个算法的时间复杂度。这个想法给出了一个数字,我们必须找到所有与给定数字相加的子集

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

此算法的时间复杂度是多少?

1 个答案:

答案 0 :(得分:0)

由于代码生成了总和为n的所有可能序列,并且因为顺序很重要。它的渐近复杂性受序列大小的限制。

计算所有序列的另一种方法是思考如下。

  1. n 1开始。

    示例:1 1 1 1 1

  2. 对于长度为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

  3. 由于大小为n-1的特定位集产生唯一序列,因此该算法显然为O(2 ^ n)。