时间复杂度和空间复杂度
作用:粗略地估计算法的执行效率的方法
时间复杂度
规律:所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。
公式:T(n) = O(f(n))
其中T(n)代码执行的时间;n表示数据规模的大小;f(n)表示每行代码执行次数的总和;
时间复杂度: 表示代码执行时间随数据规模增长的变化趋势。时间复杂度实际上并不具体表示代码真正的执行时间。
分析时间复杂度的方法:
- 只关注循环执行次数最多的一段代码
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
复杂的度量级:
多项式量级
- 常量阶 O(1) 一般情况下,只要算法中不存在循环语句、递归语句。
- 对数阶 O(logn)
- 线性阶 O(n)
- 线性对数阶 O(nlogn)
- 平方阶 O(n^2),立方阶 O(n^3), K次方阶O(n^k)
非多项式量级
- 指数阶 O(2^n)
- 阶乘阶 O(n!)
时间复杂度四个维度
- 最好情况时间复杂度(best case time complexity) 在最理想的情况下,执行这段代码的时间复杂度
- 最坏情况时间复杂度(worst case time complexity) 最糟糕的情况下,执行这段代码的时间复杂度
- 平均情况时间复杂度(average case time complexity) 加权平均时间复杂度
- 均摊时间复杂度(amortized time complexity)
均摊时间复杂度就是一种特殊的平均时间复杂度
空间复杂度
空间复杂度全称就是渐进空间复杂度asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。