bardzo niewielkiej korekty hielsnoppe's answer:
W n
-elementowe tablicy (n > 0
), przy czym element do porównania jest indeksem m = floor((n-1)/2)
. Tak więc istnieją trzy możliwości
A[m] < K
, a następnie po jednym porównania, wyszukiwanie jest kontynuowane w n-1-m = ceiling((n-1)/2)
-elementowe tablicy.
A[m] > K
, a następnie po dwóch porównaniach wyszukiwanie jest kontynuowane w macierzy -elementach m
.
A[m] == K
, a następnie skończyliśmy po dwóch porównaniach.
Więc jeśli oznaczymy maksymalną (najgorszy przypadek) liczbę porównań do poszukiwania w n
-elementowe tablicy przez C(n)
mamy
C(0) = 0
C(n) = max { 1 + C(ceiling((n-1)/2), 2 + C(floor((n-1)/2) }, n > 0
dla nieparzystych n = 2k+1
, podłoga i sufit są identyczne, więc maksymalna jest oczywiście to drugie,
C(2k+1) = 2 + C(k)
i nawet n = 2k
znajdujemy
C(2k) = max { 1 + C(k), 2 + C(k-1) }.
Dla n = 2
, że postanawia C(2) = 1 + C(1) = 1 + 2 = 3
dla wszystkich większych nawet n
maksymalna jest 2 + C(k-1)
, ponieważ dla n >= 1
mamy C(n) <= C(n+1) <= C(n) + 1
.
Oceniając rekursji w ciągu pierwszych kilku n
znajdujemy
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
więc przez indukcję dowodzimy
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)
lub
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
Jest to dokładna górna granica.
Wystąpił błąd w kodzie: 'jeśli K> A [m] następnie zwraca l ← m + 1' powinno być' if K> A [m], a następnie ← m + 1' bez 'return'. – Gumbo