public KnrSeqSearch GetSortedByPrefix(SequenceBuilder seq_builder = null, ListIBuilder list_builder = null)
{
int n = this.DB.Count;
var seqs = new int[n][];
var perm = new int[n];
for (int i = 0; i < n; ++i) {
seqs [i] = this.GetStoredKnr (i);
perm [i] = i;
}
// please speed up this method using another sorting method
// Sorting.Sort<int> (perm, (x,y) => StringSpace<int>.LexicographicCompare (seqs [x], seqs [y]));
Sorting.Sort<int[],int> (seqs, perm, (x,y) => SeqSpace<int>.LexicographicCompare (x, y));
var S = new ListGen<int> ((int i) => seqs [i / this.K] [i % this.K], n * this.K);
if (list_builder == null) {
list_builder = ListIBuilders.GetListIFS();
}
if (seq_builder == null) {
seq_builder = SequenceBuilders.GetSeqXLB_DiffSet64(24, 63);
}
var knr = new KnrSeqSearch();
knr.DB = new SampleSpace("", this.DB, list_builder(perm, n-1));
knr.K = this.K;
knr.MAXCAND = this.MAXCAND;
knr.R = this.R;
knr.SEQ = seq_builder(S, this.R.DB.Count);
return knr;
}