作业5 最近点对问题

1.     问题

给定一个二维平面上的n个点p1(x1,y1),p2(x2,y2)…pn(xn,yn).求出其中最短的两点之间的距离

2.     解析

主要采用分治的思想来解决问题。首先将所有点根据x坐标进行排序。大问题的是求出n的点其中最短两点的距离,可以将n个点平分为两个集合,中间的点为mid,分别求两个集合中的点最短两点的距离dist1,dist2,并得到dist = min(dist1,dist2)。但是还可能存在一种情况,最短距离的两个点分别在两个集合中。因此在解决完两个小问题后还要进行判断。在得到前两个距离后,就可以对这个问题进行化简。判断所有满足pa(xa,ya),pb(xb,yb),使得xa属于[mid-dist,mid],xb[mid,mid+dist]属于条件的两点的距离是否小于dist,并对dist进行更新。最后就可以得到dist。

3.     设计

findClosestPoint(tar,start,end)

{

       Amount = end-start+1;

       Mid = (start+end)/2;

       Midvalue = (a[start].x+a[end].x)/2.0;

       If(amount == 2)

              Return start与end之间的距离;

       Else if(amount == 1)

              Return inf

       Else

       {

              Dist1 = findClosestPoint(a,start,mid);

              Dist2 = findClosestPoint(a,mid+1,end);

              Dist = min(dist1,dist2);

              Double thisdist = inf;

              For(int I = start;I <= end;i++)

                     For(int j = start;j <= end;j++)

                     {

                            If(i.x属于[midvalue-dist,midvalue] && j.x属于[midvalue,midvalue+dist])

                                   Dsi = I,j之间的距离

                                   If(dis < thisdist)

                                          Thisdist = dis;

                     }    

       }

       Dist = mini(dist,thisdist);

       Return dist;

}

4.     分析

5.     源码

https://github.com/fanchile/Algorithm

原文地址:https://www.cnblogs.com/Fanchile/p/12565528.html