问题描述
我正在尝试为以下上限找到最紧密的上限。但是,我无法获得正确的答案。算法如下:
public staticintrecursiveloopy(int n){
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.println("Hello.");
}
} if(n <= 2) {
return 1;
} else if(n % 2 == 0) {
return(staticintrecursiveloopy(n+1));
} else{
return(staticintrecursiveloopy(n-2));
}
}
我试图为此绘制出递归树。我知道算法的每次运行的时间复杂度将是O(n 2 )加上每个递归调用所花费的时间。此外,递归树将具有n个级别。然后,我计算出每个级别花费的总时间:
对于第一个级别,花费的时间为n 2 。对于第二级,由于有两个递归调用,因此花费的时间将为2n 2 。对于第三级,花费的时间将是4n 2 ,依此类推,直到n变为
因此,时间复杂度应为n 2 *(1 + 2 + 4 + .... + 2 n )。 1 + 2 + 4 + .... + 2 n 是一个几何序列,其总和等于2 n -1。因此,总时间复杂度应为O(2 n n 2 )。但是,答案是O(n 3 )。我在做什么错了?
解决方法
考虑以下片段
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.println("Hello.");
}
}
这不需要任何介绍,它是O(n 2 )
现在考虑以下片段
if(n <= 2) {
return 1;
} else if(n % 2 == 0) {
return(staticintrecursiveloopy(n+1));
} else {
return(staticintrecursiveloopy(n-2));
}
您认为该片段将执行多少次?
如果n%2 == 0
,则方法staticintrecursiveloopy
将额外执行1次。否则它将减2,因此它将执行n / 2次(如果包含其他条件,则将执行n / 2次)。
因此,方法staticintrecursiveloopy
的执行总次数约为n / 2,以复杂度表示时,它变为O(n)。
方法staticintrecursiveloopy
在每次迭代中调用一个复杂度为O(n 2 )的零件,因此总时间复杂度变为
O(n)* O(n 2 )= O(n 3 )。