void WaveletMatrix::build_level(uint **bm, uint *symbols, uint length, uint *occs) { uint sigma = max_value(symbols, length); uint *new_order = new uint[sigma + 1]; for (uint level = 0; level < height; level++) { uint zeroes = 0; for (uint i = 0; i < sigma + 1; i++) if (!is_set(i, height - level - 1)) { new_order[i] = 0; } else { new_order[i] = 1; } for (uint i = 0; i < length; i++) if (!new_order[symbols[i]]) zeroes++; uint *new_symbols = new uint[length]; uint new_pos0 = 0, new_pos1 = zeroes; for (uint i = 0; i < length; i++) { if (!new_order[symbols[i]]) { new_symbols[new_pos0++] = symbols[i]; bitclean(bm[level], i); } else { new_symbols[new_pos1++] = symbols[i]; bitset(bm[level], i); } } delete [] symbols; symbols = new_symbols; } delete [] symbols; delete [] new_order; }
// symbols is an array of elements of "width" bits. void WaveletTreeNoptrs::build_level(uint **bm, uint *symbols, unsigned width, uint level, uint length, uint offset) { if(level==height) { delete [] symbols; return; } uint cleft=0; for(size_t i=0;i<length;i++) if(!is_set(get_field(symbols, width, i),level)) cleft++; uint cright=length-cleft; uint *left=new uint[(cleft*width)/W + 1], *right=new uint[(cright*width)/W + 1]; cleft=cright=0; for(size_t i=0;i<length;i++) if(!is_set(get_field(symbols,width,i),level)) { set_field(left,width,cleft++,get_field(symbols, width,i)); bitclean(bm[level],offset+i); } else { set_field(right,width,cright++,get_field(symbols,width,i)); bitset(bm[level],offset+i); } delete [] symbols; symbols = 0; build_level(bm,left,width,level+1,cleft,offset); left = 0; // Gets deleted in recursion. build_level(bm,right,width,level+1,cright,offset+cleft); right = 0; // Gets deleted in recursion. //delete [] left; //delete [] right; }
void WaveletTreeNoptrs::build_level(uint **bm, uint *symbols, uint level, uint length, uint offset) { if(level==height) { delete [] symbols; return; } uint cleft=0; for(size_t i=0;i<length;i++) if(!is_set(symbols[i],level)) cleft++; uint cright=length-cleft; uint *left=new uint[cleft], *right=new uint[cright]; cleft=cright=0; for(size_t i=0;i<length;i++) if(!is_set(symbols[i],level)) { left[cleft++]=symbols[i]; bitclean(bm[level],offset+i); } else { right[cright++]=symbols[i]; bitset(bm[level],offset+i); } delete [] symbols; symbols = 0; build_level(bm,left,level+1,cleft,offset); left = 0; // Gets deleted in recursion. build_level(bm,right,level+1,cright,offset+cleft); right = 0; // Gets deleted in recursion. //delete [] left; //delete [] right; }
uint encodeGamma(uint* output, uint pos, uint value) { uint l = logb2(value); uint i; for(i = 0; i < l; i++) { bitclean(output,pos); pos++; } bitset(output,pos); pos++; for(i = 0; i < l; i++) { if(value & (1 << i)) bitset(output,pos); else bitclean(output,pos); pos++; } return 2*l+1; }
void WaveletTreeNoptrsS::build_level(uint **bm, uint *symbols, uint length, uint *occs) { // for (uint i = 0; i < length; i++) // cout << " " << symbols[i]; // cout << endl; uint sigma = max_value(symbols, length); uint *new_order = new uint[sigma + 1]; for (uint level = 0; level < height; level++) { uint zeroes = 0; for (uint i = 0; i < sigma + 1; i++) if (!is_set(i, height - level - 1)) { new_order[i] = 0; } else { new_order[i] = 1; } for (uint i = 0; i < length; i++) if (!new_order[symbols[i]]) zeroes++; uint *new_symbols = new uint[length]; uint new_pos0 = 0, new_pos1 = zeroes; for (uint i = 0; i < length; i++) { if (!new_order[symbols[i]]) { //cout << "[" << new_pos0 << "]=" << symbols[i] << endl; new_symbols[new_pos0++] = symbols[i]; bitclean(bm[level], i); } else { //cout << "[" << new_pos1 << "]=" << symbols[i] << endl; new_symbols[new_pos1++] = symbols[i]; cds_utils::bitset(bm[level], i); } } delete [] symbols; symbols = new_symbols; // for (uint i = 0; i < length; i++) // cout << " " << symbols[i]; // cout << endl; } delete [] symbols; delete [] new_order; }