#fixed-size #queue #calculate #value #median #odd

moving_stats

Fixed size queue, which calculate moving median when you add new value(O(n))

3 unstable releases

Uses new Rust 2024

0.2.1 Jan 15, 2026
0.2.0 Jan 14, 2026
0.1.4 Jan 14, 2026

#1313 in Algorithms

MIT license

10KB
134 lines

moving_stats

Fixed size queue, which calculate moving median when you add new value.

sampling size must be odd number because this can be used for all Ord(and Clone) types.

computational complexity: O(n) for calculating median, O(nlog(n)) only for first calculation because it simply sorts and finds median.

Example(part of test Code)

#[test]
fn it_works() {
    let mut queue:MovingMedian<f64> = MovingMedian::new(3).unwrap();
    queue.add(3.0);
    queue.add(7.0);
    assert_eq!(queue.is_full(), false);
    assert_eq!(queue.median(), None);
    queue.add(6.0);
    assert_eq!(queue.is_full(), true);
    assert_eq!(queue.median(), Some(6.0));
    queue.add(9.0);
    assert_eq!(queue.median(), Some(7.0));
    queue.add(1.0);
    assert_eq!(queue.median(), Some(6.0));
    assert_eq!(queue.get(0), Ok(6.0));
    assert_eq!(queue.get(2), Ok(1.0));
    assert_eq!(queue.get(3).is_err(), true);
    assert_eq!(queue.get(-3).is_err(), true);
    assert_eq!(queue.get(-1), Ok(1.0));
    assert_eq!(queue.get(-2), Ok(9.0));
    assert_eq!(queue.add(f64::NAN).is_err(), true);
    assert_eq!(queue.add(5.0).is_err(), false);

    let mut str_queue:MovingMedian<String> = MovingMedian::new(3).unwrap();
    str_queue.add(String::from("abc"));
    str_queue.add(String::from("def"));
    str_queue.add(String::from("adc"));
    assert_eq!(str_queue.is_full(), true);
    assert_eq!(str_queue.median(), Some(String::from("adc")));
    str_queue.add(String::from("bbe"));
    assert_eq!(str_queue.median(), Some(String::from("bbe")));
}

No runtime deps