BitSequenceSDArray::BitSequenceSDArray(const BitString & bs) { uint * tmp_seq = new uint[uint_len(bs.getLength(),1)+1]; ones = 0; for(uint i=0;i<uint_len(bs.getLength(),1)+1;i++) tmp_seq[i] = 0; for(uint i=0;i<bs.getLength();i++) if(bs[i]) { __setbit(tmp_seq,i,1); ones++; } if(ones) selects3_construct(&sd,bs.getLength(),tmp_seq); this->length = bs.getLength(); delete [] tmp_seq; }
bool testBitSequence(BitString & a, BitSequence * bs) { size_t rank0SoFar = 0; size_t rank1SoFar = 0; for(size_t i=0; i<a.getLength(); i++) { if(a[i]) { rank1SoFar++; if(bs->select1(rank1SoFar)!=i) { cerr << "SELECT1 ERROR " << i << endl; return false; } if(i>0 && bs->selectNext1(i)!=i) { cout << "i=" << i << "sn=" << bs->selectNext1(i) << endl; cerr << "SELECTNEXT1 ERROR" << endl; return false; } } else { rank0SoFar++; if(bs->select0(rank0SoFar)!=i) { cerr << "SELECT0 ERROR" << endl; return false; } if(i>0 && bs->selectNext0(i)!=i) { cerr << "SELECTNEXT0 ERROR" << endl; return false; } } if(bs->rank1(i)!=rank1SoFar) return false; if(bs->rank0(i)!=rank0SoFar) return false; if(bs->access(i)!=a[i]) return false; } return true; }
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); }
BitSequenceRGK::BitSequenceRGK(const BitString &bs, uint _factor, uint selectsampling) { const uint *bitarray = bs.getData(); size_t _n = bs.getLength(); // cout << _factor << endl; if (_factor == 0) exit(-1); // cout << "_n/W+1=" << _n/W+1 << endl; data = new uint[_n / W + 1]; // cout << "_n/W+1=" << _n/W+1 << endl; 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)); } } }
BitSequenceRRR::BitSequenceRRR(const BitString & bs, uint sample_rate) { build(bs.getData(),bs.getLength(),sample_rate); }