繁体   English   中英

如何找到此代码块的时间复杂度(Big O)?

[英]How do I find the time complexity (Big O) of this block of code?

我正在尝试了解这种O表示法是如何工作的,下面有一段代码,在每条LINE旁边,我都会有一个注释,说明时间复杂度。 如果我错了,请纠正我,并解释为什么我的逻辑不正确。

代码#1

for (int i = 0; i < n; i++) <<<<<<<<<<<<<<<<<<< O(1)*O(N)
 {
    for (int j = 0; j < 3; j++) <<<<<<<<<<<<<<< O(1)*O(1)
      {
        for (int k = 0; k < 3; k++) <<<<<<<<<<<<<<O(1)*O(1)
          {
            printf("%d", arr[i]); <<<<<<<<<<<<<<O(1)
           }
        printf("\n"); <<<<<<<<<<<<<<<<<<O(1)
    }

}

将所有内容相加后,运行时间= O(N)。

代码#2

for (int i = 2; i <= n; i++) <<<<<<<<<<<<O(1)*O(N)
{
        int j;<<<<<<<<<<<<<<<<<<<<<<<O(1)
        printf("\n%d:", i);<<<<<<<<<<<<<<O(1)
        for(j = 2; j <= i; j = j * 2) <<<<<<<<<<<O(n-2)??????????
        {
            printf("%d ", j);<<<<<<<<<<<<<<O(1)
        }
         printf("\n%d:", i);<<<<<<<<<<<<<<<<<<<<O(1)
         for(int k = j/2; k >= 2; k = k / 2)<<<<<<<<<<<<<I am not sure of this one
        {
             printf("%d ", k);
        }
  }

运行时间:不确定

总的来说,我很了解它,但是仍然不确定在某些情况下如何使用它。 是否还有其他人提供了有关for循环和while循环的时间复杂度的示例和说明的指南或某种指南?

k的块是O(lg j) ,其中j是O(n) ,所以k是O(lg n) 但是如果考虑整个程序,则为O(n lg n)

规则如下:

  • 循环是迭代次数乘以主体的复杂度
  • 连续的块是复杂性的总和
    • 但是在O()中,仅渐近最大项是相关的,因此您可以立即简化为更高的复杂度
  • 乘法常数无关
  • 几何级数(在j循环与j = j * 2k带环k = k / 2 )具有复杂O(log n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM