【问题标题】:Complexity of a code in c programming languagec语言代码的复杂性
【发布时间】:2020-07-01 12:58:23
【问题描述】:

我想知道这段代码的复杂度是 O(n) 还是 O(count*n)?我做了参数计数,它不依赖于参数 n,如您所见:

void change(int A[], int n, int x)
{
  int i, j, count=0;
  for(i=0; i<n; i++)
  {
    if(A[i]==x)
     { count++; }
  }
  
  for(i=0; i<count; i++){
     for(j=0; j<n-i; j++){
         printf("Hello World"):
     }
  }
}

【问题讨论】:

  • "它不依赖于参数 n" - 如果你的 A 数组中充满了值 x,那么它就是。
  • StackOverflow 不是 do-my-homework 服务。您可以先尝试一些实验性 方法:测量时间(参见time(7)),绘制图表,然后尝试猜测。使用 GCC 编译 gcc -Wall -Wextra -O -g 然后使用 GNU gprof
  • @Rup 对不起,我把它改成了 A[i]。
  • @BasileStarynkevitch 如何访问 gcc -Wall -Wextra -O -g。
  • 我想直接回答复杂性而不是这段代码

标签: c loops for-loop if-statement complexity-theory


【解决方案1】:

第一个循环是Theta(n)。第二个循环的时间复杂度(您发现取决于count 的值)是:

T(n) = n + (n-1) + ... + (n-count) = O(n * count)

因此,最终的时间复杂度为O(n * count)。而作为count = O(n),我们可以说时间复杂度是O(n^2)n

【讨论】:

  • 但是因为我们有: T(n) = n + (n-1) + ... + (n-count) 。我们不是取最大的值(n)而忽略其余的吗?
  • 这就是它的工作原理,因为大 O 表示法跟踪最坏情况的复杂性,最坏的情况是 count == n
  • @AhmadIstaitih 我们不知道count 的值。正如我在最坏的情况下所说的那样count = n!因此,最差的时间复杂度是O(n^2),你不能忽略count的值。
  • 如果T()中的元素个数不变,那么每个元素贡献O(n),总数为O(const * n) = O(n)。然而,在这个特定的表达式中,元素的数量本身就是O(n),因此,净复杂度是O(count * n) = O(n * n) = O(n^2)
猜你喜欢
  • 1970-01-01
  • 2014-08-16
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
相关资源
最近更新 更多