Троичный поиск — различия между версиями
Savelin (обсуждение | вклад)  (→Псевдокод)  | 
				Savelin (обсуждение | вклад)  м (→Псевдокод)  | 
				||
| Строка 27: | Строка 27: | ||
Рекурсивный вариант:  | Рекурсивный вариант:  | ||
| − |   ternarySearchMin(f, left, right, eps)    | + |   '''ternarySearchMin'''(f, left, right, eps)    | 
      '''if''' (right - left < eps)  |       '''if''' (right - left < eps)  | ||
          return (left + right) / 2  |           return (left + right) / 2  | ||
| Строка 39: | Строка 39: | ||
Итеративный вариант:  | Итеративный вариант:  | ||
| − |   ternarySearchMin(f, left, right, eps)    | + |   '''ternarySearchMin'''(f, left, right, eps)    | 
      '''while''' (right - left > eps)    |       '''while''' (right - left > eps)    | ||
          a = (left * 2 + right) / 3  |           a = (left * 2 + right) / 3  | ||
Версия 19:24, 22 мая 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.