public Queue<List<Double>> findNeighbors(int k, List<Double> point) { Queue<List<Double>> pointsN = getPointsQueue(point); Queue<BallNode> ballsQueueQ = getBallsQueue(point); ballsQueueQ.add(root); while (!ballsQueueQ.isEmpty()) { BallNode ballS = ballsQueueQ.poll(); if (pointsN.size() >= k) { if (ballS.distanceTo(point) > distance(pointsN.peek(), point)) { return pointsN; } } if (ballS.isLeaf()) { for (List<Double> p : ballS.points.getData()) { pointsN.add(p); } while (pointsN.size() > k) { pointsN.poll(); } } else { ballsQueueQ.add(ballS.left); ballsQueueQ.add(ballS.right); } } return pointsN; }
public BallTree(Matrix points, int k) { root = BallNode.buildBallNode(points, k); }