Algorithm 循环中可变调用的递归函数的时间复杂度
此功能的时间复杂度是多少:Algorithm 循环中可变调用的递归函数的时间复杂度,algorithm,recursion,time-complexity,big-o,complexity-theory,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 M
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);
}
public int-calculate(int[]arr,int-index){
int max=0,sum=0;
对于(int i=index;i
使用数组和索引调用函数。由于函数对自身进行arr[index]递归调用,我们可以说它的时间复杂度是O(max(arr)^n)('n'是arr中的元素数)?有可能找到老虎的极限吗?时间复杂度绝对不是2^n,对吗?让我们首先从循环条件中删除
i
部分,这只会(有时)减少迭代次数。通过移除它,我们可以得到最坏的情况
在每次循环迭代中调用函数时,计算函数的执行次数(在任何递归深度)是时间复杂性的一个很好的度量。我们称之为c伯爵
现在将k定义为循环的迭代次数,而不考虑递归,因此k是arr.length-i
c依赖于k,所以我们来谈谈ck
对于k=0,没有迭代,所以只有一个调用,所以c0=1。我们可以继续增加k:
c1=1+c0=2c2=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)