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)。

  • 相关阅读:
    MySQL存储引擎与索引
    最长公共子序列
    最长递增子序列
    排序算法
    二分查找及其变种
    多线程中锁的种类。
    <LeetCode>136. 只出现一次的数字
    <LeetCode>121. 买卖股票的最佳时机
    Netty 粘包/拆包应用案例及解决方案分析
    微服务
  • 原文地址:https://www.cnblogs.com/event/p/4188335.html
Copyright © 2011-2022 走看看