Троичный поиск — различия между версиями
| Savelin (обсуждение | вклад)  (отформатирован псевдокод) | Savelin (обсуждение | вклад)  м | ||
| Строка 19: | Строка 19: | ||
| Значит если <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, r]</tex>. | аналогично из <tex>f(a) > f(b)</tex> следует <tex> x_{min} \in [a, r]</tex>. | ||
| + | |||
| Тогда нам нужно изменить границы поиска и искать дальше, | Тогда нам нужно изменить границы поиска и искать дальше, | ||
| пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | ||
Версия 10:29, 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 ternarySearch(f, left, b, eps)
    else
        return ternarySearch(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
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока , то время работы алгоритма составит
Смотрите также
Есть оптимизация этого алгоритма, если делить отрезок не на равные части, а в отношении золотого сечения, — Поиск с помощью золотого сечения
Литература
Дональд Кнут Искусство программирования, том 3. Сортировка и поиск = The Art of Computer Programming, vol.3. Sorting and Searching.

