pub struct RLVector { /* private fields */ }Expand description
An immutable run-length encoded bitvector supporting rank, select, and related queries.
This type should be used when the bitvector contains long runs of both set and unset bits.
Other bitvector types are more appropriate for dense (no long runs) and sparse (long runs of unset bits) bitvectors.
The bitvector is immutable, though it would be easy to implement a mutable version by storing the blocks in a B+-tree rather than a vector.
The maximum length of the vector is approximately usize::MAX bits.
Conversions between various BitVec types are possible using the From trait.
RLVector implements the following simple_sds traits:
- Basic functionality:
BitVec - Queries and operations:
Rank,Select,SelectZero,PredSucc - Serialization:
Serialize
§Examples
use simple_sds_sbwt::ops::{BitVec, Rank, Select, SelectZero, PredSucc};
use simple_sds_sbwt::rl_vector::{RLVector, RLBuilder};
let mut builder = RLBuilder::new();
builder.try_set(18, 22);
builder.try_set(95, 15);
builder.try_set(110, 10);
builder.try_set(140, 12);
builder.set_len(200);
let rv = RLVector::from(builder);
// BitVec
assert_eq!(rv.len(), 200);
assert!(!rv.is_empty());
assert_eq!(rv.count_ones(), 59);
assert_eq!(rv.count_zeros(), 141);
assert!(rv.get(119));
assert!(!rv.get(120));
for (index, value) in rv.iter().enumerate() {
assert_eq!(value, rv.get(index));
}
// Rank
assert!(rv.supports_rank());
assert_eq!(rv.rank(100), 27);
assert_eq!(rv.rank(130), 47);
assert_eq!(rv.rank_zero(60), 38);
// Select
assert!(rv.supports_select());
assert_eq!(rv.select(24), Some(97));
let mut iter = rv.select_iter(46);
assert_eq!(iter.next(), Some((46, 119)));
assert_eq!(iter.next(), Some((47, 140)));
let v: Vec<(usize, usize)> = rv.one_iter().take(4).collect();
assert_eq!(v, vec![(0, 18), (1, 19), (2, 20), (3, 21)]);
// SelectZero
assert!(rv.supports_select_zero());
assert_eq!(rv.select_zero(130), Some(189));
let mut iter = rv.select_zero_iter(72);
assert_eq!(iter.next(), Some((72, 94)));
assert_eq!(iter.next(), Some((73, 120)));
let v: Vec<(usize, usize)> = rv.zero_iter().take(4).collect();
assert_eq!(v, vec![(0, 0), (1, 1), (2, 2), (3, 3)]);
// PredSucc
assert!(rv.supports_pred_succ());
assert!(rv.predecessor(17).next().is_none());
assert_eq!(rv.predecessor(18).next(), Some((0, 18)));
assert_eq!(rv.predecessor(40).next(), Some((21, 39)));
assert_eq!(rv.successor(139).next(), Some((47, 140)));
assert_eq!(rv.successor(140).next(), Some((47, 140)));
assert!(rv.successor(152).next().is_none());§Notes
RLVectornever panics from I/O errors.- All
RLVectorqueries are always enabled without additional support structures.
Implementations§
Source§impl RLVector
impl RLVector
Sourcepub const BLOCK_SIZE: usize = 64usize
pub const BLOCK_SIZE: usize = 64usize
Number of code units in a block.
Sourcepub fn copy_bit_vec<'a, T: BitVec<'a> + Select<'a>>(source: &'a T) -> Self
pub fn copy_bit_vec<'a, T: BitVec<'a> + Select<'a>>(source: &'a T) -> Self
Returns a copy of the source bitvector as RLVector.
The copy is created by iterating over the set bits using Select::one_iter.
From implementations from other bitvector types should generally use this function.
§Examples
use simple_sds_sbwt::bit_vector::BitVector;
use simple_sds_sbwt::ops::BitVec;
use simple_sds_sbwt::rl_vector::RLVector;
use std::iter::FromIterator;
let source: Vec<bool> = vec![true, false, true, true, false, true, true, false];
let bv = BitVector::from_iter(source);
let rv = RLVector::copy_bit_vec(&bv);
assert_eq!(rv.len(), bv.len());
assert_eq!(rv.count_ones(), bv.count_ones());Trait Implementations§
Source§impl<'a> BitVec<'a> for RLVector
impl<'a> BitVec<'a> for RLVector
Source§fn len(&self) -> usize
fn len(&self) -> usize
Source§fn count_ones(&self) -> usize
fn count_ones(&self) -> usize
Source§fn count_zeros(&self) -> usize
fn count_zeros(&self) -> usize
Source§impl From<RLVector> for SparseVector
impl From<RLVector> for SparseVector
Source§impl From<SparseVector> for RLVector
impl From<SparseVector> for RLVector
Source§fn from(source: SparseVector) -> Self
fn from(source: SparseVector) -> Self
Source§impl<'a> PredSucc<'a> for RLVector
impl<'a> PredSucc<'a> for RLVector
Source§type OneIter = OneIter<'a>
type OneIter = OneIter<'a>
Source§fn supports_pred_succ(&self) -> bool
fn supports_pred_succ(&self) -> bool
true if predecessor/successor support has been enabled.Source§fn enable_pred_succ(&mut self)
fn enable_pred_succ(&mut self)
Source§impl<'a> Rank<'a> for RLVector
impl<'a> Rank<'a> for RLVector
Source§impl<'a> Select<'a> for RLVector
impl<'a> Select<'a> for RLVector
Source§type OneIter = OneIter<'a>
type OneIter = OneIter<'a>
Source§fn supports_select(&self) -> bool
fn supports_select(&self) -> bool
true if select support has been enabled.Source§fn enable_select(&mut self)
fn enable_select(&mut self)
Source§impl<'a> SelectZero<'a> for RLVector
impl<'a> SelectZero<'a> for RLVector
Source§type ZeroIter = ZeroIter<'a>
type ZeroIter = ZeroIter<'a>
Source§fn supports_select_zero(&self) -> bool
fn supports_select_zero(&self) -> bool
true if select support has been enabled for the complement.