数据结构与算法笔记(1)复杂度分析

算法复杂度分析

一、什么是复杂度分析?

  • 对算法运行所需要时间的分析叫时间复杂度分析
  • 对算法运行时所占用的空间的分析叫空间复杂度分析

二、 为什么需要复杂度分析?

  • 1.测试结果非常依赖测试环境
  • 2.测试结果受数据规模的影响很大 *

三、怎么对复杂度进行分析?

  • 1. 只关注循环次数最多的一段代码

    大O这种复杂度表示方法只是一种变化趋势。我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。所以,我们在分析一个算法、一段代码的时间复杂度的时候,只关注循环执行次数最多的那一段代码就可以了。

  • 2. 加法法则:总复杂度等于量级最大的那段代码的复杂度

    如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n)))=O(max(f(n), g(n))).

  • 3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

    如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么T(n)=T1(n)T2(n)=O(f(n))O(g(n))=O(f(n)*g(n)).也就是说,假设 T1(n) = O(n),T2(n) = O(n ),则 T1(n) * T2(n) = O(n )。落实到具体的代码上,我们可以把乘法法则看成是嵌套循环

复杂度量级

  • 常量级别 O(1)
  • 对数阶级 O(logn)
  • 线性阶 O(n)
  • 线性对数阶 O(nlogn)
  • 平方阶 O(n^2)、立方阶O(n^3)...k次方阶 O(n^k)
  • 指数阶O(2^n)
  • 阶乘阶O(n!)

    对于刚罗列的复杂度量级,我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2 ) 和 O(n!)。 我们把时间复杂度为非多项式量级的算法问题叫作NP(Non-DeterministicPolynomial,非确定多项式)问题。当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。

空间复杂度

  我们常见的空间复杂度就是 O(1)、O(n)、O(n ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。

最好、最坏、平均、均摊时间复制度

  • 最好时间复杂度

    最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂

  • 最坏时间复杂度

    最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度

  • 平均情况时间复杂度

    用代码在所有情况下执行的次数的加权平均值表示

  • 均摊时间复杂度

    在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。

posted @ 2019-10-24 19:23  漫长的告别  阅读(323)  评论(0编辑  收藏  举报