算法的复杂性(if和else)

时间:2018-03-23 12:10:01

标签: if-statement 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)
    else
    func3(n / 2);
    return;
}

我需要计算这个算法的复杂性我试过把它分成两种情况:当n是偶数(2 ^ i数)时,只有1次调用的最佳情况,复杂度将为T(n)= T( N / 2)+ O(n)中。在最坏的情况下,有人可以给我一些帮助吗?并在这里写下答案

1 个答案:

答案 0 :(得分:0)

这一行for (int i = 1; i<n; i++) System.out.println("*");意味着复杂性至少为O(n)加上递归的工作。对于递归,我们有两种情况:func3(n-1)func3(n/2)

如果n是奇数,那么我们会调用func3(n-1),因此下一个n是偶数,并且会减半。这意味着实际上对func3没有n次调用,但在最坏的情况下只有2*log2 n次调用。

这意味着最坏情况下所有通话的总和为(n + n-1 + n/2 + n/2-1 + n/4 + n/4-1 + .. + 1+0),约为2*2*n。因此,复杂性应为O(n)

所以我对O(n²)的第一次猜测结果证明是错误的。