Троичный поиск — различия между версиями
|  (→Время работы) |  (→Алгоритм) | ||
| Строка 8: | Строка 8: | ||
| Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. | Пусть функция <tex>f(x)</tex> на отрезке <tex>[l, r]</tex> имеет минимум, и мы хотим найти точку <tex>x_{min}</tex>, в которой он достигается. | ||
| − | Посчитаем значения функции в точках <tex> a = l + \frac{(r-l)}{3} </tex> и <tex> b = l + \frac{2(r-l)}{3} </tex>. Так как в точке <tex>x_{min}</tex> минимум, то на отрезке <tex>[l, x_{min}]</tex> функция убывает, а на <tex>[x_{min}, r]</tex> {{---}} возрастает, то есть | + | Посчитаем значения функции в точках <tex> a = l + \frac{(r-l)}{3} </tex> и <tex> b = l + \frac{2(r-l)}{3} </tex>. | 
| + | |||
| + | Так как в точке <tex>x_{min}</tex> минимум, то на отрезке <tex>[l, x_{min}]</tex> функция убывает, а на <tex>[x_{min}, r]</tex> {{---}} возрастает, то есть | ||
| <tex> \forall x', x'' \in [l, r]: \\ | <tex> \forall x', x'' \in [l, r]: \\ | ||
| l       < x' < x'' < x_{min} \Rightarrow f(l)       > f(x') > f(x'') > f(x_{min}) \\ | l       < x' < x'' < x_{min} \Rightarrow f(l)       > f(x') > f(x'') > f(x_{min}) \\ | ||
Версия 16:52, 15 июня 2011
Эта статья находится в разработке!
Троичный поиск (или тернарный поиск) — метод поиска минимума или максимума функции на отрезке.
Алгоритм
Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен).
Пусть функция на отрезке имеет минимум, и мы хотим найти точку , в которой он достигается.
Посчитаем значения функции в точках и .
Так как в точке минимум, то на отрезке функция убывает, а на — возрастает, то есть .
Значит если , то , аналогично из следует . Тогда нам нужно изменить границы поиска и искать дальше, пока не будет достигнута необходимая точность, то есть .
Псевдокод
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
Время работы
Так как на каждой итерации мы считаем два значения функции и уменьшаем область поиска в полтора раза, пока , то время работы алгоритма составит
