1. 问题
在二维平面中给出N个点的坐标,求其中最近点对的距离
2. 解析
方法一:暴力法,对每个点都和(n-1)个点判断,不断求最小距离。
方法二:分治法,我们将平面上N个点的集合分成两个子集s1和s2,每个子集约N/2个点,然后在每个子集中递归地求最接近的点对。
3.核心伪代码
蛮力法: double baoli(){ double dmin=inf; rep(i,0,n-1){ rep(j,i+1,n-1){ dmin=min(dmin,dis(i,j)); } } return dmin; }
分治法: double dfs(int l,int r){ double dmin=inf; if(l==r) return dmin; if(l+1==r) return dis(l,r); int mid=(l+r)>>1; double d1=dfs(l,mid); double d2=dfs(mid+1,r); dmin=min(d1,d2); int cnt=0; rep(i,l,r){ if(fabs(p[mid].x-p[i].x)<=dmin) mp[cnt++]=i; } sort(mp,mp+cnt,cmpy); rep(i,0,cnt-1){ rep(j,i+1,cnt-1){ if(p[mp[j]].y-p[mp[i]].y>=dmin) break; double d3=dis(mp[i],mp[j]); dmin=min(dmin,d3); } } return dmin; }
4.复杂度分析:
蛮力法:复杂度(n*(n-1)/2)所以时间复杂度就是O(n^2)。
分治法:时间复杂度O(nlogn*logn)。
5.github源码地址:
https://github.com/xiaojunjun601/sfHomework1/commit/923eb3fd7442b4b43bdcf7a594c49c3623bdcef7