View text source at Wikipedia
This article relies largely or entirely on a single source. (May 2007) |
A ternary search algorithm[1] is a technique in computer science for finding the minimum or maximum of a unimodal function.
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
Let be a unimodal function on some interval . Take any two points and in this segment: . Then there are three possibilities:
choice points and :
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)
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