【问题标题】:Problems regarding calculation of time complexity of a code关于代码时间复杂度计算的问题
【发布时间】:2014-11-18 18:55:20
【问题描述】:

我知道所有的符号(大 O 和小 o,大欧米茄,小欧米茄)界限和一切。但我还是个新手,我读了这段代码:

   void Function(int n)
    {  int i=1, s=1;
       while(s<=n) 
        { 
          i++;
          s=s+i;
          printf("*");
        }
     }

书上说运行时间是sqrt(n)或者O(sqrt(n))。谁能帮我看看是怎么回事?

【问题讨论】:

  • 分析变量s如何变化。你能想到s的值的封闭式表达式吗?

标签: c performance algorithm big-o time-complexity


【解决方案1】:

在这个算法中,关键是计算while循环执行了多少次。我们称之为x。要找到x,我们必须了解sx 方面的行为。

变量s 最多是序列中第一个x 项的总和(1、2、3...)。那就是:

s = x*(x+1)/2

现在我们必须了解xn 方面的行为。也就是我们需要找到x,如:

x*(x+1)/2 <= n

x*x+x <= 2n

x <= 1/2 * (sqrt(8n+1)-1)

因此,给定一些n,循环将迭代O(1/2 * (sqrt(8n+1)-1)) = O(sqrt(n)) 次。

【讨论】:

    【解决方案2】:

    首先,你要说服自己,问题的边界是ns的增长。

    让我们看看s 的增长速度。每次迭代,i 的当前值会被加,i 本身会加 1。也就是说,在第 j 次迭代中,i==j。

    因此,给定任何迭代,s 的当前值是从 1 到当前i 的总和,大致为i^2,将与n 进行比较。

    因此,迭代次数,本质上是i,将受到n的限制,这就是为什么这里是sqrt(n)的关系。

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 1970-01-01
      • 2022-01-19
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      相关资源
      最近更新 更多