Троичный поиск — различия между версиями
Rybak (обсуждение | вклад) (→Алгоритм) |
Rybak (обсуждение | вклад) м (→Смотрите также) |
||
Строка 61: | Строка 61: | ||
Есть оптимизация этого алгоритма, если делить отрезок не на равные части, а в отношении золотого сечения, {{---}} [[Поиск с помощью золотого сечения]] | Есть оптимизация этого алгоритма, если делить отрезок не на равные части, а в отношении золотого сечения, {{---}} [[Поиск с помощью золотого сечения]] | ||
− | [http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA Троичный поиск | + | [http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA Троичный поиск — Википедия] |
== Литература == | == Литература == | ||
Дональд Кнут Искусство программирования, том 3. Сортировка и поиск = The Art of Computer Programming, vol.3. Sorting and Searching. | Дональд Кнут Искусство программирования, том 3. Сортировка и поиск = The Art of Computer Programming, vol.3. Sorting and Searching. |
Версия 23:57, 22 января 2012
Троичный поиск (или тернарный поиск) — метод поиска минимума или максимума функции на отрезке.
Алгоритм
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).Пусть функция
на отрезке имеет минимум, и мы хотим найти точку , в которой он достигается.Посчитаем значения функции в точках
и .Так как в точке
минимум, то на отрезке функция убывает, а на — возрастает, то есть.
Значит если
, то , аналогично из следует . Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть .Псевдокод
ternarySearchMin(f, l, r, eps) if (r - l < eps) return (left + right) / 2 a = (left * 2 + right) / 3 b = (left + right * 2) / 3 if (f(a) < f(b)) return ternarySearch(f, l, b, eps) else return ternarySearch(f, a, r, eps) end
Возможен и нерекурсивный вариант:
ternarySearchMin(f, l, r, eps) while (r - l < eps) { a = (left * 2 + right) / 3 b = (left + right * 2) / 3 if (f(a) < f(b)) r = b else l = a } return (left + right) / 2 end
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока
, то время работы алгоритма составитСмотрите также
Есть оптимизация этого алгоритма, если делить отрезок не на равные части, а в отношении золотого сечения, — Поиск с помощью золотого сечения
Литература
Дональд Кнут Искусство программирования, том 3. Сортировка и поиск = The Art of Computer Programming, vol.3. Sorting and Searching.