1d点间唯一距离数组

jobtbby3  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(315)

我正在编写一个有行星(点)的n体模拟器。我已经让它工作,但仍然有很多可能的优化,其中之一是计算一次点之间的距离,并将它们存储在一个数组中。我可以使用2d阵列(需要转换为1d,因为gpu不支持2d阵列),但有两个问题:
模拟将限于√2147483647(最大整数值)planets=46340个行星,因为数组的大小是n^2(n是行星数)
许多距离会重复(0和1之间的距离与1和0之间的距离相同)
要获得唯一连接的数量,公式为:d=(n*(n-1))/2
但现在我遇到了一个问题:如何在给定两个行星id-s(x,y)的距离数组中获得索引。行星0和1之间的距离指数是0,0-2->1,1-2->2。。。

afdcj2ne

afdcj2ne1#

为了帮助可视化这看起来像什么,这里有一个表,显示哪个索引(在1d数组中)对应于每对行星ID。要使用此表,给定一对行星ID,找到对应于两个ID中较大者的行,以及对应于两个ID中较小者的列,这将为您提供一个单元格,该单元格具有该距离在1d数组中存储位置的索引。

所以,现在我们需要一个公式,给出两个行星ID,并计算1d索引数。为了简单起见,我们假设首先给出较大的行星id(如果没有,那么我们可以简单地交换两个行星ID。)
第一项工作是获取较大的行星id并确定其行上的第一个索引。换句话说,我们需要将1转换为0,2转换为1,3转换为3,4转换为6,5转换为10,6转换为15,等等。幸运的是,模式0,1,3,6,10,15是众所周知的-这是三角数。第n个三角数的常用公式是(n*(n+1))/2,但在这种情况下,我们实际上想要第n-1个三角数,所以我们想要的公式是 (n*(n-1))/2 .
一旦我们有了行的第一个索引,我们就可以添加较小的行星id来得到最终的索引。
最后的公式是:

given A (larger planet id) and B (smaller planet id):
 the index of dist(A,B) in the 1D array is ((A * (A-1)) / 2) + B

相关问题