用2个调用计算算法的复杂性

时间:2018-03-22 19:37:22

标签: recursion complexity-theory

func3(int n) {
    for (int i = 1; i<n; i++)
        System.out.println("*");
    if (n <= 1)
    {
        System.out.println("*");
        return;
    }
    if(n % 2 != 0) //check if odd
        func3(n - 1)
    func3(n / 2);
    return;
}

我需要计算这个算法的复杂性 我试过把它分成2个案例: 当n是偶数(2 ^ i数)时,只有1个呼叫的最佳情况,并且复杂度将为T(n)= T(n / 2)+ O(n)。 有人可以帮我解决最坏的情况吗?

1 个答案:

答案 0 :(得分:0)

由于时间复杂,您通常只计算最大的操作。它是关于算法如何与N一起缩放的。在这种情况下,它将始终与N线性地缩放 - 如果数字是偶数,则它将是O(n +(n / 2)+(n / 4)。 ..)简化为O(n)。如果是奇数,则为O(n +((n-1)+(n-1)/ 2 +(n-1)/ 4 ...)+ n / 2 + n / 4 ......)它再次简化为O(n) - 这一点是它与大数字线性比例,而不是对数或指数。

另请注意,奇数n / 2将是偶数,因此您最多只能有两个递归&#34;路径&#34; - (n-1)/ 2和n / 2都是偶数。