算法复杂度分析
本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。
是什么
什么是算法复杂度分析?
- 通过时间和空间两个维度来评估算法和数据结构的性能。
- 用时间复杂度 (时间渐进复杂度) 和空间复杂度 (空间渐进复杂度)两个概念来描述性能问题,统称复杂度。
- 算法复杂度描述的是算法执行时间以及占用空间与数据规模的关联关系
- 算法复杂度分析是理论上的分析
为什么
为什么要做算法复杂度分析
- 有种性能分析叫做 ‘事后统计法’ 该方法是在程序结束之后根据记录的运行时间,内存占用情况,分析出系统的性能。该方法的局限性就是极度依赖测试环境,测试数据的规模对测试结果影响很大。
- 算法复杂度分析则不依赖于测试环境,成本低,效率高
- 算法复杂度分析帮助我们了解程序的性能,指导我们编写高效率的代码
怎么办
如何表示时间算法复杂度
- 用 T(n) = O(f(n)) 表示,其中 T(n) 表示代码执行的时间; n 表示数据规模的大小; f(n) 表示代码执行的总次数,公式中的 O ,表示代码的执行时间 T(n) 与 f(n) 表达式成正比
算法时间复杂度分析方法
- 算法时间复杂度全称:时间渐进复杂度,表示算法的执行时间与数据规模之间增长关系
- 只关注循环次数最多的一段代码
: 如果一段代码中包含一个 for 循环,则我们以 for 循环的执行次数 n 作为该段代码的时间复杂度,记为: O(n) - 嵌套代码的复杂度等于内层与外层代码复杂度之积
: 如果一段代码中包含一个 for 循环,而这个 for 循环体中又包含了一个相同的 for 循环,那么时间复杂度就为: t(n) * g(n) ,假设 t(n) = g(n^2) ,则最终时间复杂度记为: O(n^3) - 只关注复杂度量级最大的那段代码
: 如果一段代码包含两个 for 循环,其中一个 for 循环体中再次包含一个 for 循环,则该段代码的时间复杂度应为:
t(n) + g(n^2) 如果n足够大的时候,则 t(n) 值可忽略不计,只取 g(n^2) 的值,那么时间复杂度为: O(n^2)常见算法时间复杂度实例
- 常量阶 O(1)
- 对数阶 O(logn)
- 线性阶 O(n)
- 线性对数阶 O(nlogn)
- 平方阶 O(n^2) 立方阶 O(n^3)
- 指数阶 O(2^n)
- 阶乘阶 O(n!)
空间复杂度分析方法
- 算法空间复杂度全称:空间渐进复杂度,表示算法的存储空间与数据规模之间增长关系
- 算法空间复杂度分析比较简单直接,只需统计代码运行时需要申请的空间大小。
- 常见的空间复杂度实例有 O(1),O(n),O(n^2)
总结
初入算法复杂度分析,必是步履蹒跚,一路磕磕绊绊跌跌撞撞。看不懂别慌,也别忙着总结,先读五遍文章先,无他,唯手熟尔~
与诸君共勉