平面内最近点对问题

  • 实验问题简述

平面中有n个点P1、P2......Pn,n>1,求最近的两个点及他们之间的距离D( Pi,Pj ).

D( Pi,Pj )=square ( ( xi-xj ) ( xi-xj )+( yi-yj ) ( yi-yj ) ) );

  • 实验过程简述及时间复杂度分析

  1. 实验算法编程使用C++,并且生成TXT文件,并且将该文件导入到MATLAB当中,进行点的绘制。
  2. 暴力算法
  1. 暴力算法过程简述
    计算每对点之间的距离,从中比较出最小距离,并且记录下该点对.
  2. 暴力算法时间复杂度

求n个点间的最小距离需要计算(n-1)n/2,因此时间复杂度是O(n²).

·分治算法过简述

确定递归算法出口,若只剩下1/2个点,返回无穷大或者直接计算点之间的距离.

预处理根据x坐标大小对每个点进行排序.

将所有点分成近似相等的左右两部分.

递归的计算左边部分的最小距离,并返回左边最短点对距离.

递归的计算右边部分的最小距离,并返回右边最短点对距离.

预处理对中间区域内的点根据y坐标大小进行排序.

取左右两边的最小距离作为当前的最小距离mindistance.

对于在中线左侧距离中线mindistance距离的点和在中线距离中线mindistance距离的形成的点对,计算他们之间的距离.如果小于mindiatance,那么就更改其的值,并且记录下该点对.下图是中间区域的具体计算方式.

平面内最近点对问题_第1张图片

如图中间区域内形成的宽为2d的带状区间,最多可能有n个点,但对于中间左侧区域内的点P1和中间右侧区域内的点P2中的点具有以下稀疏的性质,对于P1中的任意一点,P2中的点必定落在一个d X 2d的矩形中,且最多只需检查6个点(鸽巢原理).

 PS:补充一下什么是鸽巢原理:对于n+1个鸽子,一共有n个鸽巢,当所有的鸽子全都飞回鸽巢时,那么必定有鸽巢中至少飞进了2只鸽子.

鸽巢原理加强版:当n只鸽子飞进m个巢时,必定至少有一个鸽巢当中有鸽子.

·可视化实现

平面内最近点对问题_第2张图片

把程序随机生成的点对输出到.txt文件当中,同时输出平面内最近点对,利用matlab实现可视化。

可视化实现结果如下:

 平面内最近点对问题_第3张图片

让我来感叹一句matlab真的很强大!! 

你可能感兴趣的:(算法与数据分析,平面,机器学习,概率论)