Crates.io | interavl |
lib.rs | interavl |
version | 0.2.0 |
source | src |
created_at | 2024-07-28 21:49:45.399967 |
updated_at | 2024-08-17 20:41:10.826047 |
description | An optimised interval tree for efficient interval stabbing |
homepage | |
repository | https://github.com/domodwyer/interavl |
max_upload_size | |
id | 1318274 |
size | 91,317 |
This crate implements an interval tree backed by an augmented, balanced binary search tree (an AVL tree - interavl - get it?!)
The IntervalTree
maps half-open intervals to opaque values, and provides
efficient querying of all stored (interval, value)
tuples that match a variety
of temporal relations described by Allen's interval algebra.
use interavl::IntervalTree;
// Initialise an empty tree.
let mut t = IntervalTree::default();
// Insert interval & value tuples into the tree.
//
// Intervals can be composed of any type that implements "Ord" such
// as timestamps, strings, etc.
t.insert(24..80, "Bob");
t.insert(10..100, "Doris");
t.insert(40..55, "Frank");
t.insert(100..400, "Nigel");
// Find which intervals overlap with a query interval:
for (interval, name) in t.iter_overlaps(&(42..50)) {
println!("{name} overlaps (matching interval is {interval:?})");
}
Lookup operations against an IntervalTree
are fast, executing against
millions / billions of keys per second:
Tree Size | Build Tree | Lookup Value | Stabbing Query |
---|---|---|---|
100 tuples | 3µs | 7ns | 59ns |
1,000 tuples | 81µs | 8ns | 101ns |
10,000 tuples | 1ms | 9ns | 172ns |
Interval stabbing and membership queries are particularly fast due to the use of subtree pruning to reduce the search space.1
The above measurements capture the single-threaded performance of operations against a tree containing varying numbers of keys on a M1 MacBook Pro.
The benchmarks to generate these numbers are included in this repo (run cargo bench
).
Interval stabbing filters ~53 billion intervals per second. ↩