zoukankan      html  css  js  c++  java
  • 详解时间、空间复杂度(内含彩蛋~~)

    学习算法我们首先需要清楚的概念就是时间复杂度空间复杂度
    接下来我们就详细讲解一下时间复杂度和空间复杂度,为大家后面的学习打好基础!

    算法入门书籍挑选点这里~ 帮你快速找到适合自己的算法书籍(详细,内含彩蛋哦~)

    一、时间复杂度:执行算法所需要的计算工作量

    (一)时间复杂度的理解

    1.时间频度定义

    我们需先明白:
    一个 算法花费的时间 是与算法中语句的执行次数正比
    (也就是说一个算法中语句执行次数越多,花费的时间也就越多)

    时间频度:T(n): 一个算法中的语句执行次数,记为T(n)

    2.(渐进)时间复杂度定义

    T(n): 算法中基本操作重复执行的次数是问题规模n的某个函数。
    f(n): 某个辅助函数

    算法的(渐进)时间复杂度O(f(n)):

    若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。

    记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

    O(f(n)) 表示方法称为大O表示法

    注意: T(n)不同,但时间复杂度可能相同。

    (二)时间复杂度的计算

    计算攻略:

    1. 用常数1代替运行时间中的所有加法常数
    (1) T(n)=n2+7n+6 ⇒ T(n)=n2+7n+1
    1. 修改后的运行次数函数中,只保留最高阶项
    (2)T(n)=n2+7n+1 ⇒ T(n)=n2
    1. 去除最高项系数
    (3)T(n)=n2 ⇒ O(n2 )

    注意:

    (1)循环的时间复杂度 = 循环体的复杂度 × 该循环运行次数

    (2)单纯的分支结构(不包括在循环结构中)其时间复杂度为O(1)

    常见的算法时间复杂度由小到大排序:

    常见的算法时间复杂度由小到大依次为:
    O(1):常数阶
    O(logan)【O(log2n)】:对数阶
    O(n):线性阶
    O(nlogan)【O(nlog2n)】:线性对数阶
    O(n2):平方阶
    O(n3):立方阶
    O(nk):k次方阶
    O(2n):指数阶
    随着问题规模n的不断增大,上述时间复杂度越来越大大,算法的执行效率也越来越低

    大O表示法推导实例:

    1.常数阶 ⇒ O(1)
    int n =100;//执行1次
    int sum =n*2;//执行1次
    System.out println(sum);//执行1次
    

    你可能会问代码一共执行了3次鸭,为什么时间复杂度不是O(3)呢?

    这是因为用到了第一条攻略:用常数1代替运行时间中的所有加法常数

    本题中:T(n)=3根据第一条攻略:

    (1) T(n)=3 ⇒ T(n)=1
    (2) T(n)=1 ⇒ O(1)

    在这里插入图片描述

    2.线性阶 ⇒ O(n)
    int i= 0,sum=0;
    for(i=0;i<n;i++){//for循环执行n次
    sum=2*i;//执行一次for循环此语句执行一次
    System.out.println(sum);//执行一次for循环此语句执行一次
    }
    

    所以:T(n)=2n

    第三条攻略: 去除最高项系数

    本例中根据第三条攻略可得

    (1) T(n)=2n ⇒ T(n)=n
    (2) T(n)=n ⇒ O(n)

    在这里插入图片描述

    3.平方阶 ⇒ O(n2)

    例1:

    int i,j=0;
    for(i=0;i<n;i++){//执行n次
    	for(j=0;j<n;j++){//执行n次
    		System.out.println(i + " " + j );
    	}
    }
    

    所以:T(n)=n2

    T(n)=n 2 ⇒ O(n2)

    在这里插入图片描述

    例2:

    int i,j=0;
    for(i=0;i<n;i++){//执行n次
    	for(j=i;j<n;j++){//注意j=i
    		System.out.println(i + " " + j );
    	}
    }
    

    当i=0,第二个for循环执行n次
    当i=1,第二个for循环执行n-1次
    当i=2,第二个for循环执行n-2次
    当i=n-1,第二个for循环执行1次

    执行总数T(n)=n+(n-1)+(n-2)+……1=+=(n 2+n)

    根据第二条攻略、第三条攻略可得:

    第二条攻略:修改后的运行次数函数中,只保留最高阶项
    第三条攻略: 去除最高项系数

    T(n)=(n 2+n) ⇒ T(n)=n 2
    T(n)=n 2 ⇒ O(n2)

    在这里插入图片描述

    二、 空间复杂度:执行这个算法所需要的内存空间

    空间复杂度

    对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。

    n为问题的规模,f(n)为算法所占存储空间的函数。

    空间复杂度分类

    O(1)情况:

    当算法的存储空间大小固定,与输入规模没有直接的关系时,空间复杂度记作O(1)。

    O(n)情况:

    当算法分配的空间和输入规模n成正比时,空间复杂度记作O(n)。

    三、彩蛋

    我将入门算法书中时间复杂度、空间复杂度讲解部分为大家截出来了,有需要的宝宝可以自取。

    链接:https://pan.baidu.com/s/1mrMeuLv11Bf09zrE-DhFLA
    提取码:yw8d

    欢迎大家来公号 “小乔的编程内容分享站” 来找小乔玩~
    一起学习Java基础+算法~
    还有更多资源等你来拿哦~

  • 相关阅读:
    2014年之新年新愿
    C#解析Xml的Dom和Sax方式性能分析
    WCF协议与绑定
    使用SqlServer数据批量插入
    跨站脚本攻击XSS
    疯狂的JSONP
    SQLiteOpenHelper
    Android常用的UI布局
    Android用户界面
    ListView
  • 原文地址:https://www.cnblogs.com/Qpgshare/p/12632688.html
Copyright © 2011-2022 走看看