繁体   English   中英

查找满足w + x = y + j的(x,y,z,j)的所有组合的算法,其中w,x,y,j是-N ... N(含)之间的整数

[英]Algorithm for finding all combinations of (x,y,z,j) that satisfy w+x = y+j, where w,x,y,j are integers between -N…N inclusive

我正在研究一个问题,该问题需要根据另一个数组(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并存储索引(如果abs(z )<=N。

有没有更有效的计算方法?

我问的原因是,将来我也希望能够为每个dA [j]有效地找到所有具有特定A [i]的项。 从本质上讲,它能够相对于dA [i]计算dA [j]的雅可比行列式。

更新

为了完整起见,我想出了一种不带任何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的每个值的所有有效解都将由一个带有点(-N,-N ),(-N,-j),(j,N),(N,N),(N,-j)和(j,-N)。

因此,对于每个j ,您都要遍历所有(2N)^2组合以找到正确的x'sy's ,使得x+y= z+j 您的应用程序的运行时间(每j )为O(N^2) 我不认为您当前的想法不好(并且在为此使用了一些伪代码之后,我无法对其进行重大改进)。 我想指出的是,一旦您选择了jzx'sy's 最多有 2N选择。 因此,总的来说,最佳算法仍将在O(N^2)

但是,考虑将以下改进提高2倍(对于整个程序,不是每个j ):如果z+j= x+y ,则(-z)+(-j)= (-x)+(-y)也。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM