mramine364

closestpair.java

Jan 6th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1.  
  2. package compute;
  3.  
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.Collections;
  7. import java.util.Comparator;
  8.  
  9. public class closestpair {
  10.  
  11. public static point[] naive(point[] pts){
  12. return _naive(pts, 0, pts.length-1);
  13. }
  14. public static point[] _naive(point[] pts, int s, int e){
  15. point[] is = new point[2];
  16. double minDist = Double.MAX_VALUE;
  17. for(int i=s;i<=e-1;i++){
  18. for(int j=i+1;j<=e;j++){
  19. double d = point.dist(pts[i], pts[j]);
  20. if( minDist>d ){
  21. minDist=d;
  22. is[0] = pts[i];
  23. is[1] = pts[j];
  24. }
  25. }
  26. }
  27. return is;
  28. }
  29.  
  30. public static point[] divideAndConquer(point[] pts){
  31. Arrays.sort(pts, (point o1, point o2) -> {
  32. if( o1.x<o2.x )
  33. return -1;
  34. if( o1.x==o2.x )
  35. return 0;
  36. return 1;
  37. });
  38. return _divideAndConquer(pts, 0, pts.length-1);
  39. }
  40. public static point[] _divideAndConquer(point[] pts, int s, int e){
  41. if(e-s+1<4){
  42. return _naive(pts, s, e);
  43. }
  44.  
  45. double xmid;
  46. int nmid=(e+s)/2;
  47. if((e-s+1)%2==0){
  48. xmid = (pts[(e-s)/2].x+pts[(e-s)/2+1].x)/2;
  49. }else{
  50. xmid = pts[(e-s)/2].x;
  51. }
  52.  
  53. point[] res;
  54. point[] ptsl = _divideAndConquer(pts, s, nmid);
  55. point[] ptsr = _divideAndConquer(pts, nmid+1, e);
  56.  
  57. double minl = point.dist(ptsl[0], ptsl[1]);
  58. double minr = point.dist(ptsr[0], ptsr[1]);
  59. double minrl;
  60. if(minl<minr){
  61. minrl = minl;
  62. res = ptsl;
  63. }else{
  64. minrl = minr;
  65. res = ptsr;
  66. }
  67.  
  68. ArrayList<point> alp = new ArrayList<>();
  69. for(int i=s;i<=e;i++){
  70. if( Math.abs(pts[i].x-xmid)<minrl )
  71. alp.add(pts[i]);
  72. }
  73. Collections.sort(alp, new Comparator<point>() {
  74. @Override
  75. public int compare(point o1, point o2) {
  76. if( o1.y<o2.y )
  77. return -1;
  78. if( o1.y==o2.y )
  79. return 0;
  80. return 1;
  81. }
  82. });
  83.  
  84. for(int i=0;i<alp.size();i++){
  85. int j = i+1;
  86. point pti=alp.get(i), ptj;
  87. while( j<alp.size() && Math.abs(pti.y-(ptj=alp.get(j)).y)<minrl ){
  88. double tdist = point.dist(pti, ptj);
  89. if( tdist < minrl ){
  90. minrl = tdist;
  91. res[0] = pti;
  92. res[1] = ptj;
  93. }
  94. j++;
  95. }
  96. }
  97. return res;
  98. }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment