经典问题之最近点对问题
2016-06-12 12:18
190 查看
解决问题:在平面内有n个点,求两两之间的最短距离。
题解:
1.枚举点,打擂台。O(n^2)
2.分治。先按x坐标排序,以中位数画一条线,将平面分成两个部分,对两个左右部分分别处理,然后合并。
合并:设总区间d=min{左区间d,右区间d}划分左右之后,按照y的大小归并两个区间的点坐标,然后以d为上届,刷去一些点,对于剩下的点直接左右互相算距离,打擂台即可。效率经证明为O(nlog n).
参考程序:
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#define maxn 21000
#define INF 0x7f7f7f7f
using namespace std;
int n;
struct Pair{
int x,y;
bool operator < (const Pair& rhs) const {
return x<rhs.x;
}
}loc[maxn];
bool cmp_y(Pair a,Pair b){
return a.y<b.y;
}
double closeset_pair(Pair *a,int n){
if (n<=1)return INF;
int m=n/2;
double x=a[m].x;
double d=min(closeset_pair(a,m),closeset_pair(a+m,n-m));
inplace_merge(a,a+m,a+n,cmp_y);
vector<Pair> b;
for (int i=0;i<n;i++){
if (fabs(a[i].x-x)>=d)continue;
for (int j=0;j<b.size();j++){
double dx=a[i].x-b[b.size()-j-1].x;
double dy=a[i].y-b[b.size()-j-1].y;
if (dy>=d)break;
d=min(d,sqrt(dx*dx+dy*dy));
}
b.push_back(a[i]);
}
return d;
}
int main(){
scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d%d",&loc[i].x,&loc[i].y);
sort(loc,loc+n);
printf("%f",closeset_pair(loc,n));
return 0;
}
题解:
1.枚举点,打擂台。O(n^2)
2.分治。先按x坐标排序,以中位数画一条线,将平面分成两个部分,对两个左右部分分别处理,然后合并。
合并:设总区间d=min{左区间d,右区间d}划分左右之后,按照y的大小归并两个区间的点坐标,然后以d为上届,刷去一些点,对于剩下的点直接左右互相算距离,打擂台即可。效率经证明为O(nlog n).
参考程序:
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#define maxn 21000
#define INF 0x7f7f7f7f
using namespace std;
int n;
struct Pair{
int x,y;
bool operator < (const Pair& rhs) const {
return x<rhs.x;
}
}loc[maxn];
bool cmp_y(Pair a,Pair b){
return a.y<b.y;
}
double closeset_pair(Pair *a,int n){
if (n<=1)return INF;
int m=n/2;
double x=a[m].x;
double d=min(closeset_pair(a,m),closeset_pair(a+m,n-m));
inplace_merge(a,a+m,a+n,cmp_y);
vector<Pair> b;
for (int i=0;i<n;i++){
if (fabs(a[i].x-x)>=d)continue;
for (int j=0;j<b.size();j++){
double dx=a[i].x-b[b.size()-j-1].x;
double dy=a[i].y-b[b.size()-j-1].y;
if (dy>=d)break;
d=min(d,sqrt(dx*dx+dy*dy));
}
b.push_back(a[i]);
}
return d;
}
int main(){
scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d%d",&loc[i].x,&loc[i].y);
sort(loc,loc+n);
printf("%f",closeset_pair(loc,n));
return 0;
}
相关文章推荐
- CodingNet - Learning - 8
- Sql server 2012 安装
- 封装ajax
- HTML/css琐碎
- 【Java编程】写入、读取、遍历Properties文件
- 第十六周学习进度表
- java程序员面试——Java并发编程知识点总结
- UITextField的基本使用
- Crank Storyboard Suite汽车仪表盘设计
- 使用原理视角看 Git
- SQL 左外连接,右外连接,全连接,内连接
- java移位运算
- 在微信中调用ajax出现的问题,XMLHttpRequest对象没有初始化
- 由xcode低版本升到高版本,程序出错
- myeclipse中tomcat内存大小的设置
- C++异常处理 - 对象篇
- Cocos2d-x开发系列 苹果IPv6 only问题处理
- 基于Hadoop2.7.2+ ICTCLAS2015的并行化中文分词
- 基于Hadoop2.7.2+ ICTCLAS2015的并行化中文分词
- caffe 使用常见错误