-
Vojtech Moravec authoredVojtech Moravec authored
KDTree.java 2.60 KiB
package azgracompress.kdtree;
import java.util.Arrays;
public class KDTree {
private final int maximumBucketSize;
private final KDNode root;
private final int dimension;
private final int totalNodeCount;
private final int terminalNodeCount;
public static class SearchInfo {
private double currentClosestDistance;
private int[] currentClosestRecord = null;
private final double[] coordinateUpperBound;
private final double[] coordinateLowerBound;
private final int dimension;
public SearchInfo(final int dimension) {
this.dimension = dimension;
currentClosestDistance = Double.POSITIVE_INFINITY;
coordinateUpperBound = new double[dimension];
coordinateLowerBound = new double[dimension];
Arrays.fill(coordinateLowerBound, Double.NEGATIVE_INFINITY);
Arrays.fill(coordinateUpperBound, Double.POSITIVE_INFINITY);
}
public int getDimension() {
return dimension;
}
public double getCurrentClosestDistance() {
return currentClosestDistance;
}
public void setCurrentClosestDistance(double currentClosestDistance) {
this.currentClosestDistance = currentClosestDistance;
}
public int[] getCurrentClosestRecord() {
return currentClosestRecord;
}
public void setCurrentClosestRecord(int[] currentClosestRecord) {
this.currentClosestRecord = currentClosestRecord;
}
public double[] getUpperBounds() {
return coordinateUpperBound;
}
public double[] getLowerBounds() {
return coordinateLowerBound;
}
}
public KDTree(final KDNode root,
final int dimension,
final int maximumBucketSize,
final int totalNodeCount,
final int terminalNodeCount) {
this.root = root;
this.dimension = dimension;
this.maximumBucketSize = maximumBucketSize;
this.totalNodeCount = totalNodeCount;
this.terminalNodeCount = terminalNodeCount;
}
public int[] findNearestNeighbor(final int[] queryRecord) {
// TODO(Moravec): Read more about Ball Within Bounds and Bounds Overlap Ball
SearchInfo searchInfo = new SearchInfo(dimension);
root.findNearestNeighbor(queryRecord, searchInfo);
return searchInfo.currentClosestRecord;
}
public int getTotalNodeCount() {
return totalNodeCount;
}
public int getTerminalNodeCount() {
return terminalNodeCount;
}
}