protected void GreedySearch(object q, int startID, HashSet<int> visited, IResult res)
{
visited.Add (startID);
res.Push (startID, this.DB.Dist (this.DB [startID], q));
var minDist = double.MaxValue;
int minItem;
var evaluated = new HashSet<int> ();
// visited is a global set containing nodes already expanded and explored
// evaluated is a local variable containing items already evaluated
// evaluated must be local to preserve diversity
do {
minItem = -1;
var adjList = this.Vertices[startID];
foreach (var objID in adjList) {
if (evaluated.Add(objID)) { // true iff it wasn't evaluated
var d = this.DB.Dist (this.DB [objID], q);
res.Push (objID, d);
if (minDist > d) {
minDist = d;
minItem = objID;
}
}
}
startID = minItem;
} while (minItem >= 0 && visited.Add(startID));
}