Троичный поиск — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
(Время работы)
Строка 53: Строка 53:
 
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока <tex> r - l > \varepsilon</tex>,
 
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока <tex> r - l > \varepsilon</tex>,
 
то время работы алгоритма составит  
 
то время работы алгоритма составит  
<tex dpi = "150">2 \log_{\frac32} \left(\frac{r - l}{\varepsilon}\right)</tex>
+
<tex dpi = "135">2 \log_{\frac32} \left(\dfrac{r - l}{\varepsilon}\right)</tex>
  
 
== См. также ==
 
== См. также ==

Версия 12:24, 22 мая 2014

Троичный поиск (ternary search, тернарный поиск) — метод поиска минимума или максимума функции на отрезке.

Алгоритм

Пример. f(a)<f(b)xmin[l,b]

Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).

Пусть функция f(x) на отрезке [l,r] имеет минимум, и мы хотим найти точку xmin, в которой он достигается.

Посчитаем значения функции в точках a=l+ (rl)3 и b=l+ 2(rl)3.

Так как в точке xmin минимум, то на отрезке [l,xmin] функция убывает, а на [xmin,r] — возрастает, то есть

x,x[l,r]:l<x<x<xminf(l)>f(x)>f(x)>f(xmin)xmin<x<x<rf(xmin)<f(x)<f(x)<f(r).

Значит если f(a)<f(b), то xmin[l,b], аналогично из f(a)>f(b) следует xmin[a,r].

Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть rl<ε.

Псевдокод

Рекурсивный вариант:

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

Время работы

Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока rl>ε, то время работы алгоритма составит 2log32(rlε)

См. также

Литература

  • Дональд Кнут — Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. — The Art of Computer Programming. Vol. 3. Sorting and Searching.