Троичный поиск — различия между версиями
(→Время работы) |
|||
Строка 49: | Строка 49: | ||
=== Время работы === | === Время работы === | ||
− | Так как на каждой итерации мы считаем | + | Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока <tex> r - l > \varepsilon</tex>, |
то время работы алгоритма составит | то время работы алгоритма составит | ||
<tex>2 \log_{\frac32} \left(\frac{r - l}{\varepsilon}\right)</tex> | <tex>2 \log_{\frac32} \left(\frac{r - l}{\varepsilon}\right)</tex> |
Версия 16:51, 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
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока
, то время работы алгоритма составит