著名数据专家沃斯曾说:算法+数据结构=程序
引用>上次讲了数据结构
这回就讲讲算法
复杂度
复杂度分析,是贯彻数据结构和算法中的一项基础技能,学习数据结构和算法的目的,无非就是要写出占用空间更小,运行时间更短的代码。
时间复杂度
<李>大O表示法: <代码> T (n)=O (f (n)) 代码> 李>
<李>表示代码执行时间随数据规模增长的 (注意只是表示“变化趋势”)李> <李>由于只是表示变化趋势,一般计算复杂度时,会忽略低阶,常量,系数李>
<李> 几种常见的时间复杂度量级:
李image.png >多项式量级:
<李>常数阶O(1) 李> <李>对数阶O (logn) 李> <李>线性阶O (n) 李> <李>线性对数阶O (nlogn) 李> <李>平方阶O (n2) O (n3)…李O (n ^ k) >
非多项式量级:(n越多,执行时间急剧上升,性能低)
<李>指数阶O (2 ^ n) 李> <李>阶乘阶O (n) 李>
<李>加法法则和乘法法则李>
<李>加法法则:总复杂度等于量级最大的那段代码的复杂度李> <李>乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积李>
<李>平均时间复杂度:李>
<李>也叫加权平均时间复杂度或者期望时间复杂度。李> <李>要会计算:最好,最坏,平均时间李>
<李>均摊时间复杂度李>
<李>特殊的平均时间复杂度李> <李>相当于算法有规律可循,计算时间时,可以把一次耗时多的操纵的时间,均摊给多次耗时少的操纵。李>
算法
1。递归
可以用递归的条件:
<李>一个问题的解可以分解为几个子问题的解李> <李>这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样李> <李>存在递归终止条件李>
写递归算法的思路:
<李>归纳出递归表达式李> <李>寻找终止条件李>
递归代码的弊端:
<李>堆栈溢出李> <李>可能会重复计算李> <李>函数调用耗时多李> <李>空间复杂度高李>
2。排序
<李>执行效率李>
<李>最好时间复杂度李> <李>最坏时间复杂度李> <李>平均时间复杂度李> <李>时间复杂度的系数,常数,低阶(因为排序的数据规模一般不会非常大)李> <李>比较,交换的次数李>
<李>额外内存消耗(内存消耗为O(1)的称为原地排序)李> <李>稳定性,是否是稳定排序(即如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变)李>
<李> O (n2):冒泡排序,插入排序,选择排序李> <李> O (nlogn):归并排序,快速排序李> <李> O (n):桶排序,计数排的序,基数排序(条件苛刻,适用于部分场景)李>
2.1冒泡排序
原理:从下往上,逐次比较两个相邻的数据,如果下面的数据比上面的数据大,则把这两个数据的位置互换。
image.png
image.png<李>最好时间复杂度O (n) 李> <李>最坏时间复杂度O (n ^ 2) 李> <李>平均时间复杂度O (n ^ 2) 李> <李>原地排序,稳定排序李>
2.2插入排序
原理:分为已排区域和未排区域,每次拿未排区域中的第一个数,插入到已排区域中正确的位置。
算法+数据结构=程序,今天就来说说递归+排序+查找,再加上树与图