-
实验问题简述
平面中有n个点P1、P2......Pn,n>1,求最近的两个点及他们之间的距离D( Pi,Pj ).
D( Pi,Pj )=square ( ( xi-xj ) ( xi-xj )+( yi-yj ) ( yi-yj ) ) );
-
实验过程简述及时间复杂度分析
- 实验算法编程使用C++,并且生成TXT文件,并且将该文件导入到MATLAB当中,进行点的绘制。
- 暴力算法
- 暴力算法过程简述
计算每对点之间的距离,从中比较出最小距离,并且记录下该点对. - 暴力算法时间复杂度
求n个点间的最小距离需要计算(n-1)n/2,因此时间复杂度是O(n²).
·分治算法过简述
确定递归算法出口,若只剩下1/2个点,返回无穷大或者直接计算点之间的距离.
预处理根据x坐标大小对每个点进行排序.
将所有点分成近似相等的左右两部分.
递归的计算左边部分的最小距离,并返回左边最短点对距离.
递归的计算右边部分的最小距离,并返回右边最短点对距离.
预处理对中间区域内的点根据y坐标大小进行排序.
取左右两边的最小距离作为当前的最小距离mindistance.
对于在中线左侧距离中线mindistance距离的点和在中线距离中线mindistance距离的形成的点对,计算他们之间的距离.如果小于mindiatance,那么就更改其的值,并且记录下该点对.下图是中间区域的具体计算方式.
如图中间区域内形成的宽为2d的带状区间,最多可能有n个点,但对于中间左侧区域内的点P1和中间右侧区域内的点P2中的点具有以下稀疏的性质,对于P1中的任意一点,P2中的点必定落在一个d X 2d的矩形中,且最多只需检查6个点(鸽巢原理).
PS:补充一下什么是鸽巢原理:对于n+1个鸽子,一共有n个鸽巢,当所有的鸽子全都飞回鸽巢时,那么必定有鸽巢中至少飞进了2只鸽子.
鸽巢原理加强版:当n只鸽子飞进m个巢时,必定至少有一个鸽巢当中有鸽子.
·可视化实现
把程序随机生成的点对输出到.txt文件当中,同时输出平面内最近点对,利用matlab实现可视化。
可视化实现结果如下:
让我来感叹一句matlab真的很强大!!