【问题标题】:Big-O runtime of while-loop with nesten if-statements带有嵌套 if 语句的 while 循环的 Big-O 运行时
【发布时间】: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 表示法的性质,循环体中发生的事情并不重要,但更多的是需要多少次迭代。这将决定整体的复杂性。

标签: java time-complexity runtime 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)) 中。

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

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2012-12-02
    相关资源
    最近更新 更多