Троичный поиск
Эта статья в значительной степени или полностью опирается на один источник . ( май 2007 г. ) |
Троичный алгоритм поиска [1] это метод в информатике для поиска минимума или максимума функции унимодальной .
Функция
[ редактировать ]Предположим, мы ищем максимум и что мы знаем, что максимум лежит где-то между и . Чтобы алгоритм был применим, должно быть некоторое значение такой, что
- для всех с , у нас есть , и
- для всех с , у нас есть .
Алгоритм
[ редактировать ]Позволять быть унимодальной функцией на некотором интервале . Возьмите любые две точки и в этом сегменте: . Тогда есть три возможности:
- если , то искомый максимум не может располагаться слева – . Это означает, что максимум далее имеет смысл искать только в интервале
- если , что ситуация аналогична предыдущей, с точностью до симметрии. Теперь искомый максимум не может находиться в правой части – , поэтому перейдите в сегмент
- если , то поиск следует вести в , но этот случай можно отнести к любому из двух предыдущих (в целях упрощения кода). Рано или поздно длина отрезка станет чуть меньше заданной константы, и процесс можно будет остановить.
точки выбора и :
- Порядок выполнения
Рекурсивный алгоритм
[ редактировать ]def ternary_search(f, left, right, absolute_precision) -> float:
"""Left and right are the current bounds;
the maximum is between them.
"""
if abs(right - left) < absolute_precision:
return (left + right) / 2
left_third = (2*left + right) / 3
right_third = (left + 2*right) / 3
if f(left_third) < f(right_third):
return ternary_search(f, left_third, right, absolute_precision)
else:
return ternary_search(f, left, right_third, absolute_precision)
Итерационный алгоритм
[ редактировать ]def ternary_search(f, left, right, absolute_precision) -> float:
"""Find maximum of unimodal function f() within [left, right].
To find the minimum, reverse the if/else statement or reverse the comparison.
"""
while abs(right - left) >= absolute_precision:
left_third = left + (right - left) / 3
right_third = right - (right - left) / 3
if f(left_third) < f(right_third):
left = left_third
else:
right = right_third
# Left and right are the current bounds; the maximum is between them
return (left + right) / 2
См. также
[ редактировать ]- Метод Ньютона в оптимизации (может использоваться для поиска того, где производная равна нулю)
- Поиск золотого сечения (аналогично троичному поиску, полезен, если вычисление f занимает большую часть времени на итерацию)
- Алгоритм двоичного поиска (может использоваться для поиска места изменения знака производной)
- Интерполяционный поиск
- Экспоненциальный поиск
- Линейный поиск
- Реализация N-мерного троичного поиска
Ссылки
[ редактировать ]- ^ «Тройный поиск» . cp-algorithms.com . Проверено 21 августа 2023 г.