问题
平面最近点对问题是指:在给出的同一个平面内的所有点的坐标,然后找出这些点中最近的两个点的距离.
暴力法
//1.暴力法 private static double force(List<Point> list) { int size = list.size(); double distance; double min = Double.MAX_VALUE; for (int i = 0; i < size; i++) { for (int j = i + 1; j < size; j++) { distance = dis(list.get(i), list.get(j)); if (distance < min) { min = distance; } } } return min; }分治法
先按照x坐标排序(冒泡法)
//分治前先排序 private static List<Point> bubbleSort(List<Point> list) { int size = list.size(); //原理就是依次浮到顶端,for循环中体现为依次把最小的浮到底端 for (int i = 0; i < size; i++) { for (int j = i + 1; j < size; j++) { Point a = list.get(i); Point b = list.get(j); if (a.x > b.x) { Collections.swap(list, i, j); } } } //我觉得肯定不可以按Y再排序依次,假如左右有两个最高点,近乎一样高 //分治:找左,找右,找小于d //找左中的 左,右,小于d;右中的 左,右小于d。。。 return list; }
拆分成左右两份
//如果大于2,3,可以再次拆分 List<Point> leftList = new ArrayList<>(); List<Point> rightList = new ArrayList<>(); //前半部分的点给leftList for (int i = 0; i < size / 2; i++) { leftList.add(list.get(i)); } //后半部分的点给<