| Crates.io | interavl |
| lib.rs | interavl |
| version | 0.3.0 |
| created_at | 2024-07-28 21:49:45.399967+00 |
| updated_at | 2025-02-02 22:03:53.719868+00 |
| description | An optimised interval tree for efficient interval stabbing |
| homepage | |
| repository | https://github.com/domodwyer/interavl |
| max_upload_size | |
| id | 1318274 |
| size | 123,111 |
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 | 1.5µs | 6ns | 39ns |
| 1,000 tuples | 31µs | 8ns | 67ns |
| 10,000 tuples | 777us | 9ns | 115ns |
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. ↩