我正在研究一个需要从另一个数组(A [i],i = -N..N)的值计算数组(dA [j],j = -N..N)的问题)基于动量守恒定律(x + y = z + j)。这意味着对于(x,y,z)的所有有效组合的给定索引j,我计算A [x] A [y] A [z]。 dA [j]等于这些值的总和。
我正在通过循环x = -N ... + N,y = -N ... + N并计算z = x + yj并存储索引来预先计算每个dA [j]的有效索引abs(z)< = N。
有更有效的计算方法吗?
我问的原因是,将来我还希望能够有效地找到每个dA [j]具有特定A [i]的所有术语。基本上能够计算dA [j]相对于dA [i]的雅可比行列式。
更新
为了完整起见,我想出了一种方法,在没有任何if语句的情况下执行此操作:如果将x + y = z + j参数化,假设j是常数,则得到平面的等式。 x,y,z需要在-N..N之间为整数的约束在该平面上创建边界。定义此边界的点是N和j的函数。因此,您所要做的就是遍历这些边界内的参数化变量(s,t),并通过使用平面定义的向量生成所有有效点(s * u + t * v + j * [0 ,0,1])。
例如,如果选择u = [1,0,-1]和v = [0,1,1],则j的每个值的所有有效解都由带有点的6边多边形(-N)限定,-N),( - N,-j),(j,N),(N,N),(N,-j)和(j,-N)。
答案 0 :(得分:0)
因此,对于每个j
,您需要检查所有(2N)^2
组合,以找到正确的x's
和y's
,以便x+y= z+j
;您的应用程序的运行时间(j
)为O(N^2)
。我不认为你当前的想法很糟糕(在玩了一些伪代码后,我无法显着提高它)。我想要注意的是,一旦您选择了j
和z
,{em}最多 2N
次选择x's
和{ {1}}。总的来说,最好的算法仍然可以在y's
中完成。
但请考虑以下改进因子2(对于整个计划,而非每O(N^2)
):如果j
,则z+j= x+y
。