Троичный поиск — различия между версиями
Строка 1: | Строка 1: | ||
{{В разработке}} | {{В разработке}} | ||
− | '''Троичный поиск''' {{---}} метод поиска минимума или максимума функции на отрезке. | + | '''Троичный поиск''' (или ''тернарный поиск'') {{---}} метод поиска минимума или максимума функции на отрезке. |
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | ||
− | Пусть функция <tex>f(x)</tex> на отрезке <tex>[ | + | Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. |
− | Посчитаем значения функции в точках <tex> | + | Посчитаем значения функции в точках <tex> a = l + \frac{(r-l)}{3} </tex> и <tex> b = l + \frac{2(r-l)}{3} </tex>. Так как в точке <tex>x_{min}</tex> минимум, то на отрезке <tex>[l, x_{min}]</tex> функция убывает, а на <tex>[x_{min}, r]</tex> {{---}} возрастает, то есть |
− | <tex> \forall x', x'' \in [ | + | <tex> \forall x', x'' \in [l, r]: \\ |
− | + | l < x' < x'' < x_{min} \Rightarrow f(l) > f(x') > f(x'') > f(x_{min}) \\ | |
− | x_{min} < x' < x'' < | + | x_{min} < x' < x'' < r \Rightarrow f(x_{min}) < f(x') < f(x'') < f(r) </tex>. |
− | Значит если <tex>f( | + | Значит если <tex>f(a) < f(b)</tex>, то <tex>x_{min} \in [l, b]</tex>, |
+ | аналогично из <tex>f(a) > f(b)</tex> следует <tex> x_{min} \in [a, g]</tex>. | ||
+ | Тогда нам нужно изменить границы поиска и искать дальше, | ||
+ | пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | ||
+ | |||
+ | Псевдокод: | ||
+ | |||
+ | ternarySearch(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, a, r, eps) | ||
+ | else | ||
+ | return ternarySearch(f, l, b, eps) | ||
+ | end |
Версия 16:40, 15 июня 2011
Эта статья находится в разработке!
Троичный поиск (или тернарный поиск) — метод поиска минимума или максимума функции на отрезке.
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).
Пусть функция
на отрезке имеет минимум, и мы хотим найти точку , в которой он достигается.Посчитаем значения функции в точках
и . Так как в точке минимум, то на отрезке функция убывает, а на — возрастает, то есть .Значит если
, то , аналогично из следует . Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть .Псевдокод:
ternarySearch(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, a, r, eps) else return ternarySearch(f, l, b, eps) end