X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_bitsequence%2Fstatic_bitsequence_brw32.cpp;h=2ca4eed9f75dc27302f6833e5cd18f3fc824c83e;hb=a9846746dc7a55764591fcc273fd48c6049df962;hp=9bc1313e4a5d4b91bfd8954c158e335b7345e4ed;hpb=efe894650813a19a0e1408eb5807e59f037afc3b;p=SXSI%2FXMLTree.git diff --git a/libcds/src/static_bitsequence/static_bitsequence_brw32.cpp b/libcds/src/static_bitsequence/static_bitsequence_brw32.cpp index 9bc1313..2ca4eed 100644 --- a/libcds/src/static_bitsequence/static_bitsequence_brw32.cpp +++ b/libcds/src/static_bitsequence/static_bitsequence_brw32.cpp @@ -38,7 +38,7 @@ static_bitsequence_brw32::static_bitsequence_brw32(){ data=NULL; - this->owner = true; +// this->owner = true; this->n=0; this->factor=0; } @@ -54,7 +54,7 @@ static_bitsequence_brw32::static_bitsequence_brw32( uint *bitarray, uint _n, uin data[i] = bitarray[i]; for(uint i=uint_len(_n,1);i<_n/W+1;i++) data[i] = 0; - this->owner = true; + //this->owner = true; this->n=_n; uint lgn=bits(n-1); this->factor=_factor; @@ -70,7 +70,7 @@ static_bitsequence_brw32::static_bitsequence_brw32( uint *bitarray, uint _n, uin static_bitsequence_brw32::~static_bitsequence_brw32() { delete [] Rs; - if (owner) delete [] data; + delete [] data; } //Metodo que realiza la busqueda d @@ -142,7 +142,6 @@ static_bitsequence_brw32 * static_bitsequence_brw32::load(FILE *f) { ret->data = new uint[ret->n/W+1]; if (!ret->data) return NULL; if (fread (ret->data,sizeof(uint),ret->n/W+1,f) != ret->n/W+1) return NULL; - ret->owner = true; ret->Rs= new uint[ret->n/ret->s+1]; if (!ret->Rs) return NULL; if (fread (ret->Rs,sizeof(uint),ret->n/ret->s+1,f) != ret->n/ret->s+1) return NULL; @@ -152,15 +151,15 @@ static_bitsequence_brw32 * static_bitsequence_brw32::load(FILE *f) { } uint static_bitsequence_brw32::SpaceRequirementInBits() { - return (owner?n:0)+(n/s)*sizeof(uint)*8 +sizeof(static_bitsequence_brw32)*8; + return uint_len(n,1)*sizeof(uint)*8+(n/s)*sizeof(uint)*8 +sizeof(static_bitsequence_brw32)*8; } uint static_bitsequence_brw32::size() { - return SpaceRequirementInBits()/8; + return sizeof(static_bitsequence_brw32)+SpaceRequirementInBits()/8; } uint static_bitsequence_brw32::SpaceRequirement() { - return (owner?n:0)/8+(n/s)*sizeof(uint)+sizeof(static_bitsequence_brw32); + return n/8+(n/s)*sizeof(uint)+sizeof(static_bitsequence_brw32); } uint static_bitsequence_brw32::prev2(uint start) { @@ -293,3 +292,67 @@ uint static_bitsequence_brw32::select1(uint x) { } return left-1; } + +uint static_bitsequence_brw32::select0(uint x) { + // returns i such that x=rank_0(i) && rank_0(i-1) integers) return n; + j = data[left]; + zeros = W-popcount(j); + } + //sequential search using popcount over a char + left=left*b; + rankmid = 8-popcount8(j); + if (rankmid < x) { + j=j>>8; + x-=rankmid; + left+=8; + rankmid = 8-popcount8(j); + if (rankmid < x) { + j=j>>8; + x-=rankmid; + left+=8; + rankmid = 8-popcount8(j); + if (rankmid < x) { + j=j>>8; + x-=rankmid; + left+=8; + } + } + } + + // then sequential search bit a bit + while (x>0) { + if (j%2 == 0 ) x--; + j=j>>1; + left++; + } + left--; + if (left > n) return n; + else return left; +}