BitSequenceRG::BitSequenceRG(const BitString & bs, uint _factor) { /*cout << "*****" << endl; cout << bitarray << endl; cout << _n << endl; cout << _factor << endl; */ const uint * bitarray = bs.getData(); size_t _n = bs.getLength(); if(_factor==0) exit(-1); data=new uint[_n/W+1]; for(size_t i=0;i<uint_len(_n,1);i++) data[i] = bitarray[i]; for(size_t i=uint_len(_n,1);i<_n/W+1;i++) data[i] = 0; //this->owner = true; this->n=_n; uint lgn=bits(n-1); this->factor=_factor; if (_factor==0) this->factor=lgn; else this->factor=_factor; b=32; s=b*this->factor; integers = n/W+1; BuildRank(); this->length = n; this->ones = rank1(n-1); }
BitRankW32Int::BitRankW32Int( uint *bitarray, uint _n, bool owner, uint _factor){ data=bitarray; this->owner = owner; this->n=_n; uint lgn=bits(n-1); this->factor=_factor; if (_factor==0) this->factor=lgn; else this->factor=_factor; b=32; s=b*this->factor; integers = n/WW32+1; BuildRank(); }
BitSequenceRGK::BitSequenceRGK(Builder builder) { BitString &bs = *builder.bs_; uint _factor = builder.factor_; select1sampling = builder.sonesamp_; select0sampling = builder.szerosamp_; fastselect0 = builder.fastselect0_; fastselect1 = builder.fastselect1_; const uint *bitarray = bs.getData(); size_t _n = bs.getLength(); if (_factor == 0) exit(-1); data = new uint[_n / W + 1]; for (size_t i = 0; i < uint_len(_n, 1); i++) data[i] = bitarray[i]; for (size_t i = uint_len(_n, 1); i < _n / W + 1; i++) data[i] = 0; //this->owner = true; this->n = _n; uint lgn = bits(n - 1); this->factor = _factor; if (_factor == 0) this->factor = lgn; else this->factor = _factor; b = 32; s = b * this->factor; integers = n / W + 1; BuildRank(); this->length = n; this->ones = rank1(n - 1); if (fastselect1) { // cout << "entered here" << endl; this->Stones = new uint[ones / select1sampling + 1]; Stones[0] = 0; for (size_t i = 0; i <= ones; i += select1sampling) { if (i == 0) continue; Stones[i / select1sampling] = this->select1_s(i); } } if (fastselect0) { this->Stzero = new uint[(n - ones) / select0sampling + 1]; Stzero[0] = 0; for (size_t i = 0; i <= (n - ones); i += select0sampling) { if (i == 0) continue; Stzero[i / select0sampling] = this->select0_s((i)); } } }
BitSequenceRGK::BitSequenceRGK(uint *bitarray, size_t _n, uint _factor, uint selectsampling) { if (_factor == 0) exit(-1); data = new uint[_n / W + 1]; for (size_t i = 0; i < uint_len(_n, 1); i++) data[i] = bitarray[i]; for (size_t i = uint_len(_n, 1); i < _n / W + 1; i++) data[i] = 0; //this->owner = true; this->n = _n; uint lgn = bits(n - 1); this->factor = _factor; if (_factor == 0) this->factor = lgn; else this->factor = _factor; b = 32; s = b * this->factor; integers = n / W + 1; BuildRank(); this->length = n; this->ones = rank1(n - 1); fastselect0 = true; fastselect1 = true; select1sampling = selectsampling; select0sampling = selectsampling; if (fastselect1) { // cout << "entered here" << endl; this->Stones = new uint[ones / select1sampling + 1]; Stones[0] = 0; for (size_t i = 0; i <= ones; i += select1sampling) { if (i == 0) continue; Stones[i / select1sampling] = this->select1_s(i); } } if (fastselect0) { this->Stzero = new uint[(n - ones) / select0sampling + 1]; Stzero[0] = 0; for (size_t i = 0; i <= (n - ones); i += select0sampling) { if (i == 0) continue; Stzero[i / select0sampling] = this->select0_s((i)); } } }