算法复杂度

2020-02-28  本文已影响0人  yunfeichen119

1 时间复杂度

以算法中基本操作的重复执行次数作为算法的时间复杂度。一般不必精确计算出算法的时间复杂度,只要大致计算出相应的数量级即可。

1.1 大 O 复杂度表示法

大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示
代码执行时间随数据规模增长的变化趋势,所以,也叫作'渐进时间复杂度'
简称'时间复杂度'

当 n 很大时公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。我们只需要记录一个最大量级就可以了。

1.2 如何分析时间复杂度

大 O 复杂度表示无穷大渐近,因此是一种变化趋势的表现,通常会忽略掉
公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了,因此
分析一个算法、一段代码的时间复杂度的时候,也只关注'循环执行次数最多'的
那一段代码就可以了

1.2.1 数列知识

累加法:递推关系式为an+1−an=f(n)an+1−an=f(n)采用累加法。
累乘法:递推关系式为an+1an=f(n)an+1an=f(n)采用累乘法。
构造法:递推关系式为(1)aa+1=pan+qaa+1=pan+q,(2)aa+1=pan+qnaa+1=pan+qn,都可以通过恒等变形,构造出等差或等比数列,利用等差或等比数列的定义进行解题,其中的构造方法可通过待定系数法来进行。
和化项法:递推公式为Sn=f(n)Sn=f(n)或Sn=f(an)Sn=f(an)一般利用
an={S1,Sn−Sn−1,当n=1当n>=2
an={S1,当n=1Sn−Sn−1,当n>=2
用特征方程求解递推方程(感觉比较生僻,不做解释)
迭代法: 从原始递推方程开始,反复将对于递推方程左边的函数用右边的等式代入,直到得到初值,然后将所得的结果进行化简。
例如在调用归并排序mergeSort(a,0,n-1)对数组a[0...n−1]a[0...n−1]排序时,执行时间T(n)T(n)的递推关系式为:
T(n)={O(1),2T(n2)+O(n),当n=1当n>=2
T(n)={O(1),当n=12T(n2)+O(n),当n>=2

其中,O(n)O(n)为merge()所需要的时间,设为cncn(c为正常量)。因此:
T(n)=2T(n2)+cn=2(2T(n4)+cn2)+cn=22T(n4)+2cn=23T(n8)+3cn=...=2kT(n2k)+kcn=nO(1)+cnlog2n=O(nlog2n),(假设n=2k,则k=log2n)

2 空间复杂度

算法在运行过程中临时占用的存储空间的大小,一般以数量级的形式给出。

3 参考

https://www.geeksforgeeks.org/analysis-algorithms-big-o-analysis/

https://blog.csdn.net/so_geili/article/details/53444816

https://www.cnblogs.com/reposkeeper-wx/p/suan-fa-xi-lie-zhi-liu-suan-fa-shi-jian-fu-za-du-j.html

https://www.kancloud.cn/cyyspring/python_leetcode/1317163

https://www.cnblogs.com/nwnu-daizh/p/8652285.html

上一篇 下一篇

猜你喜欢

热点阅读