zoukankan      html  css  js  c++  java
  • 时间复杂度O(n)与空间复杂度O(1)

    把输入规模看成x轴,所花时间/空间看成y轴。
    O(n)就是 y = x, y随x的增长而线性增长。一条斜线
    O(1)就是 y = 1,不管x如何变,y不变。一条与x平行的线

    举个简单的例子,要从0加到n,我们会这么写:
    int sum = 0;
    for(int i = 0; i<=n; ++i)
    {
       sum += i;
    }
    一共算了n次加法,那么就说这个时间复杂度是O(n)。当然O(n)的精确的概念是,是n的最高次方,比如,某个计算共计算了3n + 2次,那么这个时间复杂度也是O(n),因为3n + 2中的最高次方是n。

    如果代码这么写:
    int sum = 0;
    for(int i = 0; i<=n; ++i)
    {
       for(int j = 0; j <=n; ++j)
       {
          sum += (i + j);
       }
    }

    很显然一共算了n^2次加法,那么就说这个时间复杂度是O(n^2),和上面类似,如果某个算法计算了3*n^2 + n + 1次,其时间复杂度仍然是O(n^2),因为3*n^2 + n + 1中最高的次方是n^2

    所谓O(1)就是计算的次数是个常量,我们还以上面从0加到n的例子来说,如果我们用等差数列的公式,那么,代码可以这么写:
    int sum = n * (n + 1) / 2
    不管n有多大(当然不能溢出了),通过上面的公式只需计算一次,也就说计算的次数是不变的,这种情况的时间复杂度就可以说成O(1)。 再比如如果某个计算,不管其他条件怎么变化,均只需计算5次即可得出结果,那么这种情况的时间复杂度,也是O(1)。

  • 相关阅读:
    array_keys
    strval
    is_numeric
    php static延迟静态绑定
    page39 类的访问权限控制
    page34类的继承
    被遗忘在角落的类型检查函数
    2.2.5重写静态变量
    2.2.3使用parent作用域
    16个最棒的WordPress博客写作发布工具【博主桌面工具】
  • 原文地址:https://www.cnblogs.com/event/p/4188335.html
Copyright © 2011-2022 走看看