Ternary search

From Wikipedia the free encyclopedia

A ternary search algorithm[1] is a technique in computer science for finding the minimum or maximum of a unimodal function.

The function[edit]

Assume we are looking for a maximum of and that we know the maximum lies somewhere between and . For the algorithm to be applicable, there must be some value such that

  • for all with , we have , and
  • for all with , we have .

Algorithm[edit]

Let be a unimodal function on some interval . Take any two points and in this segment: . Then there are three possibilities:

  • if , then the required maximum can not be located on the left side – . It means that the maximum further makes sense to look only in the interval
  • if , that the situation is similar to the previous, up to symmetry. Now, the required maximum can not be in the right side – , so go to the segment
  • if , then the search should be conducted in , but this case can be attributed to any of the previous two (in order to simplify the code). Sooner or later the length of the segment will be a little less than a predetermined constant, and the process can be stopped.

choice points and :

Run time order

Recursive algorithm[edit]

def ternary_search(f, left, right, absolute_precision) -> float:     """Left and right are the current bounds;     the maximum is between them.     """     if abs(right - left) < absolute_precision:         return (left + right) / 2      left_third = (2*left + right) / 3     right_third = (left + 2*right) / 3      if f(left_third) < f(right_third):         return ternary_search(f, left_third, right, absolute_precision)     else:         return ternary_search(f, left, right_third, absolute_precision) 

Iterative algorithm[edit]

def ternary_search(f, left, right, absolute_precision) -> float:     """Find maximum of unimodal function f() within [left, right].     To find the minimum, reverse the if/else statement or reverse the comparison.     """     while abs(right - left) >= absolute_precision:         left_third = left + (right - left) / 3         right_third = right - (right - left) / 3          if f(left_third) < f(right_third):             left = left_third         else:             right = right_third       # Left and right are the current bounds; the maximum is between them      return (left + right) / 2 

See also[edit]

References[edit]

  1. ^ "Ternary Search". cp-algorithms.com. Retrieved 21 August 2023.