una corrección muy menor a hielsnoppe's answer:
En una serie -elemento n
(n > 0
), el elemento de comparar está en el índice m = floor((n-1)/2)
. Así que hay tres posibilidades
A[m] < K
, a continuación, después de una comparación, la búsqueda continúa en una serie n-1-m = ceiling((n-1)/2)
-elemento.
A[m] > K
, luego de dos comparaciones, la búsqueda continúa en una matriz de elementos m
.
A[m] == K
, luego hemos terminado después de dos comparaciones.
Así que si denotamos la máxima (peor caso) número de comparaciones para una búsqueda en una variedad n
-elemento por C(n)
, tenemos
C(0) = 0
C(n) = max { 1 + C(ceiling((n-1)/2), 2 + C(floor((n-1)/2) }, n > 0
Por extraño n = 2k+1
, el suelo y el techo son idénticos, por lo que el máximo es evidente que este último,
C(2k+1) = 2 + C(k)
e incluso por n = 2k
, encontramos
C(2k) = max { 1 + C(k), 2 + C(k-1) }.
Para n = 2
, que se resuelve a C(2) = 1 + C(1) = 1 + 2 = 3
, para todos, incluso más grande n
, el máximo es 2 + C(k-1)
, ya que para n >= 1
tenemos C(n) <= C(n+1) <= C(n) + 1
.
Evaluación de la recursividad para los primeros n
, encontramos
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
Así por inducción se prueba
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)
o
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
Ésta es una cota superior exacta.
Hay un error en su código: 'si K> A [m] luego devuelve l ← m + 1' debe ser' si K> A [m] luego l ← m + 1' sin el 'retorno'. – Gumbo