![](/img/trans.png)
[英]Let X,Y,Z,W be words with vector frequency $(x,y,z,w)$ , Find an optimal code
[英]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's
和y's
,使得x+y= z+j
; 您的应用程序的运行时间(每j
)为O(N^2)
。 我不认为您当前的想法不好(并且在为此使用了一些伪代码之后,我无法对其进行重大改进)。 我想指出的是,一旦您选择了j
和z
, x's
和y's
最多有 2N
选择。 因此,总的来说,最佳算法仍将在O(N^2)
。
但是,考虑将以下改进提高2倍(对于整个程序,不是每个j
):如果z+j= x+y
,则(-z)+(-j)= (-x)+(-y)
也。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.