我理解简单的陈述,如:
int x = 5; // is 1 or O(1)
和while循环如:
while(i<); // is n+1 or O(n)
与单个for循环相同(取决于)。 使用嵌套的while或for循环,例如:
for(int i = 0; i<n; i++){ // this is n + 1
for(int j = 0; j<n; j++){ // this is (n+1)*n, total = O(n^2)
}
此外,只要我们有双倍效果,它就是log_2(n),三倍效果log_3(n)等等。如果控制变量被减半或被分成几乎也是log_2(n)或log_4(n)。
但我正在处理更复杂的例子。如何看待这些例子。我有答案我只是不知道如何在纸上进行考试。
例1:
for (i = 1; i < (n*n+3*n+17) / 4 ; i += 1)
System.out.println("Sunshine");
例2:
for (i = 0; i < n; i++)
if ( i % 2 == 0) // very confused by what mod would do to runtime
for (j = 0; j < n; j++)
System.out.print("Bacon");
else
for (j = 0; j < n * n; j++)
System.out.println("Ocean");
示例3:
for (i = 1; i <= 10000 * n: i *= 2)
x += 1;
谢谢
答案 0 :(得分:1)
示例1受术语O(n^2)
限制,因此应为O(n^2)
。这是n^2
的原因是因为表达式中最大且占主导地位的术语是i
。
第二个例子有点棘手。 n
中的外循环将迭代i
次,但内部执行的内容取决于n
的值是奇数还是偶数。偶数时,发生n^2
上的另一个循环,但是当奇数O(n^3)
中的循环发生时。奇怪的情况最终将主导运行时间,因此示例2应为10000*n
。
第三个示例迭代直到命中i
,但是通过在每一步加倍循环计数器O(lgn)
来实现。这将具有lg
性能,其中n=32
表示日志库2.为了了解原因,想象一下我们想要i=1
,从lg(32)
开始,每次加倍。好吧,我们将有2,4,8,16和32,即6步,增长为{{1}}。