繁体   English   中英

时间复杂度

[英]Time complexity

我试图找出这些程序的时间复杂性,但不确定它们是否好。

我认为这是O(n)

static void P1(int n ){
   for (int i=1; i<=n; i++) {
      Procedure();
}

我认为这是O(n ^ 2)

static void P2(int n) {
   for(int i=1; i<=n; i++) 
    for(int j=1; j<=n; j++)
      Procedure();
}

O(n)+ O(n)

static void P3(int n) {
   for (int i = 1; i <= n; i++)
     Procedure();
   for (int i = 1; i <= n; i++)
     Procedure();
}

100 + n + 100?

static void P4(int n) {
   for ( int i = 1; i <= 100; i++)
     for (int j = 1; j <= n; j++)
       for (int k = 1; k <= 100; k++)
         Procedure();
}

O(n * i)?

static void P5(int n) {
   for ( int i = 1; i <= n; i++)
     for (int j = 1; j <= i; j++)
       Procedure();
}

static void P6(int n) {
   for (int i = 1; i <= n/2; i++)
     for ( int j = 1; j <= n/4; j++)
       for (int k = 1; k <= n/8; k++)
         Procedure();
}

如果Procedure()为O(1),则:

我认为这是O(n) 正确的

static void P1(int n ){
   for (int i=1; i<=n; i++) {
      Procedure();
}

我认为这是O(n ^ 2) 正确的

static void P2(int n) {
   for(int i=1; i<=n; i++) 
    for(int j=1; j<=n; j++)
      Procedure();
}

O(n)+ O(n) 正确,但O(n + n)= O(2n)= O(n)

static void P3(int n) {
   for (int i = 1; i <= n; i++)
     Procedure();
   for (int i = 1; i <= n; i++)
     Procedure();
}

100 + n + 100? false,它被相乘:O(100 * n * 100)= O(n)

static void P4(int n) {
   for ( int i = 1; i <= 100; i++)
     for (int j = 1; j <= n; j++)
       for (int k = 1; k <= 100; k++)
         Procedure();
}

O(n * i)? 您不能使用i,它没有确切的价值。 如果您查看执行内部循环的次数,则为1+2+3+4+...+n-3+n-2+n-1 ,即n*(n-1)/2 ,您可以乘以它: n*(n-1)/2=n^2/2-n/2渐近n^2/2-n/2=Theta(n^2)

结果是O(n ^ 2)

static void P5(int n) {
   for ( int i = 1; i <= n; i++)
     for (int j = 1; j <= i; j++)
       Procedure();
}

n / 2 * n / 4 * n / 8 = n ^ 3/64 = O(n ^ 3)

static void P6(int n) {
   for (int i = 1; i <= n/2; i++)
     for ( int j = 1; j <= n/4; j++)
       for (int k = 1; k <= n/8; k++)
         Procedure();
}

时间复杂度

static void P3(int n){
   for (int i = 1; i <= n; i++)
     Procedure();
   for (int i = 1; i <= n; i++)
     Procedure();
}

可以写为O(2n)的函数,因为我们需要消除常数,它变成O(n)

时间复杂度

static void P4(int n) {
   for ( int i = 1; i <= 100; i++)
     for (int j = 1; j <= n; j++)
       for (int k = 1; k <= 100; k++)
         Procedure();
}

100 + n + 100 => O(n * 100 * 100)=> O(n)

时间复杂度

static void P6(int n) {
   for (int i = 1; i <= n/2; i++)
     for ( int j = 1; j <= n/4; j++)
       for (int k = 1; k <= n/8; k++)
         Procedure();
}

是O(n ^ 3)

请记住,我们不是在计算计算机使用时间复杂度执行的指令数。 Big-O只是告诉我们执行时间如何随着输入的增加或减少而变化。

考虑阅读时间复杂性

暂无
暂无

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

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