对hielsnoppe 的回答的一个非常小的修正:
在n
-element 数组 ( n > 0
) 中,要比较的元素位于 index 处m = floor((n-1)/2)
。所以有三种可能
A[m] < K
,然后在一次比较之后,在n-1-m = ceiling((n-1)/2)
-element 数组中继续搜索。
A[m] > K
,然后在两次比较之后,在m
-element 数组中继续搜索。
A[m] == K
,那么我们经过两次比较就完成了。
n
因此,如果我们用 表示在-element 数组中搜索的最大(最坏情况)比较次数C(n)
,我们有
C(0) = 0
C(n) = max { 1 + C(ceiling((n-1)/2), 2 + C(floor((n-1)/2) }, n > 0
对于奇数n = 2k+1
,地板和天花板是相同的,所以最大值显然是后者,
C(2k+1) = 2 + C(k)
甚至n = 2k
,我们发现
C(2k) = max { 1 + C(k), 2 + C(k-1) }.
因为n = 2
, 解决了C(2) = 1 + C(1) = 1 + 2 = 3
, 对于所有更大的偶数n
, 最大值是2 + C(k-1)
, 因为n >= 1
我们有C(n) <= C(n+1) <= C(n) + 1
.
评估前几个的递归n
,我们发现
C(0) = 0
C(1) = 2
C(2) = 3
C(3) = C(4) = 4
C(5) = C(6) = 5
C(7) = C(8) = C(9) = C(10) = 6
C(11) = ... = C(14) = 7
C(15) = ... = C(22) = 8
C(23) = ... = C(30) = 9
所以通过归纳我们证明
C(n) = 2k, if 2^k <= n+1 < 2k + 2^(k-1), and
C(n) = 2k+1, if 2^k + 2^(k-1) <= n+1 < 2^(k+1)
或者
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
这是一个确切的上限。