hielsnoppeの答えに対する非常に小さな修正:
n
要素配列 ( ) では、n > 0
比較する要素は index にありますm = floor((n-1)/2)
。ということで、可能性は3つ
A[m] < K
の場合、1 回の比較の後、n-1-m = ceiling((n-1)/2)
要素配列で検索が続行されます。
A[m] > K
の場合、2 回の比較の後、m
要素配列内で検索が続行されます。
A[m] == K
の場合、2 回の比較を行って完了です。
n
したがって、要素配列内の検索の最大 (最悪の場合) の比較回数を で表すと、次のようになり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)))).
これは正確な上限です。