#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <algorithm>
#include "bmdbg.h"
using namespace std;
static
const unsigned max_coll = 850000,
unsigned repeat = 220)
{
str_vec.resize(0);
string str;
for (unsigned i = 10; i < max_coll; i += unsigned(rand() % 3))
{
switch (rand()%8)
{
case 0: str = "xnssv"; break;
default: str = "xrs"; break;
}
str.append(to_string(i));
for (unsigned k = 0; k < repeat; ++k, ++i)
str_vec.emplace_back(str);
}
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(str_vec.begin() + str_vec.size()/2, str_vec.end(), g);
}
{
int i, j, pivot;
if (first < last)
{
pivot = i= first;
j = last;
while (i <j)
{
while((i < last) && (strsv.
compare(stype(i), stype(pivot)) <= 0))
i++;
while(strsv.
compare(stype(j), stype(pivot)) > 0)
j--;
if (i < j)
strsv.
swap(stype(i), stype(j));
}
strsv.
swap(stype(pivot), stype(j));
}
}
{
int i, j, pivot;
while (first < last)
{
pivot = i = first;
j = last;
strsv.
get(stype(pivot), pivot_buf,
sizeof(pivot_buf));
while (i < j)
{
while((i < last) && (strsv.
compare(stype(i), pivot_buf) <= 0))
++i;
while(strsv.
compare(stype(j), pivot_buf) > 0)
--j;
if (i < j)
strsv.
swap(stype(i), stype(j));
}
strsv.
swap(stype(pivot), stype(j));
first = j+1;
}
}
static
{
for (const string& s : str_vec)
{
const char* cs = s.c_str();
(void)found;
}
}
{
try
{
vector<string> str_vec;
cout << "Loading " << str_vec.size() << " elements..." << endl;
{
for (const string& term : str_vec)
bi = term;
}
{
}
str_sv2 = str_sv;
{
str_sv_type::statistics st;
size_t std_vect_mem = sizeof(str_vec);
for (const string& term : str_vec)
std_vect_mem += term.size() + sizeof(term);
cout << "std::vector<string> mem = " << std_vect_mem << endl;
cout << "Succinct vector vector mem = " << st.memory_used << endl;
}
cout << "Quick Sort... 1" << endl;
{
}
cout << "Quick Sort... 2" << endl;
{
}
cout << "Insertion Sort... " << endl;
{
}
cout << "std::sort..." << endl;
{
std::sort(str_vec.begin(), str_vec.end());
}
{
bool eq = str_sv.
equal(str_sv2);
if (!eq)
{
cerr << "post-sort vector mismatch! (qsort 1-2)" << endl;
assert(0); exit(1);
}
{
string s, s3;
vector<string>::const_iterator sit = str_vec.begin();
str_sv_type::const_iterator it = str_sv.
begin();
str_sv_type::const_iterator it_end = str_sv.
end();
str_sv_type::const_iterator it3 = str_sv3.
begin();
for (; it != it_end; ++it, ++sit, ++it3)
{
s = *it;
if (*sit != s)
{
cerr << "Mismatch at:" << s << "!=" << *sit << endl;
assert(0);
return 1;
}
s3 = *it3;
if (s != s3)
{
cerr << "Mismatch at:" << s << "!=" << s3 << endl;
return 1;
}
}
}
cout << "Sort validation Ok." << endl;
}
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}
Compressed bit-vector bvector<> container, set algebraic methods, traversal iterators.
#define BM_DECLARE_TEMP_BLOCK(x)
Algorithms for bm::sparse_vector.
string sparse vector based on bit-transposed matrix
Timing utilities for benchmarking (internal).
pre-processor un-defines to avoid global space pollution (internal)
Bitvector Bit-vector container with runtime compression of bits.
Utility class to collect performance measurements and statistics.
std::map< std::string, statistics > duration_map_type
test name to duration map
static void print_duration_map(TOut &tout, const duration_map_type &dmap, format fmt=ct_time)
algorithms for sparse_vector scan/search
bool lower_bound_str(const SV &sv, const value_type *str, size_type &pos)
lower bound search for an array position
succinct sparse vector for strings with compression using bit-slicing ( transposition) method
void insert(size_type idx, const value_type *str)
insert the specified element
const_iterator end() const BMNOEXCEPT
Provide const iterator access to the end.
void optimize(bm::word_t *temp_block=0, typename bvector_type::optmode opt_mode=bvector_type::opt_compress, typename str_sparse_vector< CharType, BV, STR_SIZE >::statistics *stat=0)
run memory optimization for all vector planes
void calc_stat(struct str_sparse_vector< CharType, BV, STR_SIZE >::statistics *st) const BMNOEXCEPT
Calculates memory statistics.
bool equal(const str_sparse_vector< CharType, BV, STR_SIZE > &sv, bm::null_support null_able=bm::use_null) const BMNOEXCEPT
check if another sparse vector has the same content and size
size_type size() const
return size of the vector
const_iterator begin() const BMNOEXCEPT
Provide const iterator access to container content.
int compare(size_type idx, const value_type *str) const BMNOEXCEPT
Compare vector element with argument lexicographically.
size_type get(size_type idx, value_type *str, size_type buf_size) const BMNOEXCEPT
get specified element
void remap()
Build remapping profile and re-load content to save memory.
back_insert_iterator get_back_inserter()
Provide back insert iterator Back insert iterator implements buffered insertion, which is faster,...
void swap(size_type idx1, size_type idx2)
swap two vector elements between each other
bvector_type::size_type size_type
bm::chrono_taker ::duration_map_type timing_map
bm::str_sparse_vector< char, bvector_type, 32 > str_sv_type
static void generate_string_set(vector< string > &str_vec)
static void insertion_sort(str_sv_type &str_sv, const vector< string > &str_vec)
void quicksort2(str_sv_type &strsv, int first, int last)
Faster variant of quicksort, uses different variant of pivot compare, with decompressed argument.
void quicksort(str_sv_type &strsv, int first, int last)
quick-sort