Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static int[][] findClosest(int[][] points) {
- int[][] res;
- int[][] pointsSortedByLex = sortByLex(points);
- int[] p = duplicates(pointsSortedByLex);
- if (p == null)
- res = findClosestRecursive(pointsSortedByLex);
- else {
- res = new int[1][];
- res[0] = p;
- }
- return res;
- }
- public static int[][] findClosestRecursive(int[][] points) {
- int[][] res = null;
- int[][] ans=new int[2][2];
- int [][] pointsSortedByLexLeft=new int[points.length/2][2];
- int [][] pointsSortedByLexRight=new int[points.length-pointsSortedByLexLeft.length][2];
- double d=0;
- double Mx=0;
- if(points==null || points.length<2)
- return res;
- else if(points.length<=4)
- ans=findClosestSimple(points);
- else
- {
- for(int i=0; i<pointsSortedByLexLeft.length; i++)
- {
- pointsSortedByLexLeft[i]=points[i];
- }
- for(int j=0; j<pointsSortedByLexRight.length; j++)
- {
- pointsSortedByLexRight[j]=points[pointsSortedByLexLeft.length+j];
- }
- int[][] closestPair1 = findClosestRecursive(pointsSortedByLexLeft);
- int[][] closestPair2 = findClosestRecursive(pointsSortedByLexRight);
- if(distance(closestPair1[0],closestPair1[1])>distance(closestPair2[0],closestPair2[1]))
- {
- d=distance(closestPair2[0],closestPair2[1]);
- ans[0]=closestPair2[0];
- ans[1]=closestPair2[1];
- }
- else
- {
- d=distance(closestPair1[0],closestPair1[1]);
- ans[0]=closestPair1[0];
- ans[1]=closestPair1[1];
- }
- Mx=pointsSortedByLexRight[0][0];
- int[][] middle=sortByY(filterPointsByRange(Mx-d,Mx+d,points));
- for(int s=0; s<middle.length; s++)
- {
- for(int a=s+1;a<middle.length; a++)
- {
- if(distance(middle[s],middle[a])<d)
- {
- ans[0]=middle[s];
- ans[1]=middle[a];
- }
- }
- }
- }
- return ans;
- }
Add Comment
Please, Sign In to add comment