Троичный поиск — различия между версиями
(→Алгоритм) |
|||
Строка 11: | Строка 11: | ||
Так как в точке <tex>x_{min}</tex> минимум, то на отрезке <tex>[l, x_{min}]</tex> функция убывает, а на <tex>[x_{min}, r]</tex> {{---}} возрастает, то есть | Так как в точке <tex>x_{min}</tex> минимум, то на отрезке <tex>[l, x_{min}]</tex> функция убывает, а на <tex>[x_{min}, r]</tex> {{---}} возрастает, то есть | ||
+ | |||
<tex> \forall x', x'' \in [l, r]: \\ | <tex> \forall x', x'' \in [l, r]: \\ | ||
l < x' < x'' < x_{min} \Rightarrow f(l) > f(x') > f(x'') > f(x_{min}) \\ | l < x' < x'' < x_{min} \Rightarrow f(l) > f(x') > f(x'') > f(x_{min}) \\ |
Версия 16:53, 15 июня 2011
Эта статья находится в разработке!
Троичный поиск (или тернарный поиск) — метод поиска минимума или максимума функции на отрезке.
Алгоритм
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).
Пусть функция
на отрезке имеет минимум, и мы хотим найти точку , в которой он достигается.Посчитаем значения функции в точках
и .Так как в точке
минимум, то на отрезке функция убывает, а на — возрастает, то есть.
Значит если
, то , аналогично из следует . Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть .Псевдокод
ternarySearchMin(f, l, r, eps) if (r - l < eps) return (left + right) / 2 a = (left * 2 + right) / 3 b = (left + right * 2) / 3 if (f(a) < f(b)) return ternarySearch(f, l, b, eps) else return ternarySearch(f, a, r, eps) end
Возможен и нерекурсивный вариант:
ternarySearchMin(f, l, r, eps) while (r - l < eps) { a = (left * 2 + right) / 3 b = (left + right * 2) / 3 if (f(a) < f(b)) r = b else l = a } return (left + right) / 2 end
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока
, то время работы алгоритма составит