Function nekolib::algo::minmax_by_key

source ·
pub fn minmax_by_key<T, K, U>(buf: &[T], key: K) -> Option<(&T, &T)>where
    K: FnMut(&T) -> U,
    U: Ord,
Expand description

キー key におけるスライスの最小値および最大値を求める。

該当する要素が複数個あった場合、最小値は最左のもの、最大値は最右のものが選ばれる。 スライスが空の場合は None を返す。

Complexity

minmax_by における compare の呼び出し回数と同じだけ、要素間の比較を行う。 また、key の呼び出しをその $2$ 倍の回数だけ行う。

Implementation notes

実装を minmax_by に丸投げしているので key を $3n$ 回程度呼び出しうるが、 適切に実装することで $n$ 回に抑えられるはず。

key のコストが大きい場合は予め別の配列を作る方がよさそう。

Notes

詳細については minmax_by を参照。

Examples

use nekolib::algo::minmax_by_key;

let buf: Vec<_> =
    vec![3, 5, 0, 1, 2, 0, 5].into_iter().enumerate().collect();
assert_eq!(minmax_by_key(&buf, |&(_, x)| x), Some((&(2, 0), &(6, 5))));

let buf: Vec<i32> = vec![];
assert_eq!(minmax_by_key(&buf, |&x| x), None);