Function nekolib::algo::bisect_::bisect_slice

source ·
pub fn bisect_slice<T>(buf: &[T], pred: impl FnMut(&T) -> bool) -> usize
Expand description

二分探索で境界を探す。

pred(&buf[i])false となる最小の i を返す。 ただし i < buf.len() なる全ての itrue の場合は buf.len() を返す。 先頭から i 個の要素が条件を満たすと考えるのがよい。

Requirements

pred(&buf[i])false となる i が存在するとき、i < j なる全ての jpred(&buf[j])false となる。

Complexity

buf.len() を $n$ として、高々 $\lceil\log_2(n+1)\rceil$ 回の pred の呼び出しを行う。

Examples

use nekolib::algo::bisect_slice;

assert_eq!(bisect_slice(&[2, 4, 7], |&x| x < 4), 1);
assert_eq!(bisect_slice(&[2, 4, 7], |&x| x <= 4), 2);
assert_eq!(bisect_slice(&[2, 4, 7], |&_| false), 0);
assert_eq!(bisect_slice(&[2, 4, 7], |&_| true), 3);