以下为binarySearch的伪代码
myfunction(A[1],A[2]..A[n]:array of ints,x:positive integer){
i = 1
j = n
while i<=j do
k=floor( (i+j)/2)
if (x==A[k])
return k;
else if (x<A[k])
j=k-1
else
i=k+1
return -1
}
为什么这个不等式为真j-i+1 <= n / 2^t
,其中t
是迭代次数。我得到的是n /2^t
,如果n/2^t =1
增加,那么t将是迭代的总数,但是左手边:i-j+1
我不知道如何连接这些使不平等的陈述。背后的逻辑是什么?
答案 0 :(得分:0)
j-i+1
在任何时间点仍然需要考虑的值数量。很明显,不平等在一开始就存在:n-1+1 = n / 2^0
。
现在,每次迭代,您只需搜索一半的间隔。仔细分析不同的案例表明,间隔甚至比这更加减少。因此,每次迭代为区间大小提供至少另一个因子1/2。
我只会做一个案例并将其他三个案件作为锻炼给你。
假设j-i+1
等于s
并假设s
是奇数。然后,i+j
为偶数,k=(i+j)/2
指向中间元素,将(s-1)/2
元素留在其左侧及其右侧。让我们现在假设x < A[k]
,以便我们将j
设置为k-1
。因此,j-i+1
的新值为k-1-i+1 = k-i = (s-1)/2 < s/2
。