Троичный поиск: различия между версиями

Материал из Поле цифровой дидактики
 
 
(не показаны 3 промежуточные версии этого же участника)
Строка 7: Строка 7:


== Алгоритм ==
== Алгоритм ==
<source lang="c">
<syntaxhighlight lang="c" line="1">
/**
/**
Находит максимум функции с одним экстремумом между l и r.
Находит максимум функции с одним экстремумом между l и r.
Строка 22: Строка 22:
       r = m2;
       r = m2;
}
}
</source>
</syntaxhighlight>


== См. также ==
== См. также ==
* [[Двоичный поиск]] (используется для поиска точки, где производная меняет знак)
* [[Двоичный поиск]]
* [[Метод Ньютона]] (используется для поиска точки, где производная обращается в ноль)
* [[Метод Ньютона]] (используется для поиска точки, где производная обращается в ноль)
* [[Метод золотого сечения]] (схож с троичным поиском, полезен, если за одну итерацию вычисление f занимает больше всего времени)
* [[Метод золотого сечения]] (схож с троичным поиском, полезен, если за одну итерацию вычисление f занимает больше всего времени)
Строка 31: Строка 31:
* [[Линейный поиск]]
* [[Линейный поиск]]


{{rq|sources|empty|style}}
----
{{Методы оптимизации}}
 
[[Категория:Алгоритмы поиска]]
[[Категория:Алгоритмы поиска]]
[[Категория:Алгоритмы оптимизации]]

Текущая версия на 19:31, 15 декабря 2022

Трои́чный по́иск (Тернарный поиск) — это метод в информатике для поиска максимумов и минимумов функции, которая либо сначала строго возрастает, затем строго убывает, либо наоборот. Троичный поиск определяет, что минимум или максимум не может лежать либо в первой, либо в последней трети области, и затем повторяет поиск на оставшихся двух третях. Троичный поиск демонстрирует парадигму программирования «разделяй и властвуй».

Функция

Предположим, что мы ищем максимум функции f(x), и что нам известно, что максимум лежит между A и B. Чтобы алгоритм был применим, должно существовать некоторое значение x, такое, что

  • для всех a, b, для которых A ≤ a < b ≤ x, выполняется f(a) < f(b), и
  • для всех a, b, для которых x ≤ a < b ≤ B, выполняется f(a) > f(b).

Алгоритм

/**
Находит максимум функции с одним экстремумом между l и r.
Чтобы найти минимум - достаточно поменять местами действия в ветках if/else.
*/
double l = ..., r = ..., EPS = ...; // входные данные
double m1, m2;
while (r - l > EPS) {
   m1 = l + (r - l) / 3; 
   m2 = r - (r - l) / 3;
   if (f (m1) < f (m2))
      l = m1;
   else
      r = m2;
}

См. также