Elias-Fano Encoding in Rust
A Rust implementation of the Elias-Fano encoding scheme for storing monotonic sequences of integers efficiently.
Features
- Efficient storage of monotonic sequences
- O(1) access to elements
- Support for duplicate values
- Builder pattern for incremental construction
- Iterator support with lookup and lookup_next operations
- Serialization/deserialization support via serde
- No unsafe code
Usage
Add this to your Cargo.toml:
[]
= "0.1.0"
Basic Usage
use EliasFano;
// Create from a sorted sequence
let values = vec!;
let seq = from;
// Access elements
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!; // Out of bounds
// Get sequence properties
assert_eq!;
assert_eq!; // max value + 1
assert!;
// Iterate over values
let collected: = seq.iter.collect;
assert_eq!;
Using the Builder Pattern
use EliasFanoBuilder;
// Create a builder with universe=10 and count=4
let mut builder = new;
builder.add;
builder.add;
builder.add;
builder.add;
let seq = builder.finalize;
// Add multiple values at once
let mut builder = new;
builder.add_all;
let seq = builder.finalize;
Iterator Operations
use EliasFano;
let values = vec!;
let seq = from;
let mut iter = seq.iter;
// Basic iteration
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
// Lookup operations
let mut iter = seq.iter;
assert_eq!; // Find first occurrence of 5
assert_eq!; // Value not found
assert_eq!; // Iterator position updated
// Lookup next operations
let mut iter = seq.iter;
assert_eq!; // Next value is 5 at index 1
assert_eq!; // Next value is 9 at index 3
assert_eq!; // Returns last index for values > universe
Different Input Types
use EliasFano;
// From Vec
let vec = vec!;
let seq1 = from;
// From slice
let slice = &;
let seq2 = from;
// From array
let array = ;
let seq3 = from;
// From different integer types
let u32_values = vec!;
let seq4 = from;
let i32_values = vec!;
let seq5 = from;
Serialization
use EliasFano;
use serde_json;
let values = vec!;
let seq = from;
// Serialize to JSON
let json = to_string.unwrap;
// Deserialize from JSON
let seq2: EliasFano = from_str.unwrap;
assert_eq!;
Error Handling
use ;
// Input must be sorted
let unsorted = vec!;
let result = catch_unwind;
assert!;
// Values must be within universe
let mut builder = new;
builder.add;
let result = catch_unwind;
assert!;
Performance
The structure provides O(1) access to elements while using approximately 2n + log(u/n) bits of space, where n is the number of elements and u is the universe size (maximum value + 1).
Space Complexity
- For n elements with maximum value u:
- Upper bits: n + u/2^l bits
- Lower bits: n * l bits
- Where l = log2(u/n)
Time Complexity
- Construction: O(n)
- Access: O(1)
- Lookup: O(log n) with binary search
- Iteration: O(1) per element
Documentation
For detailed documentation, visit docs.rs.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the Apache 2.0 License - see the LICENSE file for details.