带有嵌套 if 语句的 while 循环的 Big-O 运行时

Posted

技术标签:

【中文标题】带有嵌套 if 语句的 while 循环的 Big-O 运行时【英文标题】:Big-O runtime of while-loop with nesten if-statements 【发布时间】:2022-01-09 17:38:48 【问题描述】:

我正在尝试确定这些 code-sn-ps 的 Big-O 表示法:

#1:

public static void printProducts (int n) 
    int a = 0; // O(1)
    int b = n; // O(1)

    // O(n)?
    while (a < b)
        // O(?) This if is checked n times, but how many times is it ran?
        if (a * b == n)  
            System.out.println( a + "*" + b + "=" + a*b ); // O(1)
            a++;                                           // O(1)
            b--;                                           // O(1)
        
        else if ( a * b > n ) 
            b--;                                           // O(1)
        
        else if ( a * b < n ) 
            a++;                                           // O(1)
        
    

#2:

public static void printProducts2 (int n) 
        int a = 1; // O(1)
        int b = n; // O(1)
    
        // O(log n)
        while (a < b)
            if (a * b == n) 
                System.out.println( a + "*" + b + "=" + a*b ); // O(1)
                a++;                                           // O(1)
                b--;                                           // O(1)
            
            else  
                if ( a * b > n ) 
                    b = n/a;                                   // O(log n)
                
                else if ( a * b < n ) 
                    a++;                                       // O(1)
                
            
        
    

我已经得出结论,第一个代码的 Big-O 符号是 O(n),第二个是 O(log n),但我不确定它是否正确。我在正确的轨道上吗?

在提出我自己的问题之前,我曾尝试查看this 问题,但我不太明白它是如何应用在这里的。

【问题讨论】:

由于 Big-O 表示法的性质,循环体中发生的事情并不重要,但更多的是需要多少次迭代。这将决定整体的复杂性。 【参考方案1】:

分别为 O(n) 和 O(sqrt(n))。

第一个确实是 O(n)。您说得对,while 循环运行 O(n) 次,循环内的所有内容都是恒定时间*,因此 if 条件为真的频率并不重要。

第二个更有趣。您正确地指出b 的快速减少使函数不那么复杂。事实上,这个函数的作用是逐步增加a,然后将b 设置为适当的值,这样a*b==n,如果存在这样的b。这意味着b 只能在a 更改时更改,因此至少在进入循环的一半时间内,a 会更改。也就是说,a 每增加一次,循环就会进入固定的次数。

现在我们只需要弄清楚a 增加的频率。当a &gt; b 时循环停止。因为b 等于n/a,这意味着当a 大于n 的平方根时循环停止。因此,函数在 O(sqrt(n)) 中。

* 实际上,除法、乘法和比较数字所需的时间可以随着数字的大小而变化,但我们暂时忽略这一点,因为这似乎不是问题的重点。

【讨论】:

以上是关于带有嵌套 if 语句的 while 循环的 Big-O 运行时的主要内容,如果未能解决你的问题,请参考以下文章

C++ while循环嵌套if语句

Python:在“while”循环中嵌套“If”语句?

if语句,for循环,while循环,do while循环,无限循环,循环嵌套

Python基础之if判断,while循环,循环嵌套

for语句与if语句嵌套的简单应用

带有字典、列表和 If 语句的嵌套循环