Example #1
0
PermutationMRRR::PermutationMRRR(Array *perm, cds_word rate) {
	this->permutation_ = perm;
	Array *visited = Array::Create(perm->GetLength(), 1);
	visited->Use();

	Array *sampled = Array::Create(perm->GetLength(), 1);
	sampled->Use();
	vector<cds_word> sampled_values;
	for (cds_word i = 0; i < perm->GetLength(); i++) {
		if (visited->GetField(i)) continue;
	
		bool added = false;
		cds_word last = i;
		visited->SetField(i, 1);
		cds_word pos = perm->GetField(i);
		cds_word count = 1;
		while (pos != i) {
			visited->SetField(pos, 1);
			if (count == rate) {
				added = true;
				sampled_values.push_back(last);
				sampled->SetField(pos, 1);
				last = pos;
				count = 0;
			}
			pos = perm->GetField(pos);
			count++;
		}
		if (added) {
			sampled->SetField(pos, 1);
			sampled_values.push_back(last);
		}
	}
	sampled_ = new BitSequenceOneLevelRank(sampled, 20);
	sampled_->Use();
	rev_links_ = Array::Create(sampled_values);
	rev_links_->Use();

	visited->Unuse();
	sampled->Unuse();
}