Троичный поиск — различия между версиями
Savelin (обсуждение | вклад) |
Savelin (обсуждение | вклад) м (→Псевдокод) |
||
Строка 26: | Строка 26: | ||
Рекурсивный вариант: | Рекурсивный вариант: | ||
− | '''function''' ternarySearchMin('''double''' f, '''double''' left, '''double''' right, '''double''' eps) | + | '''function''' ternarySearchMin('''double''' f(), '''double''' left, '''double''' right, '''double''' eps): |
'''if''' right - left < eps | '''if''' right - left < eps | ||
'''return''' (left + right) / 2 | '''return''' (left + right) / 2 | ||
Строка 38: | Строка 38: | ||
Итеративный вариант: | Итеративный вариант: | ||
− | '''function''' ternarySearchMin('''double''' f, '''double''' left, '''double''' right, '''double''' eps) | + | '''function''' ternarySearchMin('''double''' f(), '''double''' left, '''double''' right, '''double''' eps): |
'''while''' right - left > eps | '''while''' right - left > eps | ||
a = (left * 2 + right) / 3 | a = (left * 2 + right) / 3 |
Версия 22:04, 14 июня 2014
Троичный поиск (ternary search, тернарный поиск) — метод поиска минимума или максимума функции на отрезке, которая либо сначала строго возрастает, затем строго убывает, либо наоборот.
Алгоритм
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).
Пусть функция
на отрезке имеет минимум, и мы хотим найти точку , в которой он достигается.Посчитаем значения функции в точках
и .Так как в точке
минимум, то на отрезке функция убывает, а на — возрастает, то есть.
Значит если
, то , аналогично из следует .Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть
.Псевдокод
Рекурсивный вариант:
function ternarySearchMin(double f(), double left, double right, double 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)
Итеративный вариант:
function ternarySearchMin(double f(), double left, double right, double 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
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока
, то время работы алгоритма составитСм. также
Источники информации
- Дональд Кнут — Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. — The Art of Computer Programming. Vol. 3. Sorting and Searching.
- Троичный поиск — Википедия
- Ternary search — Wikipedia