Троичный поиск — различия между версиями
Строка 1: | Строка 1: | ||
{{В разработке}} | {{В разработке}} | ||
'''Троичный поиск''' (или ''тернарный поиск'') {{---}} метод поиска минимума или максимума функции на отрезке. | '''Троичный поиск''' (или ''тернарный поиск'') {{---}} метод поиска минимума или максимума функции на отрезке. | ||
+ | |||
+ | == Алгоритм == | ||
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | ||
Строка 12: | Строка 14: | ||
Значит если <tex>f(a) < f(b)</tex>, то <tex>x_{min} \in [l, b]</tex>, | Значит если <tex>f(a) < f(b)</tex>, то <tex>x_{min} \in [l, b]</tex>, | ||
− | аналогично из <tex>f(a) > f(b)</tex> следует <tex> x_{min} \in [a, | + | аналогично из <tex>f(a) > f(b)</tex> следует <tex> x_{min} \in [a, r]</tex>. |
Тогда нам нужно изменить границы поиска и искать дальше, | Тогда нам нужно изменить границы поиска и искать дальше, | ||
пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | ||
− | Псевдокод | + | === Псевдокод === |
− | + | ternarySearchMin(f, l, r, eps) | |
− | if (r-l < eps) | + | if (r - l < eps) |
return (left + right) / 2 | return (left + right) / 2 | ||
a = (left * 2 + right) / 3 | a = (left * 2 + right) / 3 | ||
b = (left + right * 2) / 3 | b = (left + right * 2) / 3 | ||
if (f(a) < f(b)) | if (f(a) < f(b)) | ||
+ | return ternarySearch(f, l, b, eps) | ||
+ | else | ||
return ternarySearch(f, a, r, eps) | return ternarySearch(f, a, r, eps) | ||
− | |||
− | |||
end | 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 | ||
+ | |||
+ | |||
+ | === Время работы === | ||
+ | |||
+ | Так как на каждой итерации мы считаем 2 значения функции и уменьшаем область поиска в полтора раза, пока <tex> r - l > \varepsilon</tex>, | ||
+ | то время работы алгоритма составит | ||
+ | <tex>2 \log_{\frac32} \left(\frac{r - l}{\varepsilon}\right)</tex> |
Версия 16:50, 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
Время работы
Так как на каждой итерации мы считаем 2 значения функции и уменьшаем область поиска в полтора раза, пока
, то время работы алгоритма составит