使用双 for 循环查找递归算法的时间复杂度
Finding the time complexity of a recursive algorithm with a double for loop
我正在尝试为以下上限找到最严格的上限。但是,我无法得到正确的答案。算法如下:
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(n2) 加上每个递归调用所花费的时间。此外,递归树将有 n 层。然后我计算了每个级别花费的总时间:
第一关所用时间为n2。对于第二关,由于有两次递归调用,所以耗时为2n2。对于第三级,所用时间为4n 2 依此类推,直到n变为<= 2.
因此,时间复杂度应该是n2 * (1 + 2 + 4 + .... + 2n) . 1 + 2 + 4 + .... + 2n是一个几何数列,其和等于2n - 1.Thus,总的时间复杂度应该是O(2nn2)。然而,答案是 O(n3)。我做错了什么?
考虑以下片段
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.println("Hello.");
}
}
这个不用介绍了,是O(n2)
现在考虑下面的片段
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+1)/2)。
因此,方法 staticintrecursiveloopy
的执行总次数大约为 n/2,用复杂度表示时为 O(n)。
而方法staticintrecursiveloopy
在每次迭代中调用复杂度为O(n2)的部分,因此总时间复杂度变为
O(n) * O(n2) = O(n3).
我正在尝试为以下上限找到最严格的上限。但是,我无法得到正确的答案。算法如下:
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(n2) 加上每个递归调用所花费的时间。此外,递归树将有 n 层。然后我计算了每个级别花费的总时间:
第一关所用时间为n2。对于第二关,由于有两次递归调用,所以耗时为2n2。对于第三级,所用时间为4n 2 依此类推,直到n变为<= 2.
因此,时间复杂度应该是n2 * (1 + 2 + 4 + .... + 2n) . 1 + 2 + 4 + .... + 2n是一个几何数列,其和等于2n - 1.Thus,总的时间复杂度应该是O(2nn2)。然而,答案是 O(n3)。我做错了什么?
考虑以下片段
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.println("Hello.");
}
}
这个不用介绍了,是O(n2)
现在考虑下面的片段
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+1)/2)。
因此,方法 staticintrecursiveloopy
的执行总次数大约为 n/2,用复杂度表示时为 O(n)。
而方法staticintrecursiveloopy
在每次迭代中调用复杂度为O(n2)的部分,因此总时间复杂度变为
O(n) * O(n2) = O(n3).