- 问题描述:
设平面上有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)
{
return a.x < b.x