平面内多个点距离问题

MagiSu 2010-09-13 06:12:29
现在在一个平面内有N个点,已知一个阈值R,求所有两点距离小于R。如何高效的实现这个算法呢?
...全文
360 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiyudong 2010-09-21
  • 打赏
  • 举报
回复
不知道我有没有理解错你的意思。你可以先确定点与点之间是否连边:当两点距离小于r时,连一条边。而你的问题就转化为,在这个图里面找一个最大团的问题了。最大团一般是np的,你可以使用搜索、或者是动态规划,结合图论方法找到最大团。
guanxinquan 2010-09-19
  • 打赏
  • 举报
回复
使用图形学方法,如果你学过图形学的话,(点是否在裁剪正方形内,通过判断测试点和目标点是否在一个直线的两侧即可,因为本题的特殊性,可以使用的正方形是水平和竖直方向放置,如果测试点是Point1(x1,y1),中心点是Point2(x2,y2),直线方程是(x3,y3,x3,y4),那么如果((x1 > x3 && x2 < x3)||(x1 < x3 && x2 > x3)) 两个点必在直线两侧。注意根据本题直线方程不是垂直的,就是水平的,所以不是x坐标相同,就是y坐标相同)
首先在指定的点为中心,以R为半径做一个裁剪正方形(也就是那个R为半径的圆为所作矩形的内切圆),然后采用矩形的裁剪算法(这个算法只有比较没有乘除),删除那些必然大于R半径的点,之后,在R的圆内做个内切正方形,然后采用裁剪算法,记录那些必然小于R的点。(注意,这两个矩形裁剪可以在一次循环中完成),最后在两个裁剪矩形之间的点通过距离公式,判断其距离是不是大于R,进行最终的筛选。(这个过程可以同上面的过程在一个循环中完成)。
这样,通过一次循环O(n)就可以确定所要的点,并且这个过程仅存在较少的乘法和加法操作,具有较好的性能。
个人观点!
air_snake 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 guanxinquan 的回复:]

使用图形学方法,如果你学过图形学的话,(点是否在裁剪正方形内,通过判断测试点和目标点是否在一个直线的两侧即可,因为本题的特殊性,可以使用的正方形是水平和竖直方向放置,如果测试点是Point1(x1,y1),中心点是Point2(x2,y2),直线方程是(x3,y3,x3,y4),那么如果((x1 > x3 && x2 < x3)||(x1 < x3 && x2 >……
[/Quote]
看了半天,有点没有明白,你是的要对平面中的每一点进行这个运算么?
以指定的点位中心,这个点怎么来的?是对平面所有点么?
如果是对所有点的话,直接算距离判断不是来的更快么?全遍历一便也是O(n)
但是要找出所有的距离小于R的,估计不行吧。
xero_123 2010-09-15
  • 打赏
  • 举报
回复
应该是nlogn了吧
xero_123 2010-09-15
  • 打赏
  • 举报
回复
分治法是不是就能解决,首先解决左右两边的小于R的个数,之后在考虑,中间线左右两边,[mid-r,mid+r]条状区域内的点。复杂度,貌似可以降低一些。
超级大笨狼 2010-09-15
  • 打赏
  • 举报
回复
提高速度,就牺牲些空间,牺牲插入时间,换取运行时间。
在点这个对象里,加入一个泛型二叉树,Data里边记录本点和其他所有点的距离,其他点的编号。

这样如果R是变量的话,每个点O(log(n))时间内可以找到圈里的点,总共n*log(n)可以找到全部。
如果R是常量,干脆就写死标记,这样就是O(1)和O(n)了
绿色夹克衫 2010-09-15
  • 打赏
  • 举报
回复
统计数量也许还有更快的方法,但求具体的点对,最坏怎么也是n^2的。二分平面的方法其实也凑合,就是编程比较麻烦。
air_snake 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sbwwkmyd 的回复:]

如果符合条件的点对比重较大(点相对于R比较密集),就没什么可以优化的了,输出结果都是N^2级的。

如果点相对于R比较稀,我觉得可以把点分别按横坐标与纵坐标排序,时间代价为2N*log(N),然后分别建立相对的拓朴网络(一个从左上角到右下角对应,一个从右下角到左下角对应),时间代价为2N。然后在这两个网络中查找合法点对可以说没有多余的开销了,“相当于”在一条直线上的若干已排序的点中查找合法点……
[/Quote]

支持。
对于稀疏的,我觉得可以用kNN的算法思想,是data mining中cluster的最好用的。
即,为了减少计算量,我们只对在相同分类的点互相进行计算。
遍历所有的点,对每个点进行标识,每加入一个新的点,对其分类。距离小于类中任意一点小于R的,是同一类。





MagiSu 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 donkey301 的回复:]

可以试一下kd树
[/Quote]

有意思!
Joe-xXx 2010-09-14
  • 打赏
  • 举报
回复
可以参考下:http://blog.csdn.net/codeboycjy/archive/2009/11/30/4908022.aspx
showjim 2010-09-13
  • 打赏
  • 举报
回复
如果符合条件的点对比重较大(点相对于R比较密集),就没什么可以优化的了,输出结果都是N^2级的。

如果点相对于R比较稀,我觉得可以把点分别按横坐标与纵坐标排序,时间代价为2N*log(N),然后分别建立相对的拓朴网络(一个从左上角到右下角对应,一个从右下角到左下角对应),时间代价为2N。然后在这两个网络中查找合法点对可以说没有多余的开销了,“相当于”在一条直线上的若干已排序的点中查找合法点对。
wizard_tiger 2010-09-13
  • 打赏
  • 举报
回复
想到一个办法不知行不行请多指证。
先由其中一点为圆心做一个圆半径为R在圆内的点距离小于R然后删除这一点
再继续重复这一步骤直至剩下一个点结束。
donkey301 2010-09-13
  • 打赏
  • 举报
回复
可以试一下kd树
xingzhe2001 2010-09-13
  • 打赏
  • 举报
回复
需要预处理,用四叉数事先划分一下也有帮助
超级大笨狼 2010-09-13
  • 打赏
  • 举报
回复
N个点,有n(n-1)/2条边,在计算中排出掉已经计算过的,用哈希表记录点对,
就可以达到O(n(n-1)/2)复杂度。
还是n^2级别的。
one2zero 2010-09-13
  • 打赏
  • 举报
回复
类似冒泡排序的逻辑

平面内的点 按x,y 的增减,然后再计算一次距离

至于效率不敢保证

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧