public override IResult SearchKNN(object q, int K, IResult final_result)
{
var window = 2;
if (this.Vertices.Count > 16) {
window = 4;
}
var prev = double.MaxValue;
var curr = 0.0;
var inserted = new HashSet<int> ();
var expanded = new HashSet<int> ();
while (prev > curr) {
prev = final_result.CoveringRadius;
for (int i = 0; i < window; ++i) {
var res = new Result (K);
var next = this.rand.Next (this.Vertices.Count);
if (expanded.Add(next)) {
this.GreedySearch (q, next, expanded, res);
foreach (var p in res) {
if (inserted.Add(p.ObjID)) {
final_result.Push(p.ObjID, p.Dist);
}
}
}
}
curr = final_result.CoveringRadius;
}
return final_result;
}