zoukankan      html  css  js  c++  java
  • 算法的时间复杂度与空间复杂度分析

    T(n) = O(fn)
    

    所有代码的执行时间T(n)与每行代码的执行次数n成正比
    大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

    时间复杂度分析

    1. 只关注循环执行次数最多的一段代码
    2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
    3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

    常量阶O(1)
    一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

    int i = 8; 
    int j = 6; 
    int sum = i + j;
    

    对数阶O(logn)

    i=1; 
    while (i <= n) {
        i = i * 3; 
    }
    

    x=log3n,这段代码的时间复杂度就是 O(log3n)。 在采用大 O 标记复杂度的时候,可以忽略系数,即 O(Cf(n)) = O(f(n))
    所以,这段代码的时间复杂度就是 O(logn)

    线性阶O(n)

     int cal(int n) {
       int sum = 0;
       int i = 1;
       for (; i <= n; ++i) {
         sum = sum + i;
       }
       return sum;
     }
    

    4,5行代码都执行了n次,所以总的时间复杂度就是O(n)

    线性对数阶O(nlogn)
    线性阶循环中嵌套对数阶循环

    平方阶O(n^2) 立方阶O(n^3) K次方阶O(n^k)

    int cal(int n) {
       int ret = 0; 
       int i = 1;
       for (; i < n; ++i) {
         ret = ret + f(i);
       } 
     } 
     
     int f(int n) {
      int sum = 0;
      int i = 1;
      for (; i < n; ++i) {
        sum = sum + i;
      } 
      return sum;
     }
    

    内层执行了n次,外层也执行了n次,利用乘法法则 这里的时间复杂度是T(n) = T1(n) * T2(n) = O(n*n) = O(n2)

    指数阶O(2^n),阶乘阶O(n!)
    这俩都是非多项式时间复杂度
    当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法

    空间复杂度分析

    空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

    void print(int n) {
      int i = 0;
      int[] a = new int[n];
      for (i; i <n; ++i) {
        a[i] = i * i;
      }
    
      for (i = n-1; i >= 0; --i) {
        print out a[i]
      }
    }
    

    第 3 行申请了一个大小为 n 的 int 类型数组,除此之外,剩下的代码都没有占用更多的空间,所以整段代码的空间复杂度就是 O(n)。

    我们常见的空间复杂度就是 O(1)、O(n)、O(n2),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。所以,对于空间复杂度,掌握刚我说的这些内容已经足够了。

  • 相关阅读:
    POJ 2723 Get Luffy Out(2-SAT)
    ZOJ 3613 Wormhole Transport
    HDU 4085 Peach Blossom Spring
    NBUT 1221 Intermediary
    NBUT 1223 Friends number
    NBUT 1220 SPY
    NBUT 1218 You are my brother
    PAT 1131. Subway Map (30)
    ZSTU OJ 4273 玩具
    ZSTU OJ 4272 最佳淘汰算法
  • 原文地址:https://www.cnblogs.com/jesse131/p/12731898.html
Copyright © 2011-2022 走看看