Crates.io | adqselect |
lib.rs | adqselect |
version | 0.1.3 |
source | src |
created_at | 2020-08-13 11:34:33.63996 |
updated_at | 2021-01-10 13:46:45.907642 |
description | A lightweight crate that brings an implementation of nth_element by using the adaptive quickselect algorithm by Andrei Alexandrescu. |
homepage | |
repository | https://github.com/frjnn/adqselect |
max_upload_size | |
id | 276197 |
size | 13,492,115 |
A lightweight crate that brings to Rust an nth_element
implementation that leverages Andrei Alexandrescu's adaptive quickselect algorithm. Also available on crates.io.
Be sure that your Cargo.toml
looks somewhat like this:
[dependencies]
adqselect = "0.1.3"
Bring the crate into scope:
extern crate adqselect;
use adqselect::nth_element;
then simply call nth_element
on a vector.
let mut v = vec![10, 7, 9, 7, 2, 8, 8, 1, 9, 4];
nth_element(&mut v, 3, &mut Ord::cmp);
assert_eq!(v[3], 7);
This implementation also handles generic data types as long as they satisfy the PartialEq
and PartialOrd
traits.
Link to the original paper: Fast Deterministic Selection by Andrei Alexandrescu.
The algorithm is based on a refined version of Median of Medians and it guarantees linear deterministic time complexity.
Here are some benchmarks against other crates: floydrivest, order-stat, kth and pdqselect.
This chart shows the relationship between function/parameter and iteration time. The thickness of the shaded region indicates the probability that a measurement of the given function/parameter would take a particular length of time.
This chart shows the mean measured time for each function as the input (or the size of the input) increases.