平面内最近点对问题

  • 实验问题简述

平面中有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,那么就更改其的值,并且记录下该点对.下图是中间区域的具体计算方式.

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

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

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

·可视化实现

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

可视化实现结果如下:

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近问题是指在平面上给定N个,求其中距离最近的两个之间的距离。分治法是一种常用的解决最近问题的算法。 分治法的基本思想是将问题分解成多个子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。对于最近问题,我们可以采用以下的分治算法: 1. 将所有按照横坐标从小到大排序,然后将它们划分为两部分,分别处理左右两个部分。 2. 对于左右两个部分,分别递归求解最近对距离。 3. 将左右两个部分中距离最近对的距离记为d。 4. 扫描所有横坐标在中间区域内的,按照纵坐标从小到大排序。对于每个,只需考虑它与纵坐标差不超过d的之间的距离,因为这些是可能成为最近对的候选者。 5. 对于每个,只需要考虑它与后面7个之间的距离即可,因为如果有距离更近的,它们之间的距离一定小于d。 6. 扫描完中间区域内的所有后,最近对的距离就是左右两个部分中的最小值和中间区域内的最小值中的较小值。 下面是该算法的伪代码: ``` function closest_pair(points): // 按照横坐标排序 sort(points, key=lambda p: p.x) // 递归终止条件 if len(points) <= 3: return brute_force(points) // 求解左右两个部分的最近对距离 mid = len(points) // 2 left_points = points[:mid] right_points = points[mid:] left_min_dist = closest_pair(left_points) right_min_dist = closest_pair(right_points) // 求解中间区域的最近对距离 min_dist = min(left_min_dist, right_min_dist) strip_points = [p for p in points if abs(p.x - points[mid].x) < min_dist] strip_points.sort(key=lambda p: p.y) for i in range(len(strip_points)): for j in range(i+1, min(i+8, len(strip_points))): dist = distance(strip_points[i], strip_points[j]) min_dist = min(min_dist, dist) return min_dist ``` 其中,brute_force是暴力求解最近对距离的函数,distance是计算两个之间距离的函数。时间复杂度约为O(N log N)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值