时间复杂度
表示代码执行时间随主句规模增长的变化趋势,即:渐进时间复杂度。常用的方法:
1. 只关注循环执行次数最多的一段代码
2. 加法法则:
总复杂度等于量级最大的那段代码的复杂度
将代码块根据循环进行划分,然后计算每个部分的时间复杂度,再选取一个量级最大的作为整段代码的复杂度,举例如下:
func f(n int) {...// sum_1for i:=0;i<100;i++ {// todo}...// sum_2for i:=0;i<n;i++{// todo}...// sum_3for i:=0;i<n;i++{for j:=0;j<n;j++{// todo}}}
分块分析:
sum_1 -> O(1)
sum_2 -> O(n)
sum_3 ->O(n^2)
最终时间复杂度为:
O(n^2)
3. 乘法法则
嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
如上述代码中sum_3部分的时间复杂度
4. 几种常见时间复杂度实例
- O(1)
一般代码中不存在循环、递归语句,例如:i + j
- O(logn)、O(nlogn)
举例:
var i = 1
for i < n {
i = i * 3
}
- O(m+n)、O(m*n)
空间复杂度
表示算法的存储空间与数据规模间的增长关系。
常见的有:O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)
