X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=BSGAP.cpp;h=4a3d1c638f6f722981da99f733a39a50406fbe62;hb=663cd2f6cc5e3796d001e8c527de0aea8c8bbf68;hp=9a25b75afc0a66682c829249cc11627ddf02fd03;hpb=7978e8c6c2d1c4e22faabd542c612c298f675101;p=SXSI%2FTextCollection.git diff --git a/BSGAP.cpp b/BSGAP.cpp index 9a25b75..4a3d1c6 100644 --- a/BSGAP.cpp +++ b/BSGAP.cpp @@ -62,7 +62,9 @@ BSGAP::BSGAP(ulong *B, ulong u_, bool freeB, ulong sampleRate) ulong **tempP = new ulong * [n / b + 1]; ulong *bitsInBSD = new ulong [n / b + 1]; ulong totalBits = 0; - this->firstKeyA = new BlockArray(n/b + 1, Tools::CeilLog2(this->u)); + // Number of nodes: + this->topCount = n%b ? n/b + 1: n/b; + this->firstKeyA = new BlockArray(topCount, Tools::CeilLog2(this->u)); for (ulong i = 0; i < n/b; i ++) { @@ -101,11 +103,10 @@ BSGAP::BSGAP(ulong *B, ulong u_, bool freeB, ulong sampleRate) (*firstKeyA)[n/b] = firstKey; } - // Number of nodes: - this->topCount = n%b ? n/b + 1: n/b; - // Catenate binary trees into one bitvector this->P = new ulong[totalBits/W + 1]; + for (ulong i = 0; i < totalBits/W + 1; ++i) + P[i] = 0; this->bitsInP = totalBits; ulong offset = 0; for (ulong i = 0; i < this->topCount ; ++i) @@ -574,6 +575,8 @@ ulong * BSGAP::GetSubtree(ulong *B, ulong firstKey, ulong l, ulong r, ulong n, b // bits is the sum of keyBits, jumpBits, leftBits and rightBits bits = keyBits + jumpBits + leftBits + rightBits; ulong *output = new ulong[bits / W + 1]; + for (ulong i = 0; i < bits/W+1; ++i) + output[i] = 0; /** * Write "output" @@ -732,9 +735,9 @@ void BSGAP::Save(FILE *file) const for (ulong offset = 0; offset < bitsInP/W+1; offset ++) { - if (std::fwrite(this->P+offset, sizeof(ulong), 1, file) != 1) + if (std::fwrite((this->P)+offset, sizeof(ulong), 1, file) != 1) throw std::runtime_error("BSGAP::Save(): file write error (P)."); - } + } if (std::fwrite(&(this->b), sizeof(unsigned), 1, file) != 1) throw std::runtime_error("BSGAP::Save(): file write error (b).");