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)中。在最坏的情况下,有人可以给我一些帮助吗?并在这里写下答案
答案 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²)
的第一次猜测结果证明是错误的。