Giter Club home page Giter Club logo

succinct-rs's Introduction

Succinct Data Structures for Rust

Build Status Crates.io License: MIT License: Apache 2.0

So far we have:

  • bit vectors and bit buffer;
  • integer vectors with arbitrary-sized (1- to 64-bit) elements;
  • a variety of universal codes;
  • constant-time rank queries; and
  • O(lg lg n)-time select queries based on binary search over ranks.

Usage

It’s on crates.io, so you can add

[dependencies]
succinct = "0.5.2"

to your Cargo.toml.

Credits

  • IntVec borrows some implementation techniques from nbitsvec. The main difference is that nbitsvec uses a typenum to put the element size (in bits) as a parameter to the vector type. Also, nbitsvec is likely to be faster.

  • Some of the API is inspired by SDSL, a C++ succinct data structures library. It’s much more complete than succinct, and probably more correct and faster too.

succinct-rs's People

Contributors

dependabot-preview[bot] avatar luizirber avatar tov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

succinct-rs's Issues

[Usage] Can not achieve good throughput for rank operation

Hi there,

I seem to be not able to get constant time rank lookup for my BitVector.
I get a throughput of 1.3 MiB/sec. Here is a minimal example of my usage:

use succinct::stream::{BitBuffer};
use succinct::BitVector;
use succinct::bit_vec::BitVecMut;
use succinct::rank::{JacobsonRank, RankSupport};
use rand::distributions::WeightedIndex;
use rand::prelude::*;
use std::time::Instant;

fn main() {

    // Preprocessing
    let keys: Vec<usize> = vec![0,32,48,52,54,56,58,60,62,63];
    let vals: Vec<(u8,u8)> = vec![(0,1),(1,2),(2,4),(3,5),(4,5),(5,5),(6,5),(7,5),(8,6),(9,6)];

    // Generation of BitVector
    let mut bv: BitVector<usize> = BitVector::with_fill(keys[keys.len()-1] as u64 +1, false);
    for k in keys {
        bv.set_bit(k as u64, true);
    }
    let jbv = JacobsonRank::new(bv);

    // Generation of random values for lookup with rank operation
    let size = 770_044;
    let look_up_values = get_lookup_values(size);

    // Actual lookup
    let now = Instant::now();
    for val in look_up_values {
        vals[jbv.rank(val as u64, true) as usize];
    }

    // Timing
    let time = now.elapsed().as_secs_f32();
    let throughput = size as f32 / time / 1024f32 / 1024f32;
    println!("Elapsed: {} ({} MiB/s)", time, throughput);
}

/// Generates vector of values to be looked up in BitVector
fn get_lookup_values(size: usize) -> Vec<u8> {
    let words: Vec<u8> = vec![20, 17, 6, 3, 2, 2, 2, 1, 1, 1,
                                1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                ];
    generate_random_byte_vector(0, words.len() as u8, size, &words)
}

fn generate_random_byte_vector(min: u8, max: u8, count: usize, weights: &[u8]) -> Vec<u8> {
    let mut rng = rand::thread_rng();
    let choices: Vec<_> = (min..max).collect();
    let dist = WeightedIndex::new(weights).unwrap();
    assert_eq!(choices.len(), weights.len());
    (0..count).map(|_| choices[dist.sample(&mut rng)]).collect()
}

Is there something wrong with my initialisation of the BitVector or is there a way to speed things up?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.