Троичный поиск — различия между версиями
Savelin (обсуждение | вклад) |
Savelin (обсуждение | вклад) (→Алгоритм) |
||
Строка 3: | Строка 3: | ||
== Алгоритм == | == Алгоритм == | ||
− | [[File:Ternar2.png|thumb| | + | [[File:Ternar2.png|thumb|280px|Пример. <tex>f(a) < f(b) \Rightarrow x_{min} \in [l, b]</tex>]] |
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | ||
Строка 9: | Строка 9: | ||
Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. | Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. | ||
− | Посчитаем значения функции в точках <tex> a = l + \frac{(r-l)}{3} </tex> и <tex> b = l + \frac{2(r-l)}{3} </tex>. | + | Посчитаем значения функции в точках <tex dpi = "150"> a = l + \frac{(r-l)}{3} </tex> и <tex dpi = "150"> b = l + \frac{2(r-l)}{3} </tex>. |
Так как в точке <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> {{---}} возрастает, то есть |
Версия 11:26, 20 мая 2014
Троичный поиск (ternary search, тернарный поиск) — метод поиска минимума или максимума функции на отрезке.
Алгоритм
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).
Пусть функция
на отрезке имеет минимум, и мы хотим найти точку , в которой он достигается.Посчитаем значения функции в точках
и .Так как в точке
минимум, то на отрезке функция убывает, а на — возрастает, то есть.
Значит если
, то , аналогично из следует .Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть
.Псевдокод
Рекурсивный вариант:
ternarySearchMin(f, left, right, eps) if (right - left < eps) return (left + right) / 2 a = (left * 2 + right) / 3 b = (left + right * 2) / 3 if (f(a) < f(b)) return ternarySearchMin(f, left, b, eps) else return ternarySearchMin(f, a, right, eps)
Итеративный вариант:
ternarySearchMin(f, left, right, eps) while (right - left > eps) a = (left * 2 + right) / 3 b = (left + right * 2) / 3 if (f(a) < f(b)) right = b else left = a return (left + right) / 2
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока
, то время работы алгоритма составитСм. также
- Поиск с помощью золотого сечения — оптимизация троичного поиска.
- Троичный поиск — Википедия
- Ternary search — Wikipedia
Литература
- Дональд Кнут — Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. — The Art of Computer Programming. Vol. 3. Sorting and Searching.