Java 点之间唯一距离的一维数组

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

我正在用行星(点)编写一个N体模拟器。我已经让它工作,但仍然有很多可能的优化,其中之一是计算点之间的距离一次,并将它们存储在一个数组中。我可以使用2d阵列(需要转换为1d,因为GPU不支持2d阵列),但存在两个问题:

  • 模拟将限于√2147483647(最大整数值)行星=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…

    为了帮助可视化这是什么样子,下面的表格显示了哪一个索引(在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
    

    非常感谢你。请大家注意:在给出的表格中,a id是y轴,B id是x轴,它不起作用。