复杂度分析:衡量一个算法的优劣
时间:
大O时间复杂度分析法:
如何一眼看上去就能知道一段代码的复杂度
一个算法和一段代码的执行时间和代码行数成正比
n--代码行数
O--表示代码对函数f(n)成正向趋势
T(n)=O(f(n));
分析方法:
1.只需要关注循环量最多的一点代码
2.加法原则:总复杂度等于量级最高的代码复杂度(代码中出现多段循环体)
3.乘法法则:嵌套代码复杂度等于嵌套内部代码复杂度乘积(循环体出现嵌套时)
常见都时间复杂度:
分为两类,一个叫***多项式时间复杂度***:O(1),O(n),O(n^k), n的k次方阶 O(logn) 对数阶 ,O(nlogn) 线性对数阶
O(m+n) !=O(n),无法确定m和n谁打谁小
最好,最坏,平均时间复杂度
最好:一段代码在最有情况下的时间复杂度,一段代码在最差情况下的时间复杂度,O(1),O(n),平均时间复杂度一般与最坏持平,在特殊场景下分析(最好最坏都一样),一般用不到平均时间复杂度
非多项式时间复杂度:O(2^n),O(n!),当n越来越大的时候,这两者的时间复杂度会急剧增长,因此算法复杂度是以上两者之一
的算法时效率很低
空间:算法运行时占用的空间大小
S(n)=O(f(n)), ( O(1),O(n) 包括几乎所有空间复杂度的情况)
O(n):关注最大开辟的空间,譬如一次new来开辟新的数组,数组里一个元素,n个元素,取O(n)