Crates.io | binary-search |
lib.rs | binary-search |
version | 0.1.2 |
source | src |
created_at | 2018-10-30 14:13:30.026759 |
updated_at | 2021-05-08 16:23:59.983283 |
description | General binary search implementation |
homepage | |
repository | https://github.com/danielwaterworth/binary-search |
max_upload_size | |
id | 93595 |
size | 5,498 |
Given a monotone function, find the largest quantity that is too small
and the smallest quantity that is too large. The first two arguments to
binary_search
set the bounds of the search space.
use binary_search::{binary_search, Direction};
fn main() {
let values =
[0, 4, 5, 6, 7, 9, 456];
let (largest_low, smallest_high) =
binary_search((0, ()), (values.len(), ()), |i|
if values[i] < 6 {
Direction::Low(())
} else {
Direction::High(())
}
);
dbg!(largest_low);
dbg!(smallest_high);
}
You can also provide an associated 'witness' as in this
example. Witnesses are passed in as well as produced from
binary_search
. The arguments act as a proof that the function does
indeed transition within the range. If you don't know that this is the
case, you may need to call your function at the bounds first.
use binary_search::{binary_search, Direction};
fn main() {
let values =
[Ok("foo"), Ok("bar"), Ok("baz"), Err(false), Err(true)];
let (largest_low, smallest_high) =
binary_search((0, "foo"), (values.len() - 1, true), |i|
match values[i] {
Ok(x) => Direction::Low(x),
Err(x) => Direction::High(x),
}
);
dbg!(largest_low); // "baz"
dbg!(smallest_high); // false
}