以下是二元搜索功能。
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 的值?
答案 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的对数。