Big O表示法运行时

我已经获得了一些代码来解决他们的大O运行时间,有人可以告诉我,我是否在正确的轨道上?

//program1 int i, count = 0, n = 20000; for(i = 0; i < n * n; i++) { count++; } 

是O(n ^ 2)?

 //number2 int i, inner_count = 0, n = 2000000000; for(i = 0; i < n; i++) { inner_count++; } 

这是一个O(n)?

 //number3 for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { count++; } } 

为O(n ^ 2)?

 //number4 for(i = 0; i < n; i++) { for(j = 0; j < i; j++) { for(k = 0; k < j; k++) { inner_count++; } } } 

是O(n ^ 3)?

 //number5 int i, j, inner_count = 0, n = 30000; for(i = 0; i < n; i++) { for(j = 0; j < i; j++) { inner_count++; } } 

那是一个O(n ^ 3)?

 //number6 int i, j, k, l, pseudo_inner_count = 0, n = 25; for(i = 0; i < n; i++) { for(j = 0; j < i*i; j++) { for(k = 0; k < i*j; k++) { pseudo_inner_count++; for(l = 0; l < 10; l++); } } } 

非常困惑这一个O(n ^ 3)??

 //number7 int i, j, k, pseudo_inner_count = 0, n = 16; for(i = n; i > 1; i /= 2) { for(j = 0; j < n; j++) { pseudo_inner_count++; for(k = 0; k < 50000000; k++); } } 

上)? (随着他们越来越难,我越来越迷茫)

 //number8 int i, j, pseudo_inner_count = 0, n = 1073741824; for(i = n; i > 1; i /= 2) { pseudo_inner_count++; for(j = 0; j < 50000000; j++); } 

为O(n ^ 2)?

还有一个我没看到,完全不知道{

  int i, wrong_count = 0, n = 200; for(i = 0; i < square(n); i++) { wrong_count++; } printf("%d %d\n", wrong_count, square(wrong_count)); return 0; } int square(int m) { int i, j = 0; for(i = 0; i < m * m; i++) { j++; } return j; } 

如果有人能够澄清这些并帮助我更好地理解它们,我将非常感激。

  • number5是O(N ^ 2)
  • number6是O(N ^ 6)
  • number7是O(N * logN)
  • number8是O(logN)

其余似乎是正确的。

尝试了解作为N的函数完成了多少操作,所有常量操作,例如

 for (int i = 0; i < 333333333; ++i) { j++; } 

事实上是O(1)

number5 = O(n ^ 2) – 第二个循环从1变为小于n的数,包括n,因此它基本上是1..n或O(n)。

number6 = O(n ^ 6) – 第二个循环是n ^ 2,第三个循环是n ^ 3(n * n ^ 2)。 第四个内循环是O(1)所以它不算数。

number7 = O(n log n) – 第一个循环是O(log2(n))(因为你继续将索引除以2),第二个循环是O(n)1..n,内循环是再次O(1)因为它不依赖于n。

number8 = O(log n) – 与上述相同的原因。

其余的都很好。

如果我的快速跟踪正确,您对5,6,7和8的答案是不正确的。
下面是8的痕迹

 1: int i, j, pseudo_inner_count = 0, n = 1073741824; 2: 3: for(i = n; i > 1; i /= 2) 4: { 5: pseudo_inner_count++; 6: for(j = 0; j < 50000000; j++); 7: } 

因此,第5行是一个基本的操作,因此O(1)与第3行中的检查和赋值相同。第6行看起来像是一个大的东西,但因为它总是将是50000000,所以它是一个恒定的时间操作O(1)也让我们考虑这个shell:

 1: int i, j, pseudo_inner_count = 0, n = 1073741824; 2: 3: for(i = n; i > 1; i /= 2) 4: { 5: } 

我不是免费做某人的功课,但我会完成这一项,减少i的方法是两个分区的意思,它将需要log_2操作达到1,给出O的运行时间( log(n))