Рубрики
Без рубрики

Терический поиск алгоритм: объясняется на примере.

Узнайте о быстром алгоритме поиска.

Автор оригинала: Dileep kumar.

Террительный поиск Алгоритм – это быстрый алгоритм поиска для нахождения максимального или минимума Унимодал функция. Он похож на двоичный поиск и поставляется под делением и завоеванию парадигмы. Это также может быть использовано для поиска максимального значения F ( x ) f (x) F ( x ) В диапазоне [ Л , R ] [L, r] [ Л , R ] Если в этом диапазоне не будет удовлетворенным недвижимостью.

Что такое унимодальная функция

Говорят, что функция является однозначным, если она подчиняется одному из следующих свойств.

  • Функция строго увеличивается сначала, достигает максимума, а затем строго уменьшается.
  • Функция строго уменьшается первым, достигает минимума, а затем строго увеличивается.

Визуальное представление функции унимодальной (Источник: GeeksForGeeks)

UniModal.jpeg

Пример

Постановка задачи

Учитывая унимодальную функцию F ( x ) = 6 + х 0 Отказ 5 х 2 f (x) + x – 0.5x ^ 2 F ( x ) = 6 + х 0 Отказ 5 х 2 Отказ Найти максимальное значение F ( x ) f (x) F ( x ) Для целого числа х х х где 1 0 9 < х < 1 0 9 -10 ^ 9 1 0 9 < х < 1 0 9 Отказ

Решение грубой силы

Простой подход грубой силы для вышеуказанной проблемы состоит в том, чтобы перечислить все возможные значения х х х от 1 0 9 -10 ^ 9 1 0 9 к 1 0 9 10 ^ 9 1 0 9 Рассчитайте значение F ( x ) f (x) F ( x ) и обратите внимание на максимум всех полученных значений F ( x ) f (x) F ( x ) Отказ Это выглядит правильному решению, но момент сложности приведенного выше подхода – o ( n ) o (n) o ( n ) где N N N это диапазон значений, которые х х х может взять. В этом случае n порядка 2 * 1 0 9 2 * 10 ^ 9 2 * 1 0 9 который огромен с точки зрения сложности времени.

Эффективный подход с использованием тройного поиска

Хотя эта проблема также может быть решена с использованием двоичного поиска, позволяет попробовать исследовать решение, используя Террительный поиск алгоритм. Приведенная выше функция – это квадратичное уравнение и является однородным уравнением, таким образом, мы можем применить поиск в наличии на эту проблему.

Здесь позвольте мне объяснить, работающий на рыболовный поиск. Начнем с пространства поиска, равным полному диапазону [ Л , R ] [L, r] [ Л , R ] Отказ В каждой итерации мы удалим одну треть диапазона пространства поиска, который не будет содержать максимальное значение. Мы сделаем это до поискового пространства выхлопываний. В конце концов, у нас будет наш максимум.

Рассмотрим наш ассортимент обозначен л л л и R R R Отказ Мы найдем два очка P 1 P1 P 1 – представляет одну третью часть диапазона и P 2 P2 P 2 – представляет собой две третью часть диапазона.

p 1 = l + r − l 3 P1 + \ FRAC {R – L} {3} p 1 = l + ​ 3 ​ ​ r − l ​ ​

p 2 = r − r − l 3 P2 – \ FRAC {R – L} {3} p 2 = r − ​ 3 ​ ​ r − l ​ ​

  • Если F ( P 1 ) < F ( P 2 ) f (p1) F ( P 1 ) < F ( P 2 ) Наш максимум не может быть в пределах досягаемости [ л , P 1 ] [l, p1] [ л , P 1 ] Так что наш новый ассортимент будет ( p 1 , r ] (p1, r] ( p 1 , r ]
  • Если F ( P 1 ) > F ( P 2 ) f (p1)> f (p2) F ( P 1 ) > F ( P 2 ) Наш максимум не может быть в пределах досягаемости [ P 2 , R ] [P2, R] [ P 2 , R ] Так что наш новый ассортимент будет [ л , P 2 ) [l, p2) [ л , P 2 Несомненно
  • Если F ( P 1 ) = = F ( P 2 ) F (P1) (P2) F ( P 1 ) = = F ( P 2 ) Наш максимум не может быть в пределах досягаемости [ л , P 1 ) [l, p1) [ л , P 1 ) && ( p 2 , r ] (p2, r] ( p 2 , r ] , поэтому наш новый ассортимент будет [ p 1 , p 2 ] [p1, p2] [ p 1 , p 2 ]

Теперь давайте напишем код Python для реализации вышеуказанной техники и решить данную проблему.

# returns the value of f(x)
def f(x):
    return 6 + x - 0.5 * x * x

low = -1e9
high = 1e9
ans_index = None
while low <= high:
    # p1 represents the one-third part of the range
    p1 = low + (high - low) // 3 
    # p2 represents the two third part of the range
    p2 = high - (high - low) // 3
    if f(p1) < f(p2):
        # the final answer can be p2 at this instance, hence update the answer
        ans_index = p2 
        # reduce the search space to (p1, high]
        low = p1 + 1
    else:
        # reduce the search space to [low, p2)
        high = p2 - 1

# Final answer
print(f(ans_index))

Выход

Приведенный выше код печати 6 Отказ 5 6,5 6 Отказ 5 как максимальное значение F ( x ) f (x) F ( x ) который является правильным ответом.

Сложность времени

Если начальная длина диапазона есть N N N После одного итерации остальная длина будет 2 N / 3 2n/3 2 N / 3 Отказ Поэтому уравнение времени выполнения может быть получено, как,

T ( n ) = T ( 2 n / 3 ) + 1 T (n) (2n/3) + 1 T ( n ) = T ( 2 n / 3 ) + 1

Решение вышеуказанного уравнения, мы получаем временную сложность быть o ( l o g ( n ) ) o (log (n)) o ( l o g ( n ) )

Заключение

Торговый поиск может быть использован для решения многих проблем, которые включают в себя униводильное поведение в них. Он имеет очень простую реализацию и очень легко понять.