【问题标题】:Time complexity of a recursive function called variably in a loop在循环中可变调用的递归函数的时间复杂度
【发布时间】:2019-03-21 19:24:15
【问题描述】:

这个函数的时间复杂度是多少:

 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吧?

【问题讨论】:

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


    【解决方案1】:

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

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

    现在将k定义为循环的迭代次数,不考虑递归,所以karr.length - i

    c 依赖于k,所以说ck

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

            c1 = 1 + c0 = 2
    c2 = 1 + c0 + c1 = 2c1 = 4
    c3 = 1 + c0 + c1 + c2 = 2c2 = 8
    ...
    ck = 1 + ∑k-1i=0(ci) = 1 + ∑k-2i=0(ci) + ck-1 = 2.ck-1 = 2k

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

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多