/** * Partition the points based on their distance to origin around the selected pivot. * @param left range start * @param right range end (exclusive) * @param pivot pivot for the partition * @param origin origin to compute the distance to * @return index of the pivot */ private int partitionItems(int left, int right, int pivot, double[] origin) { double pivotDistance = distance(origin, items[pivot]); listSwap(items, pivot, right - 1); listSwap(indexes, pivot, right - 1); int storeIndex = left; for (int i = left; i < right - 1; i++) { if (distance(origin, items[i]) <= pivotDistance) { listSwap(items, i, storeIndex); listSwap(indexes, i, storeIndex); storeIndex++; } } listSwap(items, storeIndex, right - 1); listSwap(indexes, storeIndex, right - 1); return storeIndex; }
/** * Partition the points based on their distance to origin around the selected pivot. * @param left range start * @param right range end (exclusive) * @param pivot pivot for the partition * @param origin origin to compute the distance to * @return index of the pivot */ private int partitionItems(int left, int right, int pivot, double[] origin) { double pivotDistance = distance(origin, items[pivot]); listSwap(items, pivot, right - 1); listSwap(indexes, pivot, right - 1); int storeIndex = left; for (int i = left; i < right - 1; i++) { if (distance(origin, items[i]) <= pivotDistance) { listSwap(items, i, storeIndex); listSwap(indexes, i, storeIndex); storeIndex++; } } listSwap(items, storeIndex, right - 1); listSwap(indexes, storeIndex, right - 1); return storeIndex; }
/** * Builds the tree from a set of points by recursively partitioning * them according to a random pivot. * @param lower start of range * @param upper end of range (exclusive) * @return root of the tree or null if lower == upper */ private Node buildFromPoints(int lower, int upper) { if (upper == lower) { return null; } final Node node = new Node(); node.index = lower; if (upper - lower > 1) { // choose an arbitrary vantage point and move it to the start int i = random.nextInt(upper - lower - 1) + lower; listSwap(items, lower, i); listSwap(indexes, lower, i); int median = (upper + lower + 1) / 2; // partition around the median distance // TODO: use the QuickSelect class? nthElement(lower + 1, upper, median, items[lower]); // what was the median? node.threshold = distance(items[lower], items[median]); node.index = lower; node.left = buildFromPoints(lower + 1, median); node.right = buildFromPoints(median, upper); } return node; }
/** * Builds the tree from a set of points by recursively partitioning * them according to a random pivot. * @param lower start of range * @param upper end of range (exclusive) * @return root of the tree or null if lower == upper */ private Node buildFromPoints(int lower, int upper) { if (upper == lower) { return null; } final Node node = new Node(); node.index = lower; if (upper - lower > 1) { // choose an arbitrary vantage point and move it to the start int i = random.nextInt(upper - lower - 1) + lower; listSwap(items, lower, i); listSwap(indexes, lower, i); int median = (upper + lower + 1) / 2; // partition around the median distance // TODO: use the QuickSelect class? nthElement(lower + 1, upper, median, items[lower]); // what was the median? node.threshold = distance(items[lower], items[median]); node.index = lower; node.left = buildFromPoints(lower + 1, median); node.right = buildFromPoints(median, upper); } return node; }