复杂度是什么?
复杂度是衡量代码运行效率的重要衡量因素。
复杂度包括两个方面的负责度:时间复杂度、空间复杂度。
大 O 表示法 (Big O)
- 一般用大 O 表示法来描述复杂度,它表示的是数据规模 n 对应的复杂度
- 忽略常数、系数、低阶
- 9 >> O(1)
- 2n + 3 >> O(n)
- n^2 + 2n + 3 >> O(n^2)
- 4n^3 + 3n^2 + 2n + 1 >> O(n^3)
- 对数阶一般省略底数,统称为 logn
- O(1) < o(logn) < O(n) < O(nlogn) < O(n^2) < O(n3)<O(2n)
注意: 大 O 表示法仅仅是一种粗略的分析模型,是一种估算,能帮助我们快速了解一个算法的执行效率。
对比图:
计算方法
单个数据规模
function static void test (int n){
//执行次数: n + n + 1 + n = 3n => O(n)
for(int i = 0 ; i < n ; i ++){
System.out.println('test');
}
}
function static void test (int n){
//执行次数: n * n = n^2 => O(n^2)
for(int i = 0 ; i < n ; i ++){
for (int j = 0 ; j < n ; j ++){
System.out.println('test');
}
}
}
多个数据规模的情况
function static void test (int n,int k){
//执行次数: n + k => O(n + k)
for(int i = 0 ; i < n ; i ++){
System.out.println('test');
}
for(int i = 0 ; i < k ; i ++){
System.out.println('test');
}
}
对于多个数据规模的,不能省略。
总结
时间复杂度与代码的结构设计高度相关。
空间复杂度与代码中数据结构的选择高度相关