带有嵌套 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 > b
时循环停止。因为b
等于n/a
,这意味着当a
大于n
的平方根时循环停止。因此,函数在 O(sqrt(n)) 中。
* 实际上,除法、乘法和比较数字所需的时间可以随着数字的大小而变化,但我们暂时忽略这一点,因为这似乎不是问题的重点。
【讨论】:
以上是关于带有嵌套 if 语句的 while 循环的 Big-O 运行时的主要内容,如果未能解决你的问题,请参考以下文章