Троичный поиск — различия между версиями
| Строка 1: | Строка 1: | ||
| {{В разработке}} | {{В разработке}} | ||
| '''Троичный поиск''' (или ''тернарный поиск'') {{---}} метод поиска минимума или максимума функции на отрезке. | '''Троичный поиск''' (или ''тернарный поиск'') {{---}} метод поиска минимума или максимума функции на отрезке. | ||
| + | |||
| + | == Алгоритм == | ||
| Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | Рассмотрим этот алгоритм на примере поиска минимума (поиск максимума аналогичен). | ||
| Строка 12: | Строка 14: | ||
| Значит если <tex>f(a) < f(b)</tex>, то <tex>x_{min} \in [l, b]</tex>, | Значит если <tex>f(a) < f(b)</tex>, то <tex>x_{min} \in [l, b]</tex>, | ||
| − | аналогично из <tex>f(a) > f(b)</tex> следует <tex> x_{min} \in [a,  | + | аналогично из <tex>f(a) > f(b)</tex> следует <tex> x_{min} \in [a, r]</tex>. | 
| Тогда нам нужно изменить границы поиска и искать дальше, | Тогда нам нужно изменить границы поиска и искать дальше, | ||
| пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | пока не будет достигнута необходимая точность, то есть <tex> r-l < \varepsilon </tex>. | ||
| − | Псевдокод | + | === Псевдокод === | 
| − | + |   ternarySearchMin(f, l, r, eps)   | |
| − |     if (r-l < eps) | + |     if (r - l < eps) | 
|       return (left + right) / 2 |       return (left + right) / 2 | ||
|     a = (left * 2 + right) / 3 |     a = (left * 2 + right) / 3 | ||
|     b = (left + right * 2) / 3 |     b = (left + right * 2) / 3 | ||
|     if (f(a) < f(b)) |     if (f(a) < f(b)) | ||
| + |      return ternarySearch(f, l, b, eps) | ||
| + |    else | ||
|       return ternarySearch(f, a, r, eps) |       return ternarySearch(f, a, r, eps) | ||
| − | |||
| − | |||
|   end |   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 | ||
| + | |||
| + | |||
| + | === Время работы === | ||
| + | |||
| + | Так как на каждой итерации мы считаем 2 значения функции и уменьшаем область поиска в полтора раза, пока <tex> r - l > \varepsilon</tex>, | ||
| + | то время работы алгоритма составит  | ||
| + | <tex>2 \log_{\frac32} \left(\frac{r - l}{\varepsilon}\right)</tex> | ||
Версия 16:50, 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
Время работы
Так как на каждой итерации мы считаем 2 значения функции и уменьшаем область поиска в полтора раза, пока , то время работы алгоритма составит
