如果函数“process”的复杂度为O(logn),则计算此代码片段的时间复杂度
void funct (int a[], int n)
{
int i=0
while (i < n){
process (a, n);
if (a[i]%2 == 0)
i = i*2+1;
else
i = i+1;
}
我试图计算时间复杂度的最佳和最差情况;
最糟糕的情况是“else”语句被调用,所以它应该只是:
最坏情况:T(n)= O(nlogn)
我遇到了最好的情况。我试过这种方式,但我不知道这是否正确
因为在“if”语句中“i”增加了“2i + 1”,所以它应该是
i=2^k-1
2^k < n+1
so k < log_2(n+1)
说明while循环执行(log_2(n+1)-2)/2
次是正确的,因为这是i&lt; n?
如果是这样,时间复杂度最好是O(lognlogn)?
答案 0 :(得分:1)
最好的情况是a
中的采样值是否均匀。在这种情况下,复杂度为O(log(n)*log(n))
,因为循环行程计数为O(log(n))
。
最糟糕的情况是a
中的采样值都是奇数。在这种情况下,复杂度为O(n*log(n))
,因为循环行程计数为O(n)
。