Вещественный поиск
Пусть (функция, которая которая на области определения имеет область значений и монотонная на этой области.
Всё что обсуждалось в предыдущей главе про целочисленный поиск работает и тут, так как область значений является аналогом отсортированного массива. Такой поиск называется вещественный
, так как функция похожа на математическую функцию. Главное, чтобы функция была монотонной.
Идея та же, что и при целочисленном бинарном поиске : сначала возьмём такие границы поиска . После этого на каждом шаге будем сдвигать одну из границ , в зависимости от значения . В тот момент, когда и отличаются на единицу, — искомый порог. Если считать, что значение функции в точке вычисляется за , то время работы алгоритма — , где — начальные границы поиска.
Разовьём идею дальше, можно искать не только целочисленные точки, но и дробные!!! Увы, большой точности добиться невозможно. Проблема заключается в том, что действительные числа хранятся в компьютере неточно(. Например, если ответ это число . Для границ стоит использовать тип с самой большой точностью, в c++
это тип double
.
Тем не менее, мы можем найти такое с погрешностью : найдём такое , что существует такое, что . Единственное отличие от обычного бинпоиска : мы завершаем алгоритм в тот момент, когда .
Время работы алгоритма (при условии, что значение вычисляется за — .
Любой алгоритм целочисленного поиска, является подмножеством вещественного, в котором функция бинарная. Например, для проверки есть ли число в массиве, надо было лишь заменить if (a[mid] < x)
на .