while(low <= high)
{
mid = (low + high) / 2;
if (target < list[mid])
high = mid - 1;
else if (target > list[mid])
low = mid + 1;
else break;
}
这当然是二进制搜索,但我想找到复杂性。
仅仅看到代码我将如何找到Big-O?
对于while
循环,它将平均运行N/2
次?
但是如果你不知道这是二进制搜索,你怎么会通过查看代码找到这段代码的Big-O?
答案 0 :(得分:0)
你只需看看while()
条件如何变化......
low <= high
表示您需要了解high - low
的行为方式。
从代码中找到最不会改变它的内容! (最坏的情况)
在这里它减少了2倍(低提前减半,反之亦然)
然后:
T(x <= 0)= 1;
T(N)= T(N / 2)
答案 1 :(得分:0)
由于Big-O表示法涉及最坏情况的复杂性,我们只需要处理此代码的最坏情况,这意味着从未到达break
行。
其他if
分支意味着在while
循环的每次迭代后,low
到high
的距离大致减半。
最初假设为N=|high-low|
,然后d最终会变为N/2
,N/4
,... N/(2^n)
而2^n
大于或等于{{} 1}}以便比率d
等于0. N/(2^n)
和high < low
循环完成后的那个。
那么,我们可以将while
除以2分多少次?答案大致是基数2中N
的对数,因此N
复杂度。