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

时间:2013-11-28 23:50:22

标签: algorithm language-agnostic permutation combinatorics

我正在研究一个需要从另一个数组(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)。

1 个答案:

答案 0 :(得分:0)

因此,对于每个j,您需要检查所有(2N)^2组合,以找到正确的x'sy's,以便x+y= z+j;您的应用程序的运行时间(j)为O(N^2)。我不认为你当前的想法很糟糕(在玩了一些伪代码后,我无法显着提高它)。我想要注意的是,一旦您选择了jz,{em}最多 2N次选择x's和{ {1}}。总的来说,最好的算法仍然可以在y's中完成。

但请考虑以下改进因子2(对于整个计划,而非每O(N^2)):如果j,则z+j= x+y