|
ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
|
Задача 76258
Условие(Двоичный поиск) Дана последовательность
Решение(Предполагаем, что n > 0.) l := 1; r := n+1;
{r > l, если a есть вообще, то есть и среди x[l]..x[r-1]}
while r - l <> 1 do begin
| m := l + (r-l) div 2 ;
| {l < m < r }
| if x[m] <= a then begin
| | l := m;
| end else begin {x[m] > a}
| | r := m;
| end;
end;
(Обратите внимание, что и в случае
x[m] = a
инвариант не нарушается.)
Каждый раз
r - l уменьшается примерно вдвое, откуда
и вытекает требуемая оценка числа действий.
Замечание.
l + (r-l ) div 2 = (2l + (r - l)) div 2 = (r + l) div 2.
В этой задаче существенно, что массив упорядочен — поиск
в неупорядоченном массиве требует времени,
пропорционального длине массива. (Чтобы убедиться, что
какого-то числа нет в массиве, надо просмотреть все его
элементы.)
1000
Источники и прецеденты использования |
|
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|
|
Проект осуществляется при поддержке