搞清楚大(o)

时间:2017-01-28 03:01:41

标签: time complexity-theory

for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < i*i; j++)
            {
                cout << j << endl;
                result++;
            }
        }

运行此代码说5,它总共运行30次。我知道外循环运行N.内循环虽然给了我一些麻烦,因为它不是n*n而是i*i而我在尝试找出T(n)之前没有看到过这样的问题和Big(O)。

1 个答案:

答案 0 :(得分:0)

此算法为O(n^3):要实现这一点,我们必须弄清楚内部代码的频率

cout << j << endl;
result++;

已执行。为此,我们需要总结1*1+2*2+...+n*n = n^3/3+n^2/2+n/6这是一个众所周知的结果(参见例如Sum of the Squares of the First n Natural Numbers)。因此,O(T(n)) = O(1*1+2*2+...+n*n) = O(n^3)和算法的(时间)复杂度因此O(n^3)

修改:如果您想知道为什么这样就足够了(另请参阅Time complexity with examples中的示例4),将代码重写为单个循环是有帮助的,这样我们就可以看到循环添加了一定量的指令(对于内部代码的每次运行):

int i = 0;
int j = 0;

while(i < n) {
    cout << j << endl;
    result++;
    if(j < i * i) j++; //were still in the inner loop
    else {//start the next iteration of the outer loop
        j = 0;
        i++;
    }
}

因此,这两个循环“添加”。两个比较加上if语句,它简单地使条件跳转及其效果更明确。