【问题标题】:Why is the time complexity O(n^2) in this code?为什么这段代码的时间复杂度是 O(n^2)?
【发布时间】:2018-12-12 05:34:42
【问题描述】:

我只是没明白,为什么时间复杂度是 O(n^2) 而不是 O(n*logn)? 第二个循环每次递增 2 所以不是 O(logn) 吗?

void f3(int n){
  int i,j,s=100;
  int* ar = (int*)malloc(s*sizeof(int));

  for(i=0; i<n; i++){
    s=0;
    for(j=0; j<n; j+=2){
      s+=j;
      printf("%d\n", s);
  }
  free(ar);
}

【问题讨论】:

  • 如果您在每次迭代中乘以 2,则为 O(n log n)。也许这就是你混淆它的原因?
  • @PatrickRoberts 不,我知道区别
  • O-notation 忽略常数乘数。 N*N/2 仍然是 O(N*N)。 N*N/1000 仍然是 O(N*N)。如果内部循环只运行 (log(N)) 次,你只会得到 N*log(N) ;例如,如果它在 N 为 100 时运行两次,在 N 为 1000 时运行 3 次,依此类推。

标签: c loops time-complexity big-o complexity-theory


【解决方案1】:

增量为 2,因此循环将运行 n/2。因此复杂度将为 n*n/2。 如果像 2 这样的 GP 发生增量

【讨论】:

    【解决方案2】:

    外循环将执行 n 次,对于每个外循环迭代,内循环将执行 n/2 次,因为 j +=2

    Order = n×n/2 = n^2/2 =O(n^2) 因为常数不会影响大 n 的运行时间

    【讨论】:

      【解决方案3】:

      通过增加 2 而不是 1,您正在执行以下N*N*(1/2)。使用 big(O) 表示法,您不关心常数,所以它仍然是 N*N。这是因为 big(O) 表示法参考了算法增长的复杂性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 2015-08-22
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        相关资源
        最近更新 更多