Advertisement
Guest User

fak

a guest
Sep 30th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.30 KB | None | 0 0
  1. package s3;
  2.  
  3.  
  4. /*************************************************************************
  5.  *************************************************************************/
  6.  
  7. import edu.princeton.cs.algs4.In;
  8. import edu.princeton.cs.algs4.Out;
  9. import edu.princeton.cs.algs4.Point2D;
  10. import edu.princeton.cs.algs4.RectHV;
  11.  
  12. public class KdTree {
  13.     private Node root;
  14.    
  15.     private static class Node {
  16.         private Point2D p; // the point
  17.         private RectHV rect; // the axis-aligned rectangle corresponding to this node
  18.         private Node lb; // the left/bottom subtree
  19.         private Node rt; // the right/top subtree
  20.        
  21.         public Node(Point2D point, RectHV rect){
  22.             this.p = point;
  23.             this.rect = rect;
  24.         }
  25.     }
  26.     // construct an empty set of points
  27.     public KdTree() {
  28.     }
  29.  
  30.     // is the set empty?
  31.     public boolean isEmpty() {
  32.         return root == null;
  33.     }
  34.  
  35.     // number of points in the set
  36.     public int size() {
  37.         return size(root);
  38.     }
  39.  
  40.     private int size(Node node) {
  41.         if (node == null)
  42.             return 0;
  43.         else
  44.             return 1 + size(node.lb) + size(node.rt);
  45.     }
  46.  
  47.     // add the point p to the set (if it is not already in the set)
  48.     public void insert(Point2D p) {
  49.         root = insertAt(root, p, true, new RectHV(0.0, 0.0, 1.0, 1.0));
  50.     }
  51.  
  52.     private Node insertAt(Node node, Point2D p, boolean isX, RectHV rect) {
  53.         if (node == null){
  54.             return new Node(p, rect);
  55.         }
  56.        
  57.         double dist = Double.MAX_VALUE;
  58.        
  59.         if(isX)
  60.             dist = node.p.x() - p.x();
  61.         else
  62.             dist = node.p.y() - p.y();
  63.        
  64.            
  65.        
  66.         if (dist > 0)              
  67.             node.lb = insertAt(node.lb, p, !isX, shRect(node.p, rect, isX, true));
  68.         else if (dist < 0)
  69.             node.rt = insertAt(node.rt, p, !isX, shRect(node.p, rect, isX, false));
  70.         else if(dist == 0 && !node.p.equals(p)){
  71.             if(isX)
  72.                 dist = node.p.y() - p.y();
  73.             else
  74.                 dist = node.p.x() - p.x();
  75.            
  76.             if (dist > 0)
  77.                 node.lb = insertAt(node.lb, p, !isX, shRect(p, rect, isX, true));
  78.             else if (dist < 0)
  79.                 node.rt = insertAt(node.rt, p, !isX, shRect(p, rect, isX, false));
  80.         }
  81.         else
  82.             node.p = p;
  83.        
  84.         return node;
  85.     }
  86.  
  87.     private RectHV shRect(Point2D p, RectHV rect, boolean isX, boolean isLB) {
  88.         if (isLB){
  89.             if(isX){
  90.                 return new RectHV(rect.xmin(), rect.ymin(), p.x(), rect.ymax());
  91.             }else{
  92.                 return new RectHV(rect.xmin(), rect.ymin(), rect.xmax(), p.y());
  93.             }      
  94.         } else {
  95.             if(isX){
  96.                 return new RectHV(p.x(), rect.ymin(), rect.xmax(), rect.ymax());
  97.             }else{
  98.                 return new RectHV(rect.xmin(), p.y(), rect.xmax(), rect.ymax());
  99.             }
  100.         }
  101.     }
  102.  
  103.     // does the set contain the point p?
  104.     public boolean contains(Point2D p) {
  105.         return containsAt(root, p, true);
  106.     }
  107.  
  108.     private boolean containsAt(Node node, Point2D p, boolean isX) {
  109.         if (node == null)
  110.             return false;
  111.        
  112.         double dist;
  113.        
  114.         if (isX)
  115.             dist = node.p.x() - p.x();
  116.         else
  117.             dist = node.p.y() - p.y();
  118.        
  119.         if (node.p.equals(p))
  120.             return true;
  121.         else if (dist > 0)
  122.             return containsAt(node.lb, p, !isX);
  123.         else if (dist < 0)
  124.             return containsAt(node.rt, p, !isX);
  125.         else
  126.         {
  127.             if(isX)
  128.                 dist = node.p.y() - p.y();
  129.             else
  130.                 dist = node.p.x() - p.x();
  131.            
  132.             if (dist > 0)
  133.                 return containsAt(node.lb, p, !isX);
  134.             else if (dist < 0)
  135.                 return containsAt(node.rt, p, !isX);
  136.         }
  137.        
  138.         return false;
  139.     }
  140.  
  141.     // draw all of the points to standard draw
  142.     public void draw() {
  143.  
  144.     }
  145.  
  146.     // all points in the set that are inside the rectangle
  147.     public Iterable<Point2D> range(RectHV rect) {
  148.         return null;
  149.     }
  150.  
  151.     // a nearest neighbour in the set to p; null if set is empty
  152.     public Point2D nearest(Point2D p) {
  153.         if (isEmpty())
  154.             return null;
  155.         return nearest(root, p, root.p);
  156.     }
  157.  
  158.     private Point2D nearest(Node node, Point2D p, Point2D npoint) {
  159.         if (node == null)
  160.             return npoint;
  161.        
  162.         if (node.rect.distanceSquaredTo(p) <= npoint.distanceTo(p)){
  163.             if (node.p.distanceTo(p) < npoint.distanceTo(p))
  164.                 npoint = node.p;
  165.            
  166.             Point2D lb = nearest(node.lb, p, npoint);
  167.             Point2D rt = nearest(node.lb, p, npoint);
  168.            
  169.             if ((lb.distanceTo(p) < rt.distanceTo(p)) && (lb.distanceTo(p) < npoint.distanceTo(p)))
  170.                 return lb;
  171.             else if ((lb.distanceTo(p) > rt.distanceTo(p)) && (rt.distanceTo(p) < npoint.distanceTo(p)))
  172.                 return rt;
  173.             else
  174.                 return npoint;
  175.         }
  176.         else
  177.             return npoint;
  178.         /*
  179.         double dist = Double.MAX_VALUE;
  180.        
  181.         if (node.p.distanceTo(p) < npoint.distanceTo(p))
  182.             npoint = node.p;
  183.        
  184.         if(isX)
  185.             dist = node.p.x() - p.x();
  186.         else
  187.             dist = node.p.y() - p.y();
  188.        
  189.        
  190.         if (node.p.equals(p))
  191.             return node.p;
  192.        
  193.         if ((node.lb != null) && (node.rt != null)){
  194.             if (dist > 0){
  195.                     return nearest(node.lb, p, !isX, npoint);
  196.             }
  197.             else if(dist < 0)
  198.             {
  199.                 return nearest(node.rt, p, !isX, npoint);
  200.             }
  201.             else
  202.             {
  203.                 if(isX)
  204.                     dist = node.p.y() - p.y();
  205.                 else
  206.                     dist = node.p.x() - p.x();
  207.                
  208.                 if (dist > 0)
  209.                     return nearest(node.lb, p, !isX, npoint);
  210.                 else
  211.                     return nearest(node.rt, p, !isX, npoint);
  212.                    
  213.             }
  214.                
  215.         }
  216.         else if ((node.lb != null) && (node.rt == null)){
  217.             if (dist > 0)
  218.                 return nearest(node.lb, p, !isX, npoint);
  219.             else
  220.                 return npoint;
  221.         }
  222.         else if ((node.lb == null) && (node.rt != null)){
  223.             if (dist > 0)
  224.                 return npoint;
  225.             else
  226.                 return nearest(node.rt, p, !isX, npoint);
  227.         }
  228.         else
  229.             return npoint;
  230.             */
  231.     }
  232.  
  233.     public static void main(String[] args) {
  234.         In in = new In();
  235.         Out out = new Out();    
  236.         int N = in.readInt(), C = in.readInt(), T = 50;
  237.         Point2D[] queries = new Point2D[C];
  238.         KdTree tree = new KdTree();
  239.         out.printf("Inserting %d points into tree\n", N);
  240.         for (int i = 0; i < N; i++) {
  241.             tree.insert(new Point2D(in.readDouble(), in.readDouble()));
  242.         }
  243.         out.printf("tree.size(): %d\n", tree.size());
  244.         out.printf("Testing `nearest` method, querying %d points\n", C);
  245.  
  246.         for (int i = 0; i < C; i++) {
  247.             queries[i] = new Point2D(in.readDouble(), in.readDouble());
  248.             out.printf("%s: %s\n", queries[i], tree.nearest(queries[i]));
  249.         }
  250.         for (int i = 0; i < T; i++) {
  251.             for (int j = 0; j < C; j++) {
  252.                 tree.nearest(queries[j]);
  253.             }
  254.         }
  255.     }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement