算法 分治 平面最近点对

本文介绍了平面最近点对问题,通过先按照x坐标排序,再利用分治法递归寻找最近点对,优化了暴力解法中的冒泡排序。中轴线的选择与点的数量有关,最终在限定距离范围内筛选出可能的最近点对。
摘要由CSDN通过智能技术生成

问题

平面最近点对问题是指:在给出的同一个平面内的所有点的坐标,然后找出这些点中最近的两个点的距离.

暴力法

//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;
}

拆分成左右两份

//如果大于23,可以再次拆分
List<Point> leftList = new ArrayList<>();
List<Point> rightList = new ArrayList<>();

//前半部分的点给leftList
for (int i = 0; i < size / 2; i++) {
    leftList.add(list.get(i));
}

//后半部分的点给<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值