X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_sequence%2Fwt_node_internal.cpp;h=0232a73e01f6baa08a674c032ac73e7b7956109a;hb=f32808a35be7a1e62830a5972473178014fa44e5;hp=4e6871a802ddf7bad3f2ec02900376490cb574b1;hpb=95f2dabec7cabe4002865e5f9d12651e6e32229a;p=SXSI%2FXMLTree.git diff --git a/libcds/src/static_sequence/wt_node_internal.cpp b/libcds/src/static_sequence/wt_node_internal.cpp index 4e6871a..0232a73 100644 --- a/libcds/src/static_sequence/wt_node_internal.cpp +++ b/libcds/src/static_sequence/wt_node_internal.cpp @@ -70,74 +70,6 @@ wt_node_internal::wt_node_internal(uint * symbols, uint n, uint l, wt_coder * c, delete [] right; } -// Deletes symbols array! -wt_node_internal::wt_node_internal(uchar * symbols, uint n, uint l, wt_coder * c, static_bitsequence_builder * bmb) { - uint * ibitmap = new uint[n/W+1]; - for(uint i=0;iis_set((uint)symbols[i],l)) - bitset(ibitmap,i); - bitmap = bmb->build(ibitmap, n); - delete [] ibitmap; - uint count_right = bitmap->rank1(n-1); - uint count_left = n-count_right+1; - uchar * left = new uchar[count_left+1]; - uchar * right = new uchar[count_right+1]; - count_right = count_left = 0; - bool match_left = true, match_right = true; - for(uint i=0;iaccess(i)) { - right[count_right++]=symbols[i]; - if(count_right>1) - if(right[count_right-1]!=right[count_right-2]) - match_right = false; - } - else { - left[count_left++]=symbols[i]; - if(count_left>1) - if(left[count_left-1]!=left[count_left-2]) - match_left = false; - } - } - - delete [] symbols; - symbols = 0; - - if(count_left>0) { - if(match_left/* && c->done(left[0],l+1)*/) - { - left_child = new wt_node_leaf((uint)left[0], count_left); - delete [] left; - left = 0; - } - else - { - left_child = new wt_node_internal(left, count_left, l+1, c, bmb); - left = 0; // Already deleted - } - } else { - left_child = NULL; - } - if(count_right>0) { - if(match_right/* && c->done(right[0],l+1)*/) - { - right_child = new wt_node_leaf((uint)right[0], count_right); - delete [] right; - right = 0; - } - else - { - right_child = new wt_node_internal(right, count_right, l+1, c, bmb); - right = 0; // Already deleted - } - } else { - right_child = NULL; - } - delete [] left; // already deleted if count_left > 0 - delete [] right; -} - wt_node_internal::wt_node_internal(uchar * symbols, uint n, uint l, wt_coder * c, static_bitsequence_builder * bmb, uint left, uint *done) { uint * ibitmap = new uint[n/W+1]; for(uint i=0;irank1(n-1); uint count_left = n-count_right; -/* uchar * leftarr = new uchar[count_left+1]; - uchar * rightarr = new uchar[count_right+1]; - count_right = count_left = 0; - for(uint i=0;iaccess(i)) { - rightarr[count_right++]=symbols[i+left]; - } - else { - leftarr[count_left++]=symbols[i+left]; - } - } -*/ for (uint i=0;iis_set(symbols[i+left], l)) - { - std::cout << symbols[i+left] << " != " << leftarr[i] << " lev = " << l << "\n"; - exit(0); - } - for (uint i=count_left;iis_set(symbols[i+left],l)) - std::cout << symbols[i+left] << " != " << rightarr[i-count_left] << " lev = " << l << "\n"; - */ bool match_left = true, match_right = true; for (uint i=1; i < count_left; i++) if (symbols[i+left] != symbols[i+left-1]) @@ -301,42 +207,22 @@ uint wt_node_internal::access(uint pos) { // Returns the value at given position and its rank uint wt_node_internal::access(uint pos, uint &rank) { - // p is the internal node we are pointing our finger at each step - wt_node_internal *p = this; - - while(1) + bool is_set = bitmap->access(pos); + if(!is_set) { - bool is_set = p->bitmap->access(pos); -// cout << "is_set = " << is_set << ", pos = " << pos << ", rank0 = " << bitmap->rank0(pos) << ", rank1 = " << bitmap->rank1(pos) << endl; - if(!is_set) - { - // recurse left - pos = p->bitmap->rank0(pos)-1; - wt_node_internal *tmp = dynamic_cast(p->left_child); - if (tmp == NULL) - { - // it's a leaf - rank = pos+1; - return p->left_child->access(0); - } - p = tmp; // new internal node - } - else - { - // recurse right - pos = p->bitmap->rank1(pos)-1; - wt_node_internal *tmp = dynamic_cast(p->right_child); - if (tmp == NULL) - { - // it's a leaf - rank = pos+1; - return p->right_child->access(0); - } - p = tmp; // new internal node - } + // recurse left + pos = bitmap->rank0(pos)-1; + return left_child->access(pos, rank); + } + else + { + // recurse right + pos = bitmap->rank1(pos)-1; + return right_child->access(pos, rank); } } + void wt_node_internal::access(vector &result, uint i, uint j, uint min, uint max, uint l, uint pivot) { uint symbol = pivot | (1 << l);