Arrays 如何高效存储大型稀疏阵列

Arrays 如何高效存储大型稀疏阵列,arrays,matrix,storage,sparse-matrix,Arrays,Matrix,Storage,Sparse Matrix,我将粒子追踪到3D晶格中。每个晶格元素都用对应于展开的三维阵列的索引进行标记 S = x + WIDTH * (y + DEPTH * z) 我对从S1单元到S2单元的过渡感兴趣。由此产生的过渡矩阵M(S1,S2)人口稀少,因为粒子只能到达附近的单元。不幸的是,使用几何上接近的展开三维阵列单元的索引可能会在索引中产生很大的差异。例如,位于彼此顶部(如z和z+1)的单元格的索引将按宽度*深度移动。因此,如果我尝试累积得到的2D矩阵M(S1,S2),S1和S2将非常不同,即使单元相邻。这是一个

我将粒子追踪到3D晶格中。每个晶格元素都用对应于展开的三维阵列的索引进行标记

  S = x + WIDTH * (y + DEPTH * z)
我对从S1单元到S2单元的过渡感兴趣。由此产生的过渡矩阵M(S1,S2)人口稀少,因为粒子只能到达附近的单元。不幸的是,使用几何上接近的展开三维阵列单元的索引可能会在索引中产生很大的差异。例如,位于彼此顶部(如z和z+1)的单元格的索引将按宽度*深度移动。因此,如果我尝试累积得到的2D矩阵M(S1,S2),S1和S2将非常不同,即使单元相邻。这是一个重要的问题,因为我不能使用通常的稀疏矩阵存储

开始时,我尝试以坐标格式存储矩阵:

  I , J VALUE
不幸的是,我需要循环整个索引集以找到合适的S1,S2并存储累积的M(S1,S2)

罕见的稀疏矩阵有一些底层结构,因此索引非常简单。然而,在本例中,我在计算如何为单元格编制索引时遇到了一些困难

谢谢你的帮助
提前感谢您,

有几种方法。哪种方法最好取决于需要在矩阵上执行的操作

一个好的通用方法是使用一个哈希表,其中键是索引元组,在您的例子中(i,j)

如果相邻的(欧几里得意义上的)矩阵元素必须是可发现的,那么另一种策略是使用莫顿顺序键的平衡树。密钥(i,j)的莫顿阶值就是位交错的整数i和j。您应该很快就会看到,在索引2-空间中彼此接近的索引元组也以线性莫顿顺序接近


当然,如果您一次构建完矩阵,之后它是不可变的,那么您可以在数组中构建键值对,而不是哈希表或平衡树,对它们进行排序(对(i,j)对按字典顺序排序,对莫顿键按线性排序),然后使用简单的二进制搜索进行读取。

您好,谢谢您的帮助。哈希表看起来很方便。不幸的是,我无法使用2个键找到一个,我需要类似
key1=I key2=J value=val的东西。另一个问题是,如果某个特定的I J对已存储,则只应递增。可以用这个属性来编码has表吗?@AlexanderCska关于你的第一个问题,当然可以。字符串是由多个字符组成的,不是吗?他们一直在讨论。只需将两个索引串联或交错即可生成密钥。很抱歉,我不能理解第二个问题。关于第一部分,如果我理解正确,我应该将
I J
写入字符缓冲区,并将其用作哈希键。关于我问题的第二部分。我正在累积值(计算积分)。如果我在迭代1中,并且我的代码生成
M(I,J)
我将只存储值。如果我在迭代2中,并且生成了相同的
I,J
,我想增加值
M(I,J)=M(I,J)+1
。“有可能吗?”亚历山德斯卡肯定。您可以对存储的值执行任何操作。字符缓冲区可以,但太硬了。您所需要的只是一种将i和j组合成单个整数散列值的方法。对它们进行异或运算,在进行异或运算之前先旋转一个,使用线性组合a*i+j,其中a是素数常数,等等。对于莫顿阶,如我在开始时所说,交错i和j的位。使用莫顿散列,矩阵中彼此接近的元素也具有类似的散列值,因此落入彼此接近的桶中。