算法分析与设计
最近点对问题
问题描述:
已知有n个点的集合,找出其中最近的一对并返回其最近距离。
算法思路:
- 每次用分治的思想将数组进行二分操作,然后从下往上开始进行合并排序。
- 将所有点放入到结构体中,对结构体按照x或y左边的值进行排序。
- 根据下标进行分割,分为两个点集a,b。
- 最近点有三种情况,分别为在a中,在b中,a,b各一个。
- 前两种使用递归得到答案。
- 最后一种则是在一个距离小于d的集合中,这个集合是有a,b共同构成的。
核心代码:
double minPoint(int l,int r){
if(r-l==1) return getdis(a[l],a[r]);
if(r-l==2) return min(getdis(a[l],a[l+1]),getdis(a[l+1],a[r]));
int mid=(l+r)/2;
double dis=min(minPoint(l,mid),minPoint(mid+1,r));
while(dis<a[r].x-a[mid].x&&r>=l) r--;
while(dis<a[mid].x-a[l].x&&l<=r) l++;
for(int i=l;i<=r;i++){
for(int j=i+1;j<=r;j++){
if(a[j].y-a[j].y>=dis) break;
else dis=min(dis,getdis(a[i],a[j]));
}
}
时间复杂度:
算得时间复杂度为O(nlogn)。
源码:
https://github.com/SpiritDemon-max/myText/blob/master/minPoint.cpp