java - 点之间唯一距离的一维数组
问题描述
我正在用行星(点)编写一个 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 中较小者的列,这将为您提供带有 where 索引的单元格该距离存储在您的一维数组中。
所以,现在我们需要一个公式,给定两个行星 ID 并计算一维索引号。为简单起见,我们将假设首先给出较大的行星 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
推荐阅读
- python - Python Pandas 使用 for 循环添加行的问题
- python - 如何将 DASK 数据帧放入 MySQL 数据表?
- python - SWIG 将 C++ 扩展到 Python,未定义的枚举
- reactjs - 在反应中显示表格数据的更好方法
- python - REGEX - 查找特定的 XML 标记并通过它进行解析
- java - 如何把数字时间变成英文名字
- r - COVID19 数据——如何组合两个数据集并绘制在一个图中?
- android - Android Studio:处理 TabLayout 时发生空指针异常
- networking - 您如何将数据从 Cloud 传输到 Thread?
- wordpress-theming - 如何显示分类页面的子分类?