计算时间复杂度,我们通常用的 大O表示法, 用O()来记录算法的时间复杂度。
大O表示法有几个规则:
1. 用常数1代替运行时间中的所有常数
2. 在修改运行次数函数中,只保留最高项
3. 如果在最高阶存在且不等于1,则去除与这个项数相乘的常数
例如:
1. 常数阶
``` C
void test(int a){
a = a + 1; //1
}
```
进行了一次运算, 所以时间复杂度记为 O(1)。
```
void test(int b){
b = b + 1; //1
b = b * 2; //1
b = b * 3; //1
b = b * 4; //1
}
```
进行了四次运算,按照第一条规则,时间复杂度仍为O(1)。
2、 线性阶
``` C
void test() {
int sum = 0; //1
for(int j = 0; j < n; j ++) { //n+1
sum = sum + 1; //n
}
}
```
进行了2n+2次运算,按照第二条,保留最高项式2n,按照第三条去掉相乘的常数,最终时间复杂度记为O(n)
3、对数阶
``` C
void test(int n){
int count = 1; //1
while (count < n) {
count = count * 2; //log2n次
}
}
```
进行了 log2n+1次运算,按照第二条,保留最高项式log2n, 按照第三条去掉相乘的常数,最终时间复杂度记为O(logn)
4、平方阶
``` C
void add(int n) {
int sum = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j ++) {
sum = sum + 1;
}
}
}
```
进行了n^2次计算, 最终为O(n^2)
总结:
注:后三种哪怕是运算很小的值,都会消耗极大的时间。这种不切实际的时间复杂度一般不会采纳。
1.6、空间复杂度
空间复杂度就是运行某一个算法,需要多少额外的辅助空间来进行这个算法的运行。
如果算法执行时所需要的辅助空间相对于输入数据量是一个常数,则成这个算法原地工作,辅助空间为O(1).
例如:
``` C
int temp = a;
a = b;
b = temp;
```
消耗了额外的一个变量,即空间复杂度为O(1)
``` C
int a[n] = {0};//n为常数
for(int i = 0; i < n;i++){
a[i] = array[n-i-1];
}
for(int i = 0; i < n; i++){
array[i] = a[i];
}
```
消耗了额外的n个空间的数组,即空间复杂度为O(n)