Очень незначительное исправление в ответе hielsnoppe:
В массиве n
-элементов (n > 0
) сравниваемый элемент имеет индекс m = floor((n-1)/2)
. Итак, есть три возможности
A[m] < K
, затем после одного сравнения поиск продолжается в массиве из n-1-m = ceiling((n-1)/2)
элементов.
A[m] > K
, то после двух сравнений поиск продолжается в массиве m
элементов.
A[m] == K
, значит, мы закончили после двух сравнений.
Таким образом, если мы обозначим максимальное (наихудшее) количество сравнений для поиска в массиве из 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)
or
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
Это точная верхняя граница.
person
Daniel Fischer
schedule
13.05.2012
if K > A[m] then return l ← m+1
должно бытьif K > A[m] then l ← m+1
безreturn
. - person Gumbo   schedule 13.05.2012