算法复杂度分析

1.时间复杂度:

什么是Big O:O(f(n))表示运行算法所需要执行的指令数,和f(n)成正比。n表示数据规模

算法复杂度分析_第1张图片

例:

算法复杂度分析_第2张图片

随着输入规模n的增大,时间复杂度的增长模式

算法复杂度分析_第3张图片


算法复杂度分析_第4张图片算法复杂度分析_第5张图片


算法复杂度分析_第6张图片


2.数据规模概念:

该时间针对的是简单的求和运算,针对算法在该基础上大约除10即可

算法复杂度分析_第7张图片


3.空间复杂度:

算法复杂度分析_第8张图片

递归的深度是多少,空间复杂度就是多少

算法复杂度分析_第9张图片


4.常见的复杂度分析

O(1)

算法复杂度分析_第10张图片


O(n):一般存在一个for循环且与n有关

算法复杂度分析_第11张图片

算法复杂度分析_第12张图片


O(n^2):一般是双重循环且都与n有关,注意增量

算法复杂度分析_第13张图片


O(logn):

二分查找法:

算法复杂度分析_第14张图片

算法复杂度分析_第15张图片

整形转成字符串:

算法复杂度分析_第16张图片

其他:

O(nlogn):虽然是双循环,但是外循环增量是logn级别

算法复杂度分析_第17张图片

O(sqrt(n)):

算法复杂度分析_第18张图片


5.递归算法的复杂度分析

不是有递归的函数就一定是O(nlogn)

如果递归函数中,

只进行一次递归调用,递归深度为depth,在每个递归函数中,时间复杂度为T,则总体时间复杂度为O(T*depth)

算法复杂度分析_第19张图片算法复杂度分析_第20张图片

进行多次递归调用,建立一棵递归树

该函数的递归,在n=3时,有1次f(3),有2次f(2)递归,4次f(1)递归,8次f(0)递归,调用次数就是递归树的节点数(即调用深度)

算法复杂度分析_第21张图片算法复杂度分析_第22张图片

归并排序算法属于分而治之,其两次递归,排序时间复杂度是logn级别,每一层递归其节点总数n=8没有改变,所以其时间复杂度是nlogn

算法复杂度分析_第23张图片


6.均摊复杂度分析(动态数组、动态栈、动态队列)

动态数组:每一次push耗费O(1),当达到容量n时,resize数组(扩充或缩减)容量耗费O(n),这些n+1次操作耗费O(2n)的时间,均摊下来就是O(2)即O(1)级别。缩减时为了避免复杂度震荡(在数组元素个数为n时,重复着添加元素删除元素,反复扩充或缩减,使复杂度变为O(n)),因此需要当元素个数缩减至1/4时才resize,给添加元素留出余地

算法复杂度分析_第24张图片算法复杂度分析_第25张图片算法复杂度分析_第26张图片

算法复杂度分析_第27张图片算法复杂度分析_第28张图片

你可能感兴趣的:(浅谈数据结构)