算法分析与实践作业五

1.     问题

已知一平面上共有n个点,求距离最近的两个点间的距离。

2.     解析

分解:

已知集合S中有n个点,分治法的思想就是将S进行拆分。对所有的点按照x坐标(或者y)从小到大排序。根据下标进行分割,使得点集分为两个集合。算法每次选择一条垂线L,将S拆分左右两部分为SL和SR。依次找出这两部分中的最小点对距离:δL和δR,记SL和SR中最小点对距离dis = min{δL,δR}。

合并(算法核心步骤):

那么一个点在集合A,一个在集合B中的情况,可以针对此情况,用之前分解的标准值,即按照x坐标(或者y)从小到大排序后的中间点的x坐标作为mid,划分一个[mid−dis,mid+dis][mid-dis,mid+dis] [mid−dis,mid+dis]区域,如果存在最小距离点对,必定存在这个区域中。

 

3.     设计

EfficientClosestPair(P,Q)

//使用分治算法来求解最近点对问题

//输入:数组P中存储了平面上的n>=2个点,并且按照这些点的x轴坐标升序排列

//数组Q存储了与P相同的点,只是它是按照这点的y轴坐标升序排列

//输出:最近点对的欧几里得距离

if n<=3

  返回由蛮力算法求出的最小距离

else

  将P的前[n/2]个点复制到P1

将Q的前[n/2]个点复制到Q1

将P的余下的[n/2]个点复制到Pr

  将Q的余下的[n/2]个点复制到Qr

  d1<- EfficientClosestPair(P1,Q1)

  dr<- EfficientClosestPair(Pr,Qr)

  d<-min{d1,dr}

m<-P[⌈n/2 ⌉-1].x

将Q中所有|x-m|<d的点复制到数组S[0..num-1]

dminsq<-d*d

for i<-0 to num -2 do

  k<-i+1

  while k<=num-1 and (S[k].y-S[i].y)^2<dminsq

  dminsq<=min((S[k].x-S[i].x)^2+(S[k].y-S[i].y)^2,dminsq)

  k<-k+1

    return sqrt(dminsq)

 

4.     分析

时间复杂度O(nlog2n)

 

 

 

5.     源码

github地址:https://github.com/122cmy/myGitTemp5

博客地址:https://www.cnblogs.com/122cmy/

posted @ 2021-04-19 09:17  小月爱写代码  阅读(65)  评论(0)    收藏  举报