Advertisement
Guest User

Untitled

a guest
Jul 19th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. public static class Pt {
  2. public final int x;
  3. public final int y;
  4. public static final Comparator<Pt> sortX = new compareX();
  5. public static final Comparator<Pt> sortY = new compareY();
  6.  
  7. public Pt(int x, int y){
  8. this.x = x;
  9. this.y = y;
  10. }
  11.  
  12. private static class compareX implements Comparator<Pt>{
  13. public int compare(Pt o1, Pt o2) {
  14. if (o1.x < o2.x) return -1;
  15. if (o1.x > o2.x) return +1;
  16. return 0;
  17. }
  18. }
  19.  
  20. private static class compareY implements Comparator<Pt>{
  21. public int compare(Pt o1, Pt o2) {
  22. if (o1.y < o2.y) return -1;
  23. if (o1.y > o2.y) return +1;
  24. return 0;
  25. }
  26. }
  27.  
  28. }
  29.  
  30. private static double distance(Pt a, Pt b){
  31. double xDiff = a.x + b.x;
  32. double yDiff = a.y + b.y;
  33. return Math.sqrt(xDiff * xDiff + yDiff * yDiff);
  34. }
  35.  
  36. private static Pt[] bruteForce(Pt[] sortByX, Pt[] sortByY){
  37. double min = distance(sortByX[0],sortByX[1]);
  38. Pt[] pair = new Pt[2];
  39. pair[0] = sortByX[0];
  40. pair[1] = sortByX[1];
  41. for (int i = 0;i < sortByX.length;i++){
  42. for (int j = i + 1;j < sortByX.length;j++){
  43. double dist1 = distance(sortByX[i],sortByX[j]);
  44. double dist2 = distance(sortByY[i],sortByY[j]);
  45. if (dist1 < min) {
  46. min = dist1;
  47. pair[0] = sortByX[i];
  48. pair[1] = sortByX[j];
  49. }
  50.  
  51. if (dist2 < min) {
  52. min = dist1;
  53. pair[0] = sortByY[i];
  54. pair[1] = sortByY[j];
  55. }
  56. }
  57. }
  58. return pair;
  59. }
  60.  
  61. public static void closestPair(Pt[] P){
  62. Pt[] sortByX = new Pt[P.length];
  63. Pt[] sortByY = new Pt[P.length];
  64. for (int i = 0;i < P.length;i++){
  65. sortByX[i] = P[i];
  66. sortByY[i] = P[i];
  67. }
  68. Arrays.sort(sortByX, Pt.sortX);
  69. Arrays.sort(sortByY, Pt.sortY);
  70.  
  71. Pt[] points = closest(sortByX, sortByY);
  72. List<Pt> listP = new ArrayList<>(Arrays.asList(P));
  73.  
  74. System.out.print(listP.indexOf(points[0])+ " " + listP.indexOf(points[1]) + " ");
  75. System.out.printf("%.6f\n", distance(points[0], points[1]));
  76. }
  77.  
  78. private static Pt[] closest(Pt[] sortByX, Pt[] sortByY){
  79. if (sortByX.length <=3)
  80. return bruteForce(sortByX, sortByY);
  81.  
  82. Pt[] pair;
  83. double min;
  84. int center = sortByX.length / 2;
  85.  
  86. Pt[] leftHalfX = new Pt[center];
  87. Pt[] rightHalfX = new Pt[sortByX.length - center];
  88.  
  89. Pt[] leftHalfY = new Pt[center];
  90. Pt[] rightHalfY = new Pt[sortByX.length - center];
  91.  
  92. for (int i = 0;i < center;i++){
  93. leftHalfX[i] = sortByX[i];
  94. leftHalfY[i] = sortByY[i];
  95. }
  96.  
  97. for (int i = center;i < sortByX.length;i++){
  98. rightHalfX[i-center] = sortByX[i];
  99. rightHalfY[i-center] = sortByY[i];
  100. }
  101.  
  102.  
  103. Pt[] pair1 = closest(leftHalfX, leftHalfY);
  104. double min1 = distance(pair1[0],pair1[1]);
  105. Pt[] pair2 = closest(rightHalfX, rightHalfY);
  106. double min2 = distance(pair2[0],pair2[1]);
  107.  
  108.  
  109. if (min1 < min2) {
  110. pair = pair1;
  111. min = min1;
  112. }else{
  113. pair = pair2;
  114. min = min2;
  115. }
  116.  
  117. ArrayList<Pt> filtered = new ArrayList<Pt>();
  118. double leftBoundary = sortByX[center].x - min;
  119. double rightBoundary = sortByX[center].x + min;
  120. for (int i = 0; i<sortByY.length; i++){
  121. if (leftBoundary < sortByY[i].x && sortByY[i].x < rightBoundary){
  122. filtered.add(sortByY[i]);
  123. }
  124. }
  125.  
  126. for (int i = 0; i < (filtered.size()-1);i++){
  127. for (int j = i + 1; j < Math.min(filtered.size(), i + 7);j++){
  128. double dist = distance(filtered.get(i),filtered.get(j));
  129. if (dist < min){
  130. min = dist;
  131. pair[0] = filtered.get(i);
  132. pair[1] = filtered.get(j);
  133. }
  134. }
  135. }
  136. return pair;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement