复杂度分析

什么是复杂度分析?

数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间,因而需要从执行时间和占用空间两个维度来评估代码的性能问题。

复杂度也叫渐近复杂度,包括时间复杂度和空间复杂度,用来分析算法的执行效率(或占用空间)与数据模块的增长关系,可以粗略表示,越高阶复杂度的算法,执行效率越低。


为什么要进行复杂度分析?

1、和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。

2、掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。

3、事后统计法的测试结果非常依赖测试环境,且测试结果受数据规模的影响很大。

    事后统计法:把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。


 如何进行复杂度分析?

大O时间复杂度表示法

算法的执行时间与每行代码执行次数的总和成正比,用T(n) = O(f(n))表示,其中T(n)表示算法执行总时间,f(n)表示每行代码执行次数的总和,n表示数据的规模。

大O时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据增长的变化趋势。

以时间复杂度为例,由于时间复杂度描述的是算法执行时间与数据规模的增长变化趋势,所以常量阶、低阶以及系数实际上对这种增长趋势不产决定性影响,所以在做时间复杂度分析时忽略这些项。


时间复杂度分析方法

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

    我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。

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. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积


几种常见复杂度分析

多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n^2)(平方阶)、O(n^3)(立方阶)


非多项式阶:当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。包括,O(2^n)(指数阶)、O(n!)(阶乘阶)


O(1)

只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度我们都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是O(1)。


O(logn)、O(nlogn)

在采用大 O 标记复杂度的时候,可以忽略系数,即 O(Cf(n)) = O(f(n))。

在对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为 O(logn)


O(m+n)、O(m*n)

代码的复杂度由两个数据的规模来决定,即T1(m) + T2(n) = O(f(m) + g(n))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章