1632
 правки
Изменения
м
 
 
rollbackEdits.php mass rollback
'''Троичный поиск''' (''ternary search, тернарный поиск'') {{---}} метод поиска минимума или максимума функции на отрезке, которая либо сначала строго возрастает, затем строго убывает, либо наоборот. 
== Алгоритм ==
[[File:Ternar2.png|thumb|280px|Пример. <tex>f(a) < f(b) \Rightarrow implies x_{min} \in [l, b]</tex>]]
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). 
<tex> \forall x', x'' \in [l, r]: \\
l       < x' < x'' < x_{min} \Rightarrow implies f(l)       > f(x') > f(x'') > f(x_{min}) \\x_{min} < x' < x'' < r       \Rightarrow implies f(x_{min}) < f(x') < f(x'') < f(r)       </tex>.
Значит если <tex>f(a) < f(b)</tex>, то <tex>x_{min} \in [l, b]</tex>,
Тогда нам нужно изменить границы поиска и искать дальше,
пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>.
Из рассуждений и рисунка может возникнуть идея взять, например, отрезок <tex>[l, a]</tex> вместо отрезка <tex>[l, b]</tex>. Но этого делать нельзя, потому что мы не умеем различать случаи, когда <tex>f(a) < f(b)</tex> и <tex>a</tex> слева или справа от минимума. 
Можно заметить, что если мы всегда будем брать отрезок <tex>[l, b]</tex> при <tex>f(a) < f(b)</tex> или <tex>[a, r]</tex> при <tex>f(a) > f(b)</tex> , то минимум функции всегда будет в нашем отрезке. Если <tex>f(a) = f(b)</tex>, то можно взять любой отрезок.
=== Псевдокод ===
Рекурсивный вариант:
 '''double'''ternarySearchMin('''double''' f(f), '''double''' left, '''double''' right, '''double''' 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'''
Итеративный вариант:
 '''double'''ternarySearchMin('''double'''f(f), '''double''' left, '''double''' right, '''double''' eps) :      '''while''' (right - left > eps) 
         a = (left * 2 + right) / 3
         b = (left + right * 2) / 3
         '''if''' (f(a) < f(b))
             right = b
         '''else'''
== См. также ==
* [[Поиск с помощью золотого сечения]] {{---}} оптимизация троичного поиска.* [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]
== Литература Источники информации ==
* Дональд Кнут {{---}} Искусство программирования. Том 3. Сортировка и поиск. / Knuth D.E. {{---}} The Art of Computer Programming. Vol. 3. Sorting and Searching.
* [[wikipedia:ru:Троичный поиск|Троичный поиск — Википедия]]
* [[wikipedia:Ternary search|Ternary search {{---}} Wikipedia]]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Алгоритмы поиска]]
