예제 #1
0
	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;
	}
예제 #2
0
    // 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;
    }
예제 #3
0
    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;
    }
예제 #4
0
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;
}
예제 #5
0
 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;
 }