Geometry 计算一组点的每对之间的距离

Geometry 计算一组点的每对之间的距离,geometry,distance,Geometry,Distance,所以我正在模拟大量的n维粒子,我需要知道每对点之间的距离。考虑到一些误差,如果距离超过某个阈值,那么距离根本不相关,有什么好的方法来实现这一点吗?我很确定如果我想要dist(A,C)并且已经知道dist(A,B)和dist(B,C)我可以用[dist(A,B)-dist(B,C),dist(A,B)+dist(B,C)]绑定它,然后将结果存储在一个排序数组中,但是如果有更好的东西,我不想重新发明轮子 我不认为维度的数量会对逻辑产生很大的影响,但对于某些解决方案来说可能会。提前感谢。如果超出某个阈

所以我正在模拟大量的n维粒子,我需要知道每对点之间的距离。考虑到一些误差,如果距离超过某个阈值,那么距离根本不相关,有什么好的方法来实现这一点吗?我很确定如果我想要
dist(A,C)
并且已经知道
dist(A,B)
dist(B,C)
我可以用
[dist(A,B)-dist(B,C),dist(A,B)+dist(B,C)]
绑定它,然后将结果存储在一个排序数组中,但是如果有更好的东西,我不想重新发明轮子


我不认为维度的数量会对逻辑产生很大的影响,但对于某些解决方案来说可能会。提前感谢。

如果超出某个阈值的距离不相关,且该阈值不太大,则有一些常用技术可以提高效率:使用空间分区数据结构限制对相邻点的搜索。可能的选择包括:

  • 宾宁
  • 树:四叉树(2d),kd树
  • 使用空间散列进行装箱
此外,由于从点A到点B的距离与从点B到点A的距离相同,因此该距离只能计算一次。因此,您应该使用以下循环:

for point i from 0 to n-1:
     for point j from i+1 to n:
        distance(point i, point j)
将这两种技术结合在一起对于n体模拟非常常见,例如,如果粒子足够接近,则粒子会相互影响。以下是一些有趣的2d示例:


下面是对装箱(和散列)的解释:

如果问题只是关于计算所有对之间的距离,那么它将是一个
O(n^2)
问题,没有更好的解决方案。但是,您的意思是,如果距离大于某个阈值
D
,则您对它不感兴趣。这为更好的算法提供了机会

例如,在二维情况下,可以使用扫掠线技术。按字典顺序对您的点进行排序,首先按
y
排序,然后按
x
排序。然后用宽度为
D
的条纹从下到上扫掠平面。当条纹在平面上移动时,新的点将通过其上边缘进入条纹,并通过其下边缘退出条纹。活动点(即当前在条带内的点)应保存在一些可增量修改的线性数据结构中,并按其
x
坐标排序

现在,每次新点进入条纹时,您必须检查当前活动点的左侧和右侧(沿
x
轴测量)。就这些

该算法的目的(通常是扫描线法)是将实际复杂性从
O(n^2)
推向
O(m)
,其中
m
是我们实际感兴趣的交互数量。当然,最坏的情况是
O(n^2)


上述情况适用于二维情况。对于n维的情况,我想说你最好用一种不同的技术。一些空间划分应该在这里很好地工作,即利用这样的事实:如果分区之间的距离已知大于“代码>D</代码>”,那么就没有理由考虑这些分区中的特定点对彼此。

技术上,这仍然是O(n ^ 2)@ Finw Oouh,你是绝对正确的。时间复杂度101,i从1到n的经典求和。可耻地删掉了,谢谢:)哦,空间分区听起来就像我要找的,谢谢!