示例#1
0
void test_temp(int len) {
	const std::vector<bool>& vec = bits_imbal(len);
	BitArray v;
	v = BitArrayBuilder::create(vec.size());
	v.fillzero();
	for (unsigned int i = 0; i < vec.size(); i++) {
		v.setbit(i, vec[i]);
	}
	Rank6p t;
	//Rank6pBuilder bd;
	Rank6pBuilder::build(v, &t);
	Rank6pHintSel rhs;
	rhs.init(v);

	unsigned int onecnt = 0;
	for (unsigned int i = 0; i < vec.size(); ++i)
		if (vec[i]) onecnt++;
	int last = -1;
	for (unsigned int i = 0; i < onecnt; ++i) {
		int pos = rhs.select(i);
		//int pos2 = t.select(i);
		if (pos >= vec.size() || !vec[pos] || pos <= last) {
			cout << "select " << i << "  " << rhs.select(i) << endl;
			if (i > 0) rhs.select(i-1);
			ASSERT(vec[pos] == true);
		}
		ASSERT(pos > last);
		last = pos;
	}
}
示例#2
0
BitArray find_pioneers(const BitArrayInterface* bp, size_t blksize) {
	std::vector<uint64_t> v = find_pioneers_v(bp, blksize);
	BitArray ret = BitArrayBuilder::create(bp->length());
	ret.fillzero();
	for (int i = 0; i < v.size(); i++)
		ret.setbit(v[i], true);
	return ret;
}
示例#3
0
void test_rank(const std::vector<bool>& vec) {
	vector<int> ranks(vec.size() + 1);
	ranks[0] = 0;
	for (unsigned int i = 1; i <= vec.size(); i++)
		if (vec[i-1]) ranks[i] = ranks[i-1] + 1;
		else ranks[i] = ranks[i-1];
		BitArray v;
		v = BitArrayBuilder::create(vec.size());
		//v.fillzero();
		for (unsigned int i = 0; i < vec.size(); i++) {
			v.setbit(i, vec[i]);
		}

		for (unsigned int i = 0; i < vec.size(); i++) {
			ASSERT(vec[i] == v.bit(i));
		}

		RankSelect r;
		RankSelect::BuilderTp::build(v, &r);
		for (unsigned int i = 0; i < vec.size(); ++i)
			ASSERT_EQ(vec[i], r.access(i));
		for (int i = 0; i <= vec.size(); ++i) {
			if (ranks[i] != r.rank(i)) {
				cout << "rank " << i << " " << ranks[i] << " " << r.rank(i) << endl;
				ASSERT_EQ(ranks[i], r.rank(i));
			}
		}
		unsigned int onecnt = 0;
		for (unsigned int i = 0; i < vec.size(); ++i)
			if (vec[i]) onecnt++;
		int last = -1;
		for (unsigned int i = 0; i < onecnt; ++i) {
			int pos = r.select(i);
			ASSERT_EQ(i, r.rank(pos));
			ASSERT_EQ(i + 1, r.rank(pos + 1));
			if (pos >= vec.size() || !vec[pos] || pos <= last) {
				cout << "select " << i << "  " << r.select(i) << endl;
				if (i > 0) r.select(i-1);
				ASSERT_EQ(true, vec[pos]);
			}
			ASSERT(pos > last);
			last = pos;
		}
		last = -1;
		for (unsigned int i = 0; i < vec.size() - onecnt; ++i) {
			int pos = r.selectzero(i);
			ASSERT_EQ(i, r.rankzero(pos)) << "pos =" << pos << "   i =" << i << "  len=" << r.length() << endl;
			ASSERT_EQ(i + 1, r.rankzero(pos + 1));
			ASSERT(pos < vec.size() && vec[pos] == false);
			ASSERT(pos > last);
			last = pos;
		}
}