为 for 循环确定不同的大 O 复杂度

Posted

技术标签:

【中文标题】为 for 循环确定不同的大 O 复杂度【英文标题】:determining different big O complexity for for loops 【发布时间】:2020-01-16 03:06:53 【问题描述】:
//outer for loop runs at most n times
    for (int w = 1; w < n; w++) 
        // inner for loop at most log(73550/n) times
        for (int y = w; y < 73550; y = y * 2) 
            x = x + w;
        
        k = k * w;
    

我真的很困惑第二个循环是否会增加大 O 时间复杂度,因为它有一个设置的最大迭代?大 O 会是 O(n)、O(nlog(1/n)) 还是两者都不是??

        int p = 0;
        int q = 0;
        //runs at most 18n^2 times
        while (p < 18 * n * n) 
            if (p % 2 == 0) 
                q++;
            
            p++;
        
        //p = 18n^2 q1 = 9n^2
        //runs at most log(9n^2) times
        for (int r = 1; r < q; r = r * 3) 
            q++;
        
        return p * q;

像这样的顺序函数的时间复杂度只是更大的时间复杂度吧?所以它将是 O(n^2) ?

//runs at most n(4n-1) times
for (int k = 2; k <= 2n(4n-1); k+=2) 
    j++;

即使是 -1,时间复杂度也会是 O(n^2) 对吧?

【问题讨论】:

我们不是认为定义复杂度的输入数据集最差吗? 这些循环会终止吗? 是的,值 n 只是传递给函数的一些整数值。 @MitchelPaulin 【参考方案1】:

第一种情况:O(n),因为正如您所说,循环迭代的次数是恒定的。在循环边界上具有非常大的常数并不典型,因此在大多数自然算法中这并不是什么大问题。如果 73550 实际上是一个非常量变量,但与 n 无关,我们可以给它一个名称(例如 m),并说复杂度是 O(n*log(m))

第二种情况:是的,O(n^2),因为你给的原因。

第三种情况:是的,O(n^2)。首先,big-O 只提供了一个上限,因此 -1 只会更容易保证上界。其次,即使你的意思是Ө(n^2),它仍然是,因为n(4n-1) = 4n^2-n,对于某些常数k,它渐近大于k*n^2。在这种情况下,任何小于 4 的k

【讨论】:

感谢您的帮助和澄清。它有很大帮助:)

以上是关于为 for 循环确定不同的大 O 复杂度的主要内容,如果未能解决你的问题,请参考以下文章

for 循环的大 O 表示法简单问题

我不完全确定这个 [重复] 的大 O 复杂性

while 循环的时间复杂度

算法优化分析---打印素数

确定代码段的时间复杂度

这个函数(for循环)空间复杂度是O(1)还是O(n)?