Троичный поиск — различия между версиями
Savelin (обсуждение | вклад) м (→Псевдокод) |
Savelin (обсуждение | вклад) м (→Псевдокод) |
||
| Строка 27: | Строка 27: | ||
Рекурсивный вариант: | Рекурсивный вариант: | ||
| − | '''function''' ternarySearchMin(f, left, right, 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 |
a = (left * 2 + right) / 3 | a = (left * 2 + right) / 3 | ||
b = (left + right * 2) / 3 | b = (left + right * 2) / 3 | ||
| Строка 39: | Строка 39: | ||
Итеративный вариант: | Итеративный вариант: | ||
| − | '''function''' ternarySearchMin(f, left, right, 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 | ||
Версия 19:40, 22 мая 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
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока , то время работы алгоритма составит
См. также
- Поиск с помощью золотого сечения — оптимизация троичного поиска.
- Троичный поиск — Википедия
- Ternary search — Wikipedia
Литература
- Дональд Кнут — Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. — The Art of Computer Programming. Vol. 3. Sorting and Searching.