如何确定while循环的Big-O表示法?

如何确定while循环的Big-O表示法?,big-o,Big O,下面是一个二进制搜索函数 int search(int a[], int v, int left, int right) { while (right >= left) { int m = (left + right)/2; if (v == a[m]) return m; if (v < a[m]) right = m - 1; else left =

下面是一个二进制搜索函数

int search(int a[], int v, int left, int right)
{
    while (right >= left)
    {
        int m = (left + right)/2;
        if (v == a[m]) 
            return m;
        if (v < a[m])
            right = m - 1;
        else left = m + 1;
    }
    return -1;
}
int搜索(int a[],int v,int left,int right)
{
while(右>=左)
{
int m=(左+右)/2;
如果(v==a[m])
返回m;
if(v
如何确定此函数的Big-O表示法


因为while循环依赖于left的值,所以这个搜索函数是O(n)吗?

在每个步骤中,值的范围(大致)是一半-如果从
right-left==100开始,那么在第二步它将是49,然后是24,然后是11等等

假设
n=right-left
,复杂性为O(logn)。(这取决于左右两边的值。)

乔恩·斯凯特已经回答了这个问题

这里我展示了我们如何用数学方法来解决它

因为在每个循环中,我们将范围减半,在最坏的情况下,我们最多需要
步骤
迭代。
我们如何计算
步骤数

“将范围减半”可以表示为:范围/2步骤

我们可以继续减半,直到
范围
变为1
所以方程是:范围/2步=1

解决方案:
lg(范围/2步)=lg(1)
lg(范围)-步长*lg(2)=0


steps=lg(range),其中lg是以2为底的对数。

如果问题以“这是一个二进制搜索…”开头,除非代码严重混乱,否则答案是不需要动脑筋的。我正确地接受了,Shane-很明显,这个人正在学习符号。他怎么知道这是正确的?他用逻辑证明了答案的正确性。话虽如此,家庭作业问题却让人感觉不好。