找到指数算法的时间复杂度

时间:2016-11-28 19:10:40

标签: algorithm performance runtime complexity-theory

问题:找到切割长度为n的杆的最佳方法 每个切割是整数长度 假设每个长度i杆的价格为p(i) 给定:长度为n的杆,以及价格列表p,它提供了0到n之间每个可能整数长度的价格。

找到最佳切割量以获得最高价格 可以使用任意数量的切割,从0到n-1 切割没有任何费用。

下面我提出了一个针对这个问题的天真算法。

CUT-ROD(p,n)
if(n == 0)
    return 0
q = -infinity
for i = 1 to n
    q = max(q, p[i]+CUT-ROD(p,n-1))
return q

如何证明此算法是指数的?一步步。 我可以看出它是指数级的。但是,我无法证明它。

1 个答案:

答案 0 :(得分:0)

为了清晰起见,我们将代码翻译成C ++:

int prices[n];
int cut-rod(int n) {
  if(n == 0) {
    return 0;
  }
  q = -1;
  res = cut-rod(n-1);
  for(int i = 0; i < n; i++) {
    q = max(q, prices[i] + res);
  }
  return q;
}

注意:我们正在缓存结果of cut-rod(n-1),以避免不必要地增加算法的复杂性。在这里,我们可以看到cut-rod(n)调用cut-rod(n-1),调用cut-rod(n-2)等等,直到cut-rod(0)。对于cut-rod(n),我们看到函数迭代数组n次。因此,算法的时间复杂度等于O(n + (n-1) + (n-2) + (n-3)...1) = O(n(n+1)/2),大约等于O((n^2)/2)

修改 如果我们使用与问题中的算法完全相同的算法,则其时间复杂度为O(n!),因为cut-rod(n)称切割杆(n-1)n次。切杆(n-1)称切杆(n-2)n-1次,依此类推。因此,时间复杂度等于O(n *(n-1)*(n-2)... 1)= O(n!)。