多个嵌套循环索引

时间:2012-11-11 12:59:34

标签: algorithm math

我有多个(N)嵌套循环,如下所示:

int k = 0;
for (int i1 = 0; i1 < n; i1++)
{
  for (int i2 = 0; i2 <= i1; i2++)
  {
    for (int i3 = 0; i3 <= i2; i3++)
    {
       ...
            for (int iN = 0; iN <= i{N-1}; iN++)
            { 
              k++;
              //k = f(i1, ... , iN);
            }
    } 
  } 
}

我需要一个公式,根据k,...,i1在循环中获取iN

N=1k=f(i1)=i1

N=2k=f(i1,i2)=i1*(i1+1)/2+i2

2 个答案:

答案 0 :(得分:0)

一般来说,你有一个嵌套的总和:

sum(sum(sum(1,i3=0..i2),i2=0..i1),i1=0..n-1)

您可以使用these basic summation formules从内到外简化。最终结果将仅依赖于i作为izomorphius评论,因为N是i1的上限,i2是i2的上限,...

编辑好的,通过编辑,我现在看到你有一个不同的问题。现在它有点复杂但仍然没有问题。

我们需要为此分割一些东西。我将计算值k = f(4,3,1)。 在那个时间点,我们将执行4个完整的i1循环(i1 = 0,1,2,3)并且正在执行第五个循环。 i1(= k_i1)的4个完整循环之后的k值(就在我们开始第五个之前)可以使用此函数计算(与之前的类型相同)。

k_i1=sum(sum(sum(1,i3=0..i2),i2=0..l),l=0..i1-1) = f1(i1);

现在我们启动第5个循环并为i2循环执行相同的操作。那时,我们将完成3个完整的i2循环,所以我们得到

k_i2=sum(sum(1,i3=0..l),l=0..i2-1)=f2(i2);

这适用于所有循环。要获得最终值,您必须添加每个fi函数。 k看起来像

k=k_i1+k_i2+...

我的解释中可能存在一些小的(+ -1)错误,但基本的想法是使用公式计算完整循环。

答案 1 :(得分:0)

我认为我们可以将此问题视为组合重复问题。答案是C(n + N-1,N)。您可以查看维基百科combination part以获取更多详细信息。希望能帮助到你!