Тернарный поиск - Ternary search
А алгоритм тройного поиска это техника в Информатика для поиска минимум или максимум из одномодальный функция. Тройной поиск определяет, что минимум или максимум не может быть в первой трети домена или что он не может быть в последней трети домена, а затем повторяется в оставшихся двух третях. Тернарный поиск - это пример разделяй и властвуй алгоритм (видеть алгоритм поиска ).
Функция
Предположим, мы ищем максимум ж(Икс) и что мы знаем, что максимум лежит где-то между А и B. Чтобы алгоритм был применим, должно быть какое-то значение Икс такой, что
- для всех а,б с A ≤ а < б ≤ Икс, у нас есть ж(а) < ж(б), и
- для всех а,б с Икс ≤ а < б ≤ B, имеем ж(а) > ж(б).
Алгоритм
Позволять ж(Икс) быть одномодальный функция на некотором интервале [л; р]. Возьмите любые две точки м1 и м2 в этом сегменте: л < м1 < м2 < р. Тогда есть три возможности:
- если ж(м1) < ж(м2), то требуемый максимум не может располагаться с левой стороны - [л; м1]. Значит, максимум дальше имеет смысл смотреть только в интервале [м1;р]
- если ж(м1) > ж(м2), что ситуация аналогична предыдущей, с точностью до симметрии. Теперь требуемый максимум не может быть в правой части - [м2; р], так что перейдите в сегмент [л; м2]
- если ж(м1) = f (м2), то поиск следует вести в [м1; м2], но этот случай можно отнести к любому из двух предыдущих (для упрощения кода). Рано или поздно длина отрезка станет немного меньше заданной константы, и процесс можно будет остановить.
точки выбора м1 и м2:
- м1 = л + (р-л)/3
- м2 = р - (р-л)/3
- Порядок выполнения
Рекурсивный алгоритм
def ternary_search(ж, оставили, верно, absolute_precision) -> плавать: "" "Левая и правая - текущие границы; максимум между ними. """ если пресс(верно - оставили) < absolute_precision: возвращаться (оставили + верно) / 2 left_third = (2*оставили + верно) / 3 right_third = (оставили + 2*верно) / 3 если ж(left_third) < ж(right_third): возвращаться ternary_search(ж, left_third, верно, absolute_precision) еще: возвращаться ternary_search(ж, оставили, right_third, absolute_precision)
Итерационный алгоритм
def ternary_search(ж, оставили, верно, absolute_precision) -> плавать: "" "Найти максимум унимодальной функции f () в пределах [слева, справа] Чтобы найти минимум, отмените оператор if / else или отмените сравнение. """ пока пресс(верно - оставили) >= absolute_precision: left_third = оставили + (верно - оставили) / 3 right_third = верно - (верно - оставили) / 3 если ж(left_third) < ж(right_third): оставили = left_third еще: верно = right_third # Слева и справа - текущие границы; максимум между ними возвращаться (оставили + верно) / 2
Смотрите также
- Метод Ньютона в оптимизации (можно использовать для поиска, где производная равна нулю)
- Поиск золотого сечения (аналогично тернарному поиску, полезно, если вычисление f занимает большую часть времени на итерацию)
- Алгоритм двоичного поиска (может использоваться для поиска того, где производная меняет знак)
- Поиск интерполяции
- Экспоненциальный поиск
- Линейный поиск
- Реализация трехмерного тернарного поиска
Рекомендации
Эта статья не цитировать любой источники.Май 2007 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |