我有多个(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=1
:k=f(i1)=i1
N=2
:k=f(i1,i2)=i1*(i1+1)/2+i2
答案 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以获取更多详细信息。希望能帮助到你!