longcongduoi / dag_vector

direct accessible compressed vector

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Author: Daisuke Okanohara (daisuke.okanoahra@gmail.com)

Libarary of a collection of direct accessible vectors.  

dag_vector
----------

dag_vector is a direct accessible gamma code vector. 
dag_vector stores positive integers space-efficiently, and supports push_back() and fast random access. 

comp_vector
-----------

comp_vector is a compressed vector for arbitrary objects.
In comp_vector, each distinct object is assigned a unique positive value, and this value is stored by dag_vector. 
The object should support comparator (bool operator< (const object& ) const). 
If the frequency distribution of elements is skewed, comp_vector efficiently stores objects. 

sparse_set
----------

sparse_set is a space-efficient set for positive integers [0, 1, ...].

 
usage : dag_vector
==================

#include <dag/dag_vector.hpp>

dag::dag_vector dv;

// you can use dag_vector as vector<uint64_t>
// the working space is same as the gamma code. For an positive integer x, it requires 2log2(x+1) - 1 bits
// For example, "0" requires 1 bits, "7" requires 5 bits, and 100 requires 13 bits.

dv.push_back(7);
dv.push_back(1);
dv.push_back(100);
dv.push_back(0);
dv.push_back(1000000000);

// All operations are const except push_back();
// To lookup dv[i], it requires O(log dv[i]) time.

assert(dv[0] == 7);
assert(dv[1] == 1);
assert(dv[2] == 100);
assert(dv[3] == 0);
assert(dv[4] == 1000000000);

// dag_vector supports prefix_sum() operation
// dv.prefix_sum(i) returns dv[0] + dv[1] + ... + dv[i-1] in O(log max_val) time
// where max_val = max(dv[0], dv[1], ...dv[i-1])

assert(dv.prefix_sum(0) == 0);
assert(dv.prefix_sum(1) == 7);
assert(dv.prefix_sum(2) == 8);
assert(dv.prefix_sum(3) == 108);
assert(dv.prefix_sum(4) == 108);
assert(dv.prefix_sum(5) == 1000000108);


usage : comp_vector
===================

#include <dag/comp_vector.hpp>

dag::comp_vector<string> cv; 

cv.push_back(string("hoge"));
cv.push_back(string("fuga"));
cv.push_back(string("hoge"));
cv.push_back(string("hoge"));
cv.push_back(string("fuga"));

assert(cv[0] == "hoge");
assert(cv[1] == "fuga");
assert(cv[2] == "hoge");
assert(cv[3] == "hoge");
assert(cv[4] == "fuga");

Acknowledgement
===============
I use criterion.h (https://github.com/tanakh/criterion) for performance test. Thanks tanakh.

About

direct accessible compressed vector

License:BSD 3-Clause "New" or "Revised" License