具有相关边界行程计数的嵌套循环

时间:2010-05-14 06:07:11

标签: algorithm loops theory complexity-theory

出于好奇,我试图做以下事情,结果对我来说并不那么明显; 假设我有运行时边界的嵌套循环,例如:

 t = 0 //  trip count
 for l in 0:N
   for k in 0:N
     for j in max(l,k):N
        for i in k:j+1
           t += 1

 t is loop trip count

是否有一般算法/方式(显然优于N ^ 4)来计算循环行程计数?

如果没有,我很想知道你将如何接近这个特定的循环。上面的循环是对称的(它是在对称秩-4张量上的循环),我也对检测循环对称性的方法感兴趣。

我正在假设迭代边界仅依赖于常量或先前的循环变量。链接/期刊文章,如果你知道一个,那就太好了。

3 个答案:

答案 0 :(得分:2)

我相信内循环会运行

t = 1/8 * (N^4 + 6 * N^3 + 7 * N^2 + 2 * N)

次。

我没有直接解决问题,我将4阶多项式表达式拟合为从1到50精确计算的N,希望我能得到精确拟合。

计算我使用过的确切

sum(sum(sum(sum(1,i,k,j+1),j,max(l,k),N),k,1,N),l,1,N)

应该相当于实际运行循环。

data fit, log scale http://img714.imageshack.us/img714/2313/plot3.png

N的拟合从1到50完全匹配,并且计算N = 100得到13258775使用这两种方法。

编辑: 练习是使用开源代数系统maxima完成的,这里是实际的源(丢弃输出):

nr(n):=sum(sum(sum(sum(1,i,k,j+1),j,max(l,k),n),k,1,n),l,1,n);
M : genmatrix( lambda([i,j],if j=1 then i else nr(i)), 50, 2 );
coefs : lsquares_estimates(M, [x,y], y = A*x^4+B*x^3+C*x^2+D*x+E, [A,B,C,D,E]);
sol(x):=ev(A*x^4+B*x^3+C*x^2+D*x+E, coefs);
sol(N);
S : genmatrix( lambda([i,j], if j=1 then i else sol(i)), 50, 2);
M-S;
plot2d([[discrete,makelist([M[N][1],M[N][2]],N,1,50)], sol(N)], [N, 1, 60], [style, points, lines], [color, red, blue], [legend, "simulation", sol(N)], [logy]);
compare(nr(100),sol(100));

答案 1 :(得分:0)

如果你想知道内循环的次数:

for j in max(l,k):N

将执行,只计算:N - max(l, k)假定开放范围,N + 1 - max(l, k)假设闭合范围。

例如,如果:

l = 2
k = 7
N = 10

然后它将在7,8,9,10(闭范围)上运行,所以确实10 + 1 - 7 = 4次。

答案 2 :(得分:0)

答案是 no ,只要循环边界可以以任意方式从外部变量中获取,因为这将提供获得整数系列的闭合形式公式的一般方法。

要查看此内容,请考虑以下事项:

for x in 0:N
  for y in 0:f(x)
    t += 1

行程计数t(N)等于和t(N)= f(0)+ f(1)+ f(2)+ f(3)+ ... + f(N-1)。< / p>

因此,如果你能得到t(N)的封闭形式公式而不管f(),你已经找到了一种生成封闭形式的非常通用的方法,我会说,因为你在这里对应的是积分,众所周知,并非所有积分都承认封闭形式