From 21491b20cfb4fa3c346a1f1754acdd5dc4d5aa4a Mon Sep 17 00:00:00 2001 From: Schankula Christopher <schankuc@mcmaster.ca> Date: Sun, 4 Mar 2018 15:47:47 -0500 Subject: [PATCH] very first minimally working (for building) KD tree, search next --- src/sandbox/Point.java | 29 +++++++++++++ src/sort/KDT.java | 90 +++++++++++++++++++++++++++++++++++++++++ src/sort/MergeSort.java | 2 +- 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/sandbox/Point.java create mode 100644 src/sort/KDT.java diff --git a/src/sandbox/Point.java b/src/sandbox/Point.java new file mode 100644 index 0000000..0fa4f16 --- /dev/null +++ b/src/sandbox/Point.java @@ -0,0 +1,29 @@ +package sandbox; + +public class Point implements Comparable<Point> { + private final int x; + private final int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + public String toString() { + return String.format("(%d,%d)", x, y); + } + + @Override + public int compareTo(Point o) { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/src/sort/KDT.java b/src/sort/KDT.java new file mode 100644 index 0000000..5d18b3d --- /dev/null +++ b/src/sort/KDT.java @@ -0,0 +1,90 @@ +package sort; + +import sandbox.Point; +import java.util.ArrayList; + +public class KDT<KeyVal extends Comparable<KeyVal>> { + Node root; + ArrayList<GeneralCompare<KeyVal>> axes; + + public static void main(String[] args) { + GeneralCompare<Point> compX = (p1, p2) -> ((Point) p1).getX() - ((Point) p2).getX(); + GeneralCompare<Point> compY = (p1, p2) -> ((Point) p1).getY() - ((Point) p2).getY(); + + //(2,3), (4,7), (5,4), (7,2), (8,1), (9,6) + //(8,1), (7,2), (2,3), (5,4), (9,6), (4,7) + Point p1 = new Point(2,3); + Point p2 = new Point(5,4); + Point p3 = new Point(9,6); + Point p4 = new Point(4,7); + Point p5 = new Point(8,1); + Point p6 = new Point(7,2); + + ArrayList<GeneralCompare<Point>> axes = new ArrayList<GeneralCompare<Point>>(); + axes.add(compX); + axes.add(compY); + + Point[] pts = {p1, p2, p3, p4, p5, p6}; + + KDT<Point> kdt = new KDT(axes, pts); + System.out.println(kdt.size()); + System.out.println(kdt.height()); + } + + private class Node{ + private KeyVal keyval; + private Node left, right; + private int n; + + public Node(KeyVal keyval, int n) { + this.keyval = keyval; + this.n = n; + } + } + + public KDT(ArrayList<GeneralCompare<KeyVal>> axes, Comparable<KeyVal>[] keyvals) { + this.axes = axes; + root = buildTree(keyvals, 0, keyvals.length - 1, 0); + } + + private Node buildTree(Comparable<KeyVal>[] keyvals, int lo, int hi, int depth) { + if (lo > hi) return null; + int axis = depth % getK(); + + int mid = (lo + hi) / 2; + MergeSort.sort(keyvals, lo, hi, axes.get(axis)); + KeyVal median = (KeyVal) keyvals[mid]; + + System.out.println(median); + + //TODO: fix size + Node newNode = new Node(median, 0); + newNode.left = buildTree(keyvals, lo, mid - 1, depth + 1); + newNode.right = buildTree(keyvals, mid + 1, hi, depth + 1); + + newNode.n = size(newNode.left) + size(newNode.right) + 1; + return newNode; + } + + public int size() { + return size(root); + } + + public int height() { + return height(root); + } + + private int height(Node x) { + if (x == null) return 0; + return 1 + Math.max(height(x.left), height(x.right)); + } + + private int size(Node x) { + if (x == null) return 0; + else return x.n; + } + + public int getK() { + return axes.size(); + } +} diff --git a/src/sort/MergeSort.java b/src/sort/MergeSort.java index 7f80c52..defaccf 100644 --- a/src/sort/MergeSort.java +++ b/src/sort/MergeSort.java @@ -37,7 +37,7 @@ public class MergeSort{ int mid = lo + (n/2); // Fill auxiliary array - System.out.println("lo, mid, hi: " + lo + ", " + mid + ", " + hi); + //System.out.println("lo, mid, hi: " + lo + ", " + mid + ", " + hi); for(int k = lo; k <= hi; k++){ aux[k] = x[k]; -- GitLab