循环调用可变函数的时间复杂度

时间:2019-03-21 19:24:15

标签: algorithm recursion time-complexity big-o complexity-theory

此函数的时间复杂度是多少?

 public int calculate(int[] arr, int index) {
  int max = 0, sum = 0;
  for (int i = index; i < arr.length && i < index + arr[index]; i++) {
    sum += arr[i];
    max = Math.max(max, calculate(arr, i + 1));
  }
  return Math.max(max, sum);
}

通过数组和索引调用功能。当函数对自己进行arr [index]递归调用时,我们可以说它的时间复杂度为O(max(arr)^ n)('n'是arr中的元素数)吗?有可能找到最低限额吗?时间复杂度绝对不是2 ^ n,对吧?

1 个答案:

答案 0 :(得分:3)

首先让我们从循环条件中删除i < index + arr[index]部分,这只会(有时)减少迭代次数。通过删除它,我们可以得到最坏的情况。

由于在每次循环迭代中都会调用函数,计算函数执行的次数(在任何递归深度),这是衡量时间复杂度的好方法。我们将此计数称为 c

现在将 k 定义为循环的迭代次数,而无需考虑递归,因此 k arr.length - i

c 取决于 k ,所以我们说 c k

对于 k = 0,没有迭代,因此只有一次调用,因此 c 0 = 1 。我们可以继续增加 k

c 1 = 1 + c 0 = 2
c 2 = 1 + c 0 + c 1 = 2c 1 = 4
c 3 = 1 + c 0 + c 1 + c 2 = 2c 2 = 8
...
c k = 1 + ∑ k-1 i = 0 (c i )= 1 + ∑ k-2 i = 0 (c i )+ c k-1 = 2.c k-1 = 2 k

当您使用i=0调用函数并将 n 定义为arr.length时,结论是该函数的时间复杂度为 O(2 < sup> n )