diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2013-03-27 15:11:57 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2013-11-15 17:38:45 +0100 |
commit | 0dd53be15a7eeef79d1161235936a085470d307d (patch) | |
tree | ac4026dd7c13370cd2549aefd56f5a5ba9360db5 | |
parent | 9b8ff0651bc618d2edf2cd7de609f6ec5ccf8e0b (diff) | |
download | coursera-0dd53be15a7eeef79d1161235936a085470d307d.zip coursera-0dd53be15a7eeef79d1161235936a085470d307d.tar.gz |
Algorithms-I : 5-KdTrees: super fast
-rw-r--r-- | Algorithms/Part-I/5-KdTrees/KdTree.java | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/Algorithms/Part-I/5-KdTrees/KdTree.java b/Algorithms/Part-I/5-KdTrees/KdTree.java index 6a13d16..3607976 100644 --- a/Algorithms/Part-I/5-KdTrees/KdTree.java +++ b/Algorithms/Part-I/5-KdTrees/KdTree.java @@ -9,7 +9,6 @@ public class KdTree private Node root; private int size; - NearestChampion ncp; private class Node { private Point2D p; @@ -21,22 +20,11 @@ public class KdTree } } - private class NearestChampion { - private Point2D p; - private double d; - public NearestChampion(Point2D p, double d) - { - this.p = p; - this.d = d; - } - } - // construct an empty tree of points public KdTree() { size = 0; root = null; - ncp = new NearestChampion(null, Double.MAX_VALUE); } // is the tree empty? @@ -201,57 +189,67 @@ public class KdTree { if ((p == null) || (root == null)) return null; - ncp.p = null; - ncp.d = Double.MAX_VALUE; - nearest(root, p, ncp, true); - - return ncp.p; + return nearest(root, p, null, Double.MAX_VALUE, true); } - private void nearest(Node n, Point2D p, NearestChampion ncp, boolean vsplit) + private Point2D nearest(Node n, Point2D p, Point2D ncp, double d, boolean vsplit) { double d2 = p.distanceSquaredTo(n.p); - if (d2 < ncp.d) + if (d2 < d) { - ncp.d = d2; - ncp.p = n.p; + ncp = n.p; + d = d2; } + if (vsplit) { - double d3 = n.p.x() - p.x(); - if (d3 > 0) + d2 = n.p.x() - p.x(); + if (d2 > 0) { if (n.left != null) - nearest(n.left, p, ncp, !vsplit); - if (n.right != null && ((d3 * d3) < ncp.d)) - nearest(n.right, p, ncp, !vsplit); + { + ncp = nearest(n.left, p, ncp, d, !vsplit); + d = p.distanceSquaredTo(ncp); + } + if (n.right != null && ((d2 * d2) < d)) + ncp = nearest(n.right, p, ncp, d, !vsplit); } else { if (n.right != null) - nearest(n.right, p, ncp, !vsplit); - if (n.left != null && ((d3 * d3) < ncp.d)) - nearest(n.left, p, ncp, !vsplit); + { + ncp = nearest(n.right, p, ncp, d, !vsplit); + d = p.distanceSquaredTo(ncp); + } + if (n.left != null && ((d2 * d2) < d)) + ncp = nearest(n.left, p, ncp, d, !vsplit); } } else { - double d3 = n.p.y() - p.y(); - if (d3 > 0) + d2 = n.p.y() - p.y(); + if (d2 > 0) { if (n.left != null) - nearest(n.left, p, ncp, !vsplit); - if (n.right != null && ((d3 * d3) < ncp.d)) - nearest(n.right, p, ncp, !vsplit); + { + ncp = nearest(n.left, p, ncp, d, !vsplit); + d = p.distanceSquaredTo(ncp); + } + if (n.right != null && ((d2 * d2) < d)) + ncp = nearest(n.right, p, ncp, d, !vsplit); } else { if (n.right != null) - nearest(n.right, p, ncp, !vsplit); - if (n.left != null && ((d3 * d3) < ncp.d)) - nearest(n.left, p, ncp, !vsplit); + { + ncp = nearest(n.right, p, ncp, d, !vsplit); + d = p.distanceSquaredTo(ncp); + } + if (n.left != null && ((d2 * d2) < d)) + ncp = nearest(n.left, p, ncp, d, !vsplit); } } + return ncp; } } |