社区
数据结构与算法
帖子详情
平面内多个点距离问题
MagiSu
2010-09-13 06:12:29
现在在一个平面内有N个点,已知一个阈值R,求所有两点距离小于R。如何高效的实现这个算法呢?
...全文
360
16
打赏
收藏
平面内多个点距离问题
现在在一个平面内有N个点,已知一个阈值R,求所有两点距离小于R。如何高效的实现这个算法呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 的增减,然后再计算一次距离
至于效率不敢保证
分治法的应用--
平面
点
对最小
距离
问题
问题
描述:一个二维
平面
内有一些随机分布的
点
,求这些
点
之间
距离
最短的两个
点
。(
问题
和图片均出自于清华大学网课) 看到这个
问题
首先想到的应该是暴力解法,即对于每个
点
,遍历其他所有
点
求
距离
。把
平面
中任意两
点
的
距离
都求出来后,取其中的最小值。但是这个算法的时间复杂度为O(n^2),当数据量较大时是无法接受的。 于是我们想到了分治法,可不可以将
问题
化简为求几个规模减小的子
问题
呢,答案是可以的,我们可以根据
平面
中的
点
的x坐标或y坐标将它们分为数目大致相等的两部分。这里我们以x坐标举例,如图: 我们可以在分治之
平面
最近
点
距离
问题
(分治法)
问题
描述:给定
平面
上n个
点
,每个
点
坐标分别为(x,y),求其中的一对
点
,使得在n个
点
组成的所有
点
对中,该
点
对的
距离
最小。 最简单的做法是找到所有
点
对的
距离
,然后求最小值,但这样做效率太低,时间复杂度为O(n*n), 求最小值的
问题
,我们很容易联想到分治法,但是分治法一般是用在一维的条件下,那么
问题
来了,当扩展到二维的情况下,如何使用分治法呢? 一般想到分治法,我们一般最开始可能就会想到,把n
给定
平面
上N个
点
的坐标,找出
距离
最近的两个
点
(Java)
给定
平面
上N个
点
的坐标,找出
距离
最近的两个
点
(Java) 说实话这道题不太会,以下讲解转自一篇博客,代码转自另一篇(真是太菜了没脸见人了。。。)
问题
:
平面
点
集求其中
距离
最近的两个
点
及其
距离
。 思路:采用分治法,将“求n个
点
之间最小
距离
”
问题
划分为很
多个
“求n/t个
点
之间最小
距离
”
问题
。 (1)将lstPoint根据X坐标由小到大排序得到
点
集pointsSortedX,方法很多,冒泡、选择、插入、...
【分治法】求
平面
点
集
距离
最近的两个
点
及其
距离
问题
:
平面
点
集求其中
距离
最近的两个
点
及其
距离
。 思路:采用分治法,将“求n个
点
之间最小
距离
”
问题
划分为很
多个
“求n/t个
点
之间最小
距离
”
问题
。 (1)将lstPoint根据X坐标由小到大排序得到
点
集pointsSortedX,方法很多,冒泡、选择、插入、归并,快排等,本文采用快排,其优
点
就不多说了。 (2)pointsSortedX为一个
点
集,可以采用二分法分为两个数量均分的
点
集points...
平面
n个
点
的最短连线算法----最短路径
需求:
平面
内有
多个
点
,要用一根线逐个连接所有
点
,每个
点
不重复。返回排序好的
点
数组。 思路: 1、先定一个起始
点
A; 2、计算出起始
点
A与其他
点
的
距离
,比较出
距离
最短的那个
点
B; 3、再用
点
B与其他
点
(除
点
A)比较找出
距离
最短的
点
C; 4、循环操作直到最后一个
点
,无需比较,直接找到还没有排序的
点
,追加在最后即可。 5、然后将所有
点
循环定为起始
点
,将每一种
点
排序组合都加到数组A中,并将这种排序组合所有
点
连线计算出长度加到数组B中; 6、找出数组B中值最小的下标,到数组A中找对应的
点
排列组合,.
数据结构与算法
33,009
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章