【解题报告】最近点对问题 算法设计与分析 分治算法 openjudge

问题描述: 设平面上有N个点,求最近的两个点之间的距离(欧氏距离)。解题思路:典型的用分治思想来解决的问题。 如果采用简单暴力的方法,那么容易得出复杂度为O(n^2), 而采用分治的方法,将所有的点划分为两部分,分别解两部分内部的最短距离, 再考虑交叉部分的情况。由于距离的限制每个点只需要判断常数次。(可以参看《算法设计与分析》上的讲解,不具体展开) 如果每次找出交叉部分,然后直接...
摘要由CSDN通过智能技术生成
  • 问题描述:
    设平面上有N个点,求最近的两个点之间的距离(欧氏距离)。
  • 解题思路:
  • 典型的用分治思想来解决的问题。
    如果采用简单暴力的方法,那么容易得出复杂度为O(n^2),
    而采用分治的方法,将所有的点划分为两部分,分别解两部分内部的最短距离,
    再考虑交叉部分的情况。由于距离的限制每个点只需要判断常数次。(可以参看《算法设计与分析》上的讲解,不具体展开)
    如果每次找出交叉部分,然后直接进行排序并进一步选点的话,加上的nlogn复杂度会使得整个算法的复杂度为nlognlogn
    而我们的目标是进行优化,使得处理交叉部分情况所花费的时间降到n级,这样整体的时间复杂度就可以降到O(nlogn)
    做法是利用归并排序的思想,由于整个分治的过程很类似于做归并的过程,以此来达成比较高效的对y排序。

以下给出AC代码,常数和空间都没怎么优化,不过注释还是在关键的地方有给出的

#include <iostream>
#include<string.h>
#include<algorithm>
#include <cmath>
#include<iomanip>
using namespace std;
int n; //总共的点数
struct node
{
    double x;
    double y;
};
node s[1000001];
node tempC[100001];//用于临时比较的辅助数组
node ta[1000001];
double Distance(node a, node b) {
    return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}
bool cmp1(node a, node b) //按x从小到大排序
{
    return a.x < b.x
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值