在程序中查找循环不变量以计算多维数据集的总和?

时间:2012-02-08 03:39:47

标签: algorithm math big-o analysis invariants

我不能100%确定三次幂求和中的不变量是多少。

注意:n始终为非负值。

伪代码:

triplePower(n)
    i=0
    tot=0
    while i <= n LI1
        j = 0
        while j < i LI2
            k = 0
            while k < i LI3
                tot = tot + i
                k++
            j++
        i++

我知道它很乱,可以用更容易的方式完成,但这是我应该做的(主要用于算法分析练习)。

我想出三个循环不变量; LI1,LI2和LI3 我认为对于LI1,不变量与tot =(i ^ 2(i + 1)^ 2)/ 4(从0到i的多维数据集之和的等式)有关 我不知道该怎么做LI2或LI3。 LI2的循环使i ^ 3和LI3生成i ^ 2,但我不完全确定如何将它们定义为循环不变量。

如果我在每个while循环体中有3个单独的总变量,那么不变量会更容易定义吗?

感谢您提供任何帮助。

此函数的增长顺序也是:Θ(n ^ 3)?

2 个答案:

答案 0 :(得分:2)

当面对这样一个循环计算增量总和时,一个好的不变量就是你到目前为止计算的总和是否等于你认为它的总和的第一部分。在这种情况下,您需要计算前n个正立方体的总和,并通过一次添加一个立方体来实现。因此,一个可能的不变量就是那个

  

tot = sum(j从0变为i)j 3

另外,i和n之间的关系是什么?好吧,我们应该有i≤n+ 1.为什么n + 1?那是因为在最后一次迭代中,当i = n时,我们仍然会增加i。使用这两个不变量,您可以证明此循环计算正确的值。

至于运行时,您可以非常轻松地计算它。首先,每次迭代完成了多少工作? O(1)?上)?为O(n 2 )?那么,有多少循环迭代? O(1)?上)?为O(n 2 )?这两个术语的产品将为您提供答案。

希望这有帮助!

答案 1 :(得分:1)

您的算法可以像这样简化(我希望你已经习惯了C语言语法):

tot = 0;
for ( i = 0 ; i <= n ; i ++ )
    for ( j = 0 ; j < i ; j ++ )
        for ( k = 0 ; k < i ; k ++ )
            tot = tot + i;

然后,您可以将其翻译成Sigma Notation:

enter image description here