exit(1);\r
}\r
\r
- int r, s;\r
+ //int r, s;\r
treeNode y;\r
if (isleaf(Par,x))\r
return NULLT;\r
\r
- r = (int) Tags->rank(tag, node2tagpos(x));\r
- s = (int) Tags->select(tag, r+1);\r
+ int s = (int) Tags->select_next(tag,node2tagpos(x));\r
+ /*r = (int) Tags->rank(tag, node2tagpos(x));\r
+ s = (int) Tags->select(tag, r+1);*/\r
if (s == -1) return NULLT; // there is no such node\r
y = tagpos2node(s); // transforms the tag position into a node position\r
if (!is_ancestor(Par, x, y)) return NULLT; // the next node tagged tag (in preorder) is not within the subtree of x.\r
{\r
\r
treeNode res,y,lim;\r
- int r,s;\r
+ //int r,s;\r
lim = find_close(Par,root); \r
res=NULLT;\r
for (unsigned int i = 0; i < ftlen; i ++ )\r
{\r
\r
- r = (int) Tags->rank(folltags[i], node2tagpos(x));\r
- s = (int) Tags->select(folltags[i], r+1);\r
+ int s = (int) Tags->select_next(folltags[i],node2tagpos(x));\r
+ /*r = (int) Tags->rank(folltags[i], node2tagpos(x));\r
+ s = (int) Tags->select(folltags[i], r+1);*/\r
if (s == -1) \r
y = NULLT; // there is no such node\r
else {\r
exit(1);\r
}\r
\r
- int r, s;\r
+ //int r, s;\r
if (x ==NULLT || x == Root())\r
return NULLT;\r
- \r
- r = (int) Tags->rank(tag, find_close(Par, x));\r
- s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.\r
+ \r
+ int s = (int) Tags->select_next(tag,find_close(Par,x));\r
+ /*r = (int) Tags->rank(tag, find_close(Par, x));\r
+ s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag. */\r
if (s==-1) return NULLT;\r
else return tagpos2node(s);\r
} \r
treeNode XMLTree::TaggedFollBelow(treeNode x, TagType tag, treeNode root)\r
{\r
\r
- int r, s;\r
+ //int r, s;\r
int lim = node2tagpos(find_close(Par,root));\r
if (x ==NULLT || x == Root())\r
return NULLT;\r
\r
- r = (int) Tags->rank(tag,find_close(Par,x));\r
- s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.\r
+ int s = (int) Tags->select_next(tag,find_close(Par,x));\r
+ /*r = (int) Tags->rank(tag,find_close(Par,x));\r
+ s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.*/\r
if (s==-1 || s >= lim) \r
return NULLT;\r
else \r
exit(1);\r
}\r
\r
- int r, s;\r
+ //int r, s;\r
treeNode ns = next_sibling(Par,x);\r
\r
if (x == NULLT || x == Root() || ns == -1)\r
return NULLT;\r
\r
- r = (int) Tags->rank(tag, node2tagpos(ns)-1);\r
- s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.\r
+ int s = (int) Tags->select_next(tag,node2tagpos(ns)-1);\r
+ /*r = (int) Tags->rank(tag, node2tagpos(ns)-1);\r
+ s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.*/\r
if (s==-1) return NULLT;\r
else return tagpos2node(s);\r
}\r
int __setbit(uint *B, int i,int x) {
int j,l;
-//printf("%u\n",D);
+ //printf("%u\n",D);
j = i / D;
l = i % D;
if (x==0) B[j] &= (~(1<<(D-1-l)));
}
}
+
unsigned int __popCount(uint x) {
uint r;
#if 0
return r;
}
+
int selectd2_save(selectd2 * s, FILE * fp) {
- uint wr = 0;
- wr += fwrite(&s->n,sizeof(uint),1,fp);
- wr += fwrite(&s->m,sizeof(uint),1,fp);
- wr += fwrite(&s->size,sizeof(uint),1,fp);
- wr += fwrite(&s->ss_len,sizeof(uint),1,fp);
- wr += fwrite(&s->sl_len,sizeof(uint),1,fp);
- wr += fwrite(s->buf,sizeof(uchar),(s->n+7)/8+1,fp);
- uint nl = (s->m-1) / L + 1;
- wr += fwrite(s->lp,sizeof(uint),nl+1,fp);
- wr += fwrite(s->p,sizeof(uint),nl+1,fp);
- wr += fwrite(s->ss,sizeof(ushort),s->ss_len,fp);
- wr += fwrite(s->sl,sizeof(uint),s->sl_len,fp);
- if(wr!=s->sl_len+s->ss_len+2*(nl+1)+(s->n+7)/8+1+5)
- return 1;
- return 0;
+ uint wr = 0;
+ wr += fwrite(&s->n,sizeof(uint),1,fp);
+ wr += fwrite(&s->m,sizeof(uint),1,fp);
+ wr += fwrite(&s->size,sizeof(uint),1,fp);
+ wr += fwrite(&s->ss_len,sizeof(uint),1,fp);
+ wr += fwrite(&s->sl_len,sizeof(uint),1,fp);
+ wr += fwrite(s->buf,sizeof(uchar),(s->n+7)/8+1,fp);
+ uint nl = (s->m-1) / L + 1;
+ wr += fwrite(s->lp,sizeof(uint),nl+1,fp);
+ wr += fwrite(s->p,sizeof(uint),nl+1,fp);
+ wr += fwrite(s->ss,sizeof(ushort),s->ss_len,fp);
+ wr += fwrite(s->sl,sizeof(uint),s->sl_len,fp);
+ if(wr!=s->sl_len+s->ss_len+2*(nl+1)+(s->n+7)/8+1+5)
+ return 1;
+ return 0;
}
+
int selectd2_load(selectd2 * s, FILE * fp) {
- uint rd = 0;
- rd += fread(&s->n,sizeof(uint),1,fp);
- rd += fread(&s->m,sizeof(uint),1,fp);
- rd += fread(&s->size,sizeof(uint),1,fp);
- rd += fread(&s->ss_len,sizeof(uint),1,fp);
- rd += fread(&s->sl_len,sizeof(uint),1,fp);
- s->buf = new uchar[(s->n+7)/8+1];
- rd += fread(s->buf,sizeof(uchar),(s->n+7)/8+1,fp);
- uint nl = (s->m-1) / L + 1;
- s->lp = new uint[nl+1];
- rd += fread(s->lp,sizeof(uint),nl+1,fp);
- s->p = new uint[nl+1];
- rd += fread(s->p,sizeof(uint),nl+1,fp);
- s->ss = new ushort[s->ss_len];
- rd += fread(s->ss,sizeof(ushort),s->ss_len,fp);
- s->sl = new uint[s->sl_len];
- rd += fread(s->sl,sizeof(uint),s->sl_len,fp);
- if(rd!=s->sl_len+s->ss_len+2*(nl+1)+(s->n+7)/8+1+5)
- return 1;
- return 0;
+ uint rd = 0;
+ rd += fread(&s->n,sizeof(uint),1,fp);
+ rd += fread(&s->m,sizeof(uint),1,fp);
+ rd += fread(&s->size,sizeof(uint),1,fp);
+ rd += fread(&s->ss_len,sizeof(uint),1,fp);
+ rd += fread(&s->sl_len,sizeof(uint),1,fp);
+ s->buf = new uchar[(s->n+7)/8+1];
+ rd += fread(s->buf,sizeof(uchar),(s->n+7)/8+1,fp);
+ uint nl = (s->m-1) / L + 1;
+ s->lp = new uint[nl+1];
+ rd += fread(s->lp,sizeof(uint),nl+1,fp);
+ s->p = new uint[nl+1];
+ rd += fread(s->p,sizeof(uint),nl+1,fp);
+ s->ss = new ushort[s->ss_len];
+ rd += fread(s->ss,sizeof(ushort),s->ss_len,fp);
+ s->sl = new uint[s->sl_len];
+ rd += fread(s->sl,sizeof(uint),s->sl_len,fp);
+ if(rd!=s->sl_len+s->ss_len+2*(nl+1)+(s->n+7)/8+1+5)
+ return 1;
+ return 0;
}
+
void selectd2_free(selectd2 * s) {
- //delete [] s->buf;
- delete [] s->lp;
- delete [] s->p;
- delete [] s->ss;
- delete [] s->sl;
+ //delete [] s->buf;
+ delete [] s->lp;
+ delete [] s->p;
+ delete [] s->ss;
+ delete [] s->sl;
}
+
int selectd2_construct(selectd2 *select, int n, uchar *buf) {
int i,m;
int nl;
}
nl = (m-1) / L + 1;
- select->size = 0; //ignoring buf, shared with selects3
+ select->size = 0; //ignoring buf, shared with selects3
select->lp = new uint[nl+1];
- for(int k=0;k<nl+1;k++) select->lp[k]=0;
+ for(int k=0;k<nl+1;k++) select->lp[k]=0;
select->size += (nl+1)*sizeof(uint);
select->p = new uint[nl+1];
- for(int k=0;k<nl+1;k++) select->p[k]=0;
+ for(int k=0;k<nl+1;k++) select->p[k]=0;
select->size += (nl+1)*sizeof(uint);
for (r = 0; r < 2; r++) {
}
if (r == 0) {
select->sl = new uint[ml*L+1];
- for(int k=0;k<ml*L+1;k++) select->sl[k]=0;
+ for(int k=0;k<ml*L+1;k++) select->sl[k]=0;
select->size += sizeof(uint)*(ml*L+1);
- select->sl_len = ml*L+1;
+ select->sl_len = ml*L+1;
select->ss = new ushort[ms*(L/LLL)+1];
- for(int k=0;k<ms*(L/LLL)+1;k++) select->ss[k]=0;
- select->ss_len = ms*(L/LLL)+1;
+ for(int k=0;k<ms*(L/LLL)+1;k++) select->ss[k]=0;
+ select->ss_len = ms*(L/LLL)+1;
select->size += sizeof(ushort)*(ms*(L/LLL)+1);
}
}
delete [] s;
- return 0;
+ return 0;
}
int selects3_save(selects3 * s, FILE * fp) {
- uint wr = 0;
- wr += fwrite(&s->n,sizeof(uint),1,fp);
- wr += fwrite(&s->m,sizeof(uint),1,fp);
- wr += fwrite(&s->size,sizeof(uint),1,fp);
- wr += fwrite(&s->d,sizeof(uint),1,fp);
- wr += fwrite(&s->hi_len,sizeof(uint),1,fp);
- wr += fwrite(&s->low_len,sizeof(uint),1,fp);
- wr += fwrite(s->hi,sizeof(uchar),s->hi_len,fp);
- wr += fwrite(s->low,sizeof(uint),s->low_len,fp);
- if(wr!=(6+s->hi_len+s->low_len))
- return 1;
- if(selectd2_save(s->sd0,fp)) return 2;
- if(selectd2_save(s->sd1,fp)) return 3;
- return 0;
+ uint wr = 0;
+ wr += fwrite(&s->n,sizeof(uint),1,fp);
+ wr += fwrite(&s->m,sizeof(uint),1,fp);
+ wr += fwrite(&s->size,sizeof(uint),1,fp);
+ wr += fwrite(&s->d,sizeof(uint),1,fp);
+ wr += fwrite(&s->hi_len,sizeof(uint),1,fp);
+ wr += fwrite(&s->low_len,sizeof(uint),1,fp);
+ wr += fwrite(s->hi,sizeof(uchar),s->hi_len,fp);
+ wr += fwrite(s->low,sizeof(uint),s->low_len,fp);
+ if(wr!=(6+s->hi_len+s->low_len))
+ return 1;
+ if(selectd2_save(s->sd0,fp)) return 2;
+ if(selectd2_save(s->sd1,fp)) return 3;
+ return 0;
}
+
int selects3_load(selects3 * s, FILE * fp) {
- uint rd = 0;
- rd += fread(&s->n,sizeof(uint),1,fp);
- rd += fread(&s->m,sizeof(uint),1,fp);
- rd += fread(&s->size,sizeof(uint),1,fp);
- rd += fread(&s->d,sizeof(uint),1,fp);
- rd += fread(&s->hi_len,sizeof(uint),1,fp);
- rd += fread(&s->low_len,sizeof(uint),1,fp);
- s->hi = new uchar[s->hi_len];
- rd += fread(s->hi,sizeof(uchar),s->hi_len,fp);
- s->low = new uint[s->low_len];
- rd += fread(s->low,sizeof(uint),s->low_len,fp);
- if(rd!=(6+s->hi_len+s->low_len))
- return 1;
- s->sd0 = new selectd2;
- if(selectd2_load(s->sd0,fp)) return 2;
- s->sd1 = new selectd2;
- if(selectd2_load(s->sd1,fp)) return 3;
- delete [] s->sd0->buf;
- delete [] s->sd1->buf;
- s->sd0->buf = s->hi;
- s->sd1->buf = s->hi;
- return 0;
+ uint rd = 0;
+ rd += fread(&s->n,sizeof(uint),1,fp);
+ rd += fread(&s->m,sizeof(uint),1,fp);
+ rd += fread(&s->size,sizeof(uint),1,fp);
+ rd += fread(&s->d,sizeof(uint),1,fp);
+ rd += fread(&s->hi_len,sizeof(uint),1,fp);
+ rd += fread(&s->low_len,sizeof(uint),1,fp);
+ s->hi = new uchar[s->hi_len];
+ rd += fread(s->hi,sizeof(uchar),s->hi_len,fp);
+ s->low = new uint[s->low_len];
+ rd += fread(s->low,sizeof(uint),s->low_len,fp);
+ if(rd!=(6+s->hi_len+s->low_len))
+ return 1;
+ s->sd0 = new selectd2;
+ if(selectd2_load(s->sd0,fp)) return 2;
+ s->sd1 = new selectd2;
+ if(selectd2_load(s->sd1,fp)) return 3;
+ delete [] s->sd0->buf;
+ delete [] s->sd1->buf;
+ s->sd0->buf = s->hi;
+ s->sd1->buf = s->hi;
+ return 0;
}
+
void selects3_free(selects3 * s) {
- delete [] s->hi;
- delete [] s->low;
- //delete [] s->sd0->buf;
- selectd2_free(s->sd0);
- delete s->sd0;
- selectd2_free(s->sd1);
- delete s->sd1;
+ delete [] s->hi;
+ delete [] s->low;
+ //delete [] s->sd0->buf;
+ selectd2_free(s->sd0);
+ delete s->sd0;
+ selectd2_free(s->sd1);
+ delete s->sd1;
}
+
int selects3_construct(selects3 *select, int n, uint *buf) {
int i,m;
int d,mm;
select->d = d;
buf2 = new uchar[(2*m+8-1)/8+1];
- for(int k=0;k<(2*m+8-1)/8+1;k++) buf2[k]=0;
- select->hi_len = (2*m+8-1)/8+1;
+ for(int k=0;k<(2*m+8-1)/8+1;k++) buf2[k]=0;
+ select->hi_len = (2*m+8-1)/8+1;
low = new uint[(d*m+PBS-1)/PBS+1];
- for(uint k=0;k<(d*m+PBS-1)/PBS+1;k++) low[k]=0;
- select->low_len = (d*m+PBS-1)/PBS+1;
+ for(uint k=0;k<(d*m+PBS-1)/PBS+1;k++) low[k]=0;
+ select->low_len = (d*m+PBS-1)/PBS+1;
select->hi = buf2;
select->low = low;
select->sd0 = sd0;
for (i=0; i<m*2; i++) __setbit2(buf2,i,1-__getbit2(buf2,i));
- return 0;
+ return 0;
}
int selects3_select(selects3 *select, int i) {
int d,x;
- #if 1
+ #if 0
if (i > select->m) {
printf("ERROR: m=%d i=%d\n",select->m,i);
exit(1);
}
+
+int selects3_selectnext(selects3 *select, int i) {
+ int d,x,w,y;
+ int r,j;
+ int z,ii;
+ uint *q;
+
+ d = select->d;
+ q = select->low;
+
+ ii = i>>d;
+ y = selectd2_select(select->sd0,ii,0)+1;
+ int k2=y-ii;
+ // selectd2_select2(select->sd0,ii,0,&y1,&y2);
+ //y1++; y2++;
+ //printf("y %d y1 %d %d\n",y,y1,y2-y1);
+
+ x = y - ii;
+ int x_orig = x;
+
+ j = i - (ii<<d);
+
+ r = y & 7;
+ y >>= 3;
+ z = select->hi[y];
+ while (1) {
+ if (((z << r) & 0x80) == 0) {
+ //if(!__getbit2(select->hi,(8*y+r))) k2++;
+ if(x!=x_orig) k2++;
+ //cout << "??? i=" << i << " bit=" << __getbit2(select->hi,(8*y+r)) << " minirank=" << minirank << endl;
+ break;
+ }
+ w = __getbits(q,x*d,d);
+ if (w >= j) {
+ if (w == j) {
+ if(__getbit2(select->hi,(8*y+r))) k2++;
+ x++;
+ r++;
+ }
+ break;
+ }
+ x++;
+ r++;
+ if(__getbit2(select->hi,(8*y+r))) k2++;
+ if (r == 8) {
+ r = 0;
+ y++;
+ z = select->hi[y];
+ }
+ }
+
+ if(x==select->m)
+ return (uint)-1;
+
+ /*if(i==0) {
+ for(int kk=0;kk<40;kk++)
+ cout << ((__getbit2(select->hi,kk))?1:0);
+ cout << endl;
+ }*/
+ int c=8*y+r;//-k2;//+x-r;//x-r;//+r;//-x;
+ while(!__getbit2(select->hi,c)) c++;
+ c -= (k2);
+ //cout << "i=" << i << " y=" << y << " r=" << r << " x=" << x << " k2=" << k2 << " ii=" << ii << " s2=" << selectd2_select(select->sd0,ii,0)+1
+ // << " j=" << j << " c=" << c << endl;
+ //while(__getbit2(select->hi,c)==0) c++;
+ //c+=ii-r+x;
+ //if(i==601) c=2;
+ //cout << "c=" << c << " (c<<d)=" << (c<<d) << endl;
+ /*while(select->hi[y]==0) y++;
+ int c = 8*y;
+ z = select->hi[y];
+ while(__getbit((uint*)&z,i++)==0) c++;*/
+
+ return __getbits(q,x*d,d)+((c)<<d);
+}
+
int selects3_rank(selects3 *select, int i) {
int d,x,w,y;
int r,j;
}
}
- return x;
+ return x;
}
+
#include <static_bitsequence_sdarray.h>
static_bitsequence_sdarray::static_bitsequence_sdarray(uint * buff, uint len) {
- uint * tmp_seq = new uint[uint_len(len,1)+1];
- ones = 0;
- for(uint i=0;i<uint_len(len,1)+1;i++)
- tmp_seq[i] = 0;
- for(uint i=0;i<len;i++)
- if(bitget(buff,i)) {
- __setbit(tmp_seq,i,1);
- ones++;
- }
- if(ones)
- selects3_construct(&sd,len,tmp_seq);
- this->len = len;
- //this->ones = sd.m;
- delete [] tmp_seq;
+ uint * tmp_seq = new uint[uint_len(len,1)+1];
+ ones = 0;
+ for(uint i=0;i<uint_len(len,1)+1;i++)
+ tmp_seq[i] = 0;
+ for(uint i=0;i<len;i++)
+ if(bitget(buff,i)) {
+ __setbit(tmp_seq,i,1);
+ ones++;
+ }
+ if(ones)
+ selects3_construct(&sd,len,tmp_seq);
+ this->len = len;
+ //this->ones = sd.m;
+ delete [] tmp_seq;
}
+
static_bitsequence_sdarray::static_bitsequence_sdarray() {make___selecttbl();}
static_bitsequence_sdarray::~static_bitsequence_sdarray() {
- if(ones)
- selects3_free(&sd);
+ if(ones)
+ selects3_free(&sd);
}
+
uint static_bitsequence_sdarray::rank1(uint i) {
- if(i>=len) return -1;
- if(ones)
- return selects3_rank(&sd,i);
- else
- return 0;
+ if(i>=len) return -1;
+ if(ones)
+ return selects3_rank(&sd,i);
+ else
+ return 0;
}
+
uint static_bitsequence_sdarray::select1(uint i) {
- if(i>ones || i==0) return -1;
- if(ones)
- return selects3_select(&sd,i);
- else
- return (uint)-1;
+ if(i>ones || i==0) return -1;
+ if(ones)
+ return selects3_select(&sd,i);
+ else
+ return (uint)-1;
+}
+
+
+uint static_bitsequence_sdarray::select_next1(uint i) {
+ return selects3_selectnext(&sd,i);
}
+
uint static_bitsequence_sdarray::size() {
- return sizeof(static_bitsequence_sdarray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0);
+ return sizeof(static_bitsequence_sdarray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0);
}
+
int static_bitsequence_sdarray::save(FILE * fp) {
- uint wr = SDARRAY_HDR;
- wr = fwrite(&wr,sizeof(uint),1,fp);
- wr += fwrite(&len,sizeof(uint),1,fp);
- wr += fwrite(&ones,sizeof(uint),1,fp);
- if(wr!=3 || (ones?(selects3_save(&sd,fp)):false))
- return 1;
- return 0;
+ uint wr = SDARRAY_HDR;
+ wr = fwrite(&wr,sizeof(uint),1,fp);
+ wr += fwrite(&len,sizeof(uint),1,fp);
+ wr += fwrite(&ones,sizeof(uint),1,fp);
+ if(wr!=3 || (ones?(selects3_save(&sd,fp)):false))
+ return 1;
+ return 0;
}
+
static_bitsequence_sdarray * static_bitsequence_sdarray::load(FILE * fp) {
- uint id;
- if(fread(&id,sizeof(uint),1,fp)!=1) return NULL;
- if(id!=SDARRAY_HDR) return NULL;
- static_bitsequence_sdarray * ret = new static_bitsequence_sdarray();
- id = fread(&ret->len,sizeof(uint),1,fp);
- id += fread(&ret->ones,sizeof(uint),1,fp);
- if(ret->ones && selects3_load(&ret->sd,fp)) {
- delete ret;
- return NULL;
- }
- return ret;
+ uint id;
+ if(fread(&id,sizeof(uint),1,fp)!=1) return NULL;
+ if(id!=SDARRAY_HDR) return NULL;
+ static_bitsequence_sdarray * ret = new static_bitsequence_sdarray();
+ id = fread(&ret->len,sizeof(uint),1,fp);
+ id += fread(&ret->ones,sizeof(uint),1,fp);
+ if(ret->ones && selects3_load(&ret->sd,fp)) {
+ delete ret;
+ return NULL;
+ }
+ return ret;
}
-