本系列是极客时间中前 Google 工程师王争《数据结构与算法之美》专栏的学习笔记,想增强数据结构及算法能力的同窗能够直接购买此专栏,跳转连接在此算法
复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构与算法的内容基本上就掌握了一半数据结构
数据结构和算法解决是如何让计算机更快时间、更省空间的解决问题,所以需从执行时间和占用空间两个维度来评估数据结构和算法的性能。数据结构和算法
复杂度描述的是算法执行时间或占用空间与数据规模的增加关系。性能
算法的执行时间与每行代码的执行次数成正比,用 T(n) = O(f(n)) 表示。其中 T(n) 表示算法执行总时间,f(n) 表示每行代码执行总次数,而 n 每每表示数据的规模学习
以时间复杂度为例,因为时间复杂度描述的是算法执行时间与数据规模的增加变化趋势,因此常量阶、低阶以及系数实际上对这种增加趋势不产生决定性影响,故在作时间复杂度分析时忽略这些项。cdn
在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就能够了blog
若是 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)))get
能够把乘法法则当作是嵌套循环:it
若是 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))
多项式阶:随着数据规模的增加,算法的执行时间和空间占用,按照多项式的比例增加。包括, O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n^2)(平方阶)、O(n^3)(立方阶)
非多项式阶:随着数据规模的增加,算法的执行时间和空间占用暴增,这类算法性能极差。包括, O(2^n)(指数阶)、O(n!)(阶乘阶)
代码在最理想的状况下执行的时间复杂度
代码在最坏状况下执行的时间复杂度
用代码在全部状况下执行的次数加权平均值表示
在代码执行的全部复杂度状况中绝大部分是低级别的复杂度,个别状况是高级别复杂度且发生具备时序关系时,能够将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度
本文更可能是本人学习笔记之用,更多详细的讲解及代码,请查看极客时间专栏《数据结构与算法之美》