找出具有双重for循环的递归算法的时间复杂度

问题描述

我正在尝试为以下上限找到最紧密的上限。但是,我无法获得正确的答案。算法如下:

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 )。