Misplaced Pages

Ternary search

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.
Algorithm for finding the extrema of a unimodal function
This article relies largely or entirely on a single source. Relevant discussion may be found on the talk page. Please help improve this article by introducing citations to additional sources.
Find sources: "Ternary search" – news · newspapers · books · scholar · JSTOR (May 2007)

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

The function

Assume we are looking for a maximum of f ( x ) {\displaystyle f(x)} and that we know the maximum lies somewhere between A {\displaystyle A} and B {\displaystyle B} . For the algorithm to be applicable, there must be some value x {\displaystyle x} such that

  • for all a , b {\displaystyle a,b} with A a < b x {\displaystyle A\leq a<b\leq x} , we have f ( a ) < f ( b ) {\displaystyle f(a)<f(b)} , and
  • for all a , b {\displaystyle a,b} with x a < b B {\displaystyle x\leq a<b\leq B} , we have f ( a ) > f ( b ) {\displaystyle f(a)>f(b)} .

Algorithm

Let f ( x ) {\displaystyle f(x)} be a unimodal function on some interval [ l ; r ] {\displaystyle } . Take any two points m 1 {\displaystyle m_{1}} and m 2 {\displaystyle m_{2}} in this segment: l < m 1 < m 2 < r {\displaystyle l<m_{1}<m_{2}<r} . Then there are three possibilities:

  • if f ( m 1 ) < f ( m 2 ) {\displaystyle f(m_{1})<f(m_{2})} , then the required maximum can not be located on the left side – [ l ; m 1 ] {\displaystyle } . It means that the maximum further makes sense to look only in the interval [ m 1 ; r ] {\displaystyle }
  • if f ( m 1 ) > f ( m 2 ) {\displaystyle f(m_{1})>f(m_{2})} , that the situation is similar to the previous, up to symmetry. Now, the required maximum can not be in the right side – [ m 2 ; r ] {\displaystyle } , so go to the segment [ l ; m 2 ] {\displaystyle }
  • if f ( m 1 ) = f ( m 2 ) {\displaystyle f(m_{1})=f(m_{2})} , then the search should be conducted in [ m 1 ; m 2 ] {\displaystyle } , 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 m 1 {\displaystyle m_{1}} and m 2 {\displaystyle m_{2}} :

  • m 1 = l + ( r l ) / 3 {\displaystyle m_{1}=l+(r-l)/3}
  • m 2 = r ( r l ) / 3 {\displaystyle m_{2}=r-(r-l)/3}
Run time order
T ( n ) = T ( 2 n / 3 ) + O ( 1 ) = Θ ( log n ) {\displaystyle T(n)=T(2n/3)+O(1)=\Theta (\log n)} (by the Master Theorem)

Recursive algorithm

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

def ternary_search(f, left, right, absolute_precision) -> float:
    """Find maximum of unimodal function f() within .
    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

References

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