Троичный поиск — различия между версиями
Savelin (обсуждение | вклад) (→Литература) |
Savelin (обсуждение | вклад) |
||
| Строка 3: | Строка 3: | ||
== Алгоритм == | == Алгоритм == | ||
| + | [[File:Ternar2.png|thumb|300px|Пример. <tex>f(a) < f(b) \Rightarrow x_{min} \in [l, b]</tex>]] | ||
| − | + | Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | |
| − | Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | ||
Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. | Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. | ||
| Строка 57: | Строка 57: | ||
== См. также == | == См. также == | ||
| − | * [[Поиск с помощью золотого сечения]] - оптимизация троичного поиска. | + | * [[Поиск с помощью золотого сечения]] {{---}} оптимизация троичного поиска. |
| − | * [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 Троичный поиск {{---}} Википедия] |
| − | * [http://en.wikipedia.org/wiki/Ternary_search Ternary search - Wikipedia] | + | * [http://en.wikipedia.org/wiki/Ternary_search Ternary search {{---}} Wikipedia] |
== Литература == | == Литература == | ||
| − | * Дональд Кнут - Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. - The Art of Computer Programming. Vol. 3. Sorting and Searching. | + | * Дональд Кнут {{---}} Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. {{---}} The Art of Computer Programming. Vol. 3. Sorting and Searching. |
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Алгоритмы поиска]] | [[Категория: Алгоритмы поиска]] | ||
Версия 10:54, 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 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.