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(); }