所以我正在研究模拟大量的n维粒子,我需要知道每对点之间的距离。允许一些错误,并且如果超过某个阈值,距离根本不相关,是否有任何好的方法来实现这一点?我很确定我是否需要dist(A,C)
并且已经知道dist(A,B)
和dist(B,C)
我可以通过[dist(A,B)-dist(B,C) , dist(A,B)+dist(B,C)]
绑定它,然后将结果存储在已排序的数组中,但我如果有更好的东西,我想不要重新发明轮子。
我不认为维度的数量应该会对逻辑产生很大的影响,但也许对于某些解决方案而言。提前谢谢。
答案 0 :(得分:2)
如果问题仅仅是计算所有对之间的距离,那么它将是O(n^2)
问题而没有任何更好的解决方案。但是,您说如果距离大于某个阈值D
,那么您对它不感兴趣。这为更好的算法打开了机会。
例如,在2D情况下,您可以使用扫描线技术。按字典顺序对点进行排序,首先是y
,然后是x
。然后使用宽度为D
的条纹从底部到顶部扫描平面。当条纹在平面上移动时,新点将通过其顶部边缘进入条纹并通过其底部边缘退出。活动点(即当前在条带内的点)应保存在某些可逐步修改的线性数据结构中,并按其x
坐标排序。
现在,每当新点进入条纹时,您必须检查左侧和右侧的当前活动点,而不是D
(沿x
轴测量)。就是这样。
此算法的目的(通常是扫描线方法的情况)是将实际复杂性从O(n^2)
推向O(m)
,其中m
是我们实际感兴趣的互动次数。当然,最糟糕的情况是O(n^2)
。
以上适用于二维情况。对于n维情况,我会说你用不同的技术会更好。某种空间分区在这里应该运行良好,即利用如果已知分区之间的距离大于D
这一事实,则没有理由将这些分区中的特定点相互对立。< / p>
答案 1 :(得分:0)
如果超出某个阈值的距离不相关,并且此阈值不是太大,则有一些常用技术可以提高效率:使用空间分区数据结构限制对相邻点的搜索。可能的选择是:
此外,由于从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中的一些有趣示例:http://forum.openframeworks.cc/index.php?topic=2860.0
以下是分箱(和散列)的解释:http://www.cs.cornell.edu/~bindel/class/cs5220-f11/notes/spatial.pdf