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

时间:2010-01-26 07:03:34

标签: 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 = m + 1;
    }
    return -1;
}

如何确定此功能的Big-O表示法?

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

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:8)

Jon Skeet已经answered提出了问题。

在这里,我展示了如何以数学方式解决它。

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

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

我们可以继续减半,直到range变为 1 因此,等式为:范围/ 2 步骤 = 1

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

steps = lg(范围),其中 lg 是基数为2的对数。