Тернарный поиск - 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

Смотрите также

Рекомендации