19 lines
502 B
Go
19 lines
502 B
Go
package numerics
|
|
|
|
// Bisect returns the largest index i in [imin, imax] such that f(i) < target,
|
|
// assuming f is monotonically nondecreasing on that range.
|
|
//
|
|
// If target <= f(imin), returns imin. If target > f(imax), returns imax.
|
|
// Performs O(log(imax-imin)) evaluations of f.
|
|
func Bisect(imin, imax int, target float64, f func(i int) float64) int {
|
|
lo, hi := imin, imax
|
|
for lo < hi {
|
|
mid := (lo + hi + 1) / 2
|
|
if target <= f(mid) {
|
|
hi = mid - 1
|
|
} else {
|
|
lo = mid
|
|
}
|
|
}
|
|
return lo
|
|
}
|