数据结构和算法解决的是“快”和“省”的问题,即如何让代码运行的更快,如何让代码更省存储空间。对应的,执行效率就是考量算法的一个很是重要的指标。咱们可使用时间复杂度分析和空间复杂度分析来考量算法的执行效率。算法
把一段代码跑一遍,经过统计、监控就能获得算法执行的时间和占用的内存大小,这种分析方法叫作过后统计法。数据结构
过后统计法的局限性:数据结构和算法
1.测试结果很是依赖测试环境post
2.测试结果受数据规模的影响很大测试
因为过后统计法的局限性,须要一个不用具体数据来测试,就能够粗略地估计算法的执行效率的方法,那就是时间、空间复杂度分析方法。内存
全部代码的执行时间T(N)与每行代码的执行次数n成正比=>T(n)=O(f(n))get
T(n)表示代码执行的时间;n表示数据规模的大小;f(n)表示每行代码执行的次数总和。由于是一个公式,因此用f(n)表示;公式中的O表示代码的执行时间T(n)与f(n)表达式成正比。效率
大O时间复杂度表示法并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增加的变化趋势,所以也叫做渐进时间复杂度,简称时间复杂度。监控
当n很大时,公式中的低阶、常量、系数三部分并不左右增加趋势,因此均可以忽略,只须要记录一个最大量级就能够了。循环
如何分析一段代码的时间复杂度?下述有三个比较实用的方法。
一、只关注循环最多的一段代码
正如大O复杂度表示方法只是表示一种变化趋势,咱们一般会忽略掉公式中的常量、低阶、系数,只须要记录一个最大阶的量级就能够了。因此在分析一个算法、一段时间复杂度的时候,也只关注循环次数最多的那一段代码就能够了。
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
3.乘法法则:嵌套代码的总复杂度等于嵌套内外代码复杂度的乘积
复杂度量级(按数量级递增)
1. 常数阶 O(1)
2. 对数阶 O(logn)
3. 线性阶 O(n)
4. 线性对数阶 O(nlogn)
5. 平方阶 O(n2)、立方阶 O(n3)...k次方阶 O(nk)
6. 指数阶 O(2n)
7.阶乘阶 O(n!)
上述量级粗略可非为两类 多项式量级和非多项式量级
其中 非多项式量级只有两个 指数阶O(2n)和阶乘阶O(n!)
当数据规模n愈来愈大时,非多项式量级的执行时间会急剧增长,求解问题的执行时间会无限增加,所以,非多项式时间复杂度的算法实际上是很是低效的算法。
空间复杂度与时间复杂度的概念相相似,时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增加关系,类比一下,空间复杂度全称是渐进空间复杂度,表示算法的存储空间与数据规模之间的增加关系。
复杂度也叫渐进复杂度,包括时间和空间复杂度,用来分析算法的执行效率和数据规模之间的增加关系,能够粗略地表示,越高阶复杂度的算法,执行效率越低。经常使用的复杂度并很少,从低阶到高阶有:O(1),O(logn),O(n),O(nlogn),O(n2)