数据结构与算法必备知识点:复杂度
一般来说,复杂度可以分为 时间复杂度 和 空间复杂度 ,有时还会有 编码复杂度 。
1.时间复杂度
时间复杂度是算法需要执行基本运算的次数所处的等级。基本运算类似于加减乘除这种计算机可以直接实现的运算。
举个简单的例子,下面是一个for循环,用来计算数组a中元素的和:
for(int i =0 ; i < n; i++){
sum = sum + a[i];
}
就这段代码来说,for
循环执行了n次,因此共有n次运算,而下面的代码加了两次a[i]
,因此共有2n次运算。
for(int i =0 ; i < n; i++){
sum = sum + a[i];
sum = sum + a[i];
}
n次基本运算与2n次基本运算当n的规模增大时的增长趋势都是相同的(都是线性增长),所以把 O(n) 称作上面两段代码的时间复杂度
再来看一段代码:
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
sum += a[i][j];
}
}
这段代码的时间复杂度为 O( n 2 n^2 n2), 基本运算次数为 n 2 n^2 n2 。
在时间复杂度中,高等级的幂次会覆盖低等级的幂次,
因此 O(
3
n
2
3n^2
3n2+n+2) = O(
3
n
2
3n^2
3n2) = O(
n
2
n^2
n2) 成立
除了上面这些,还有各种各样的时间复杂度。常数复杂度 O(1) 表示算法消耗的时间不随规模的增长而增长。
常用时间复杂度的大小比较:
O(1)<O(
l
o
g
n
log_n
logn)<O(n)<O(
n
2
n^2
n2)
2.空间复杂度
和时间复杂度类似的写法,表示算法需要消耗的最大数据空间。
例如对于某个算法来说,如果其消耗的最大数据空间是一个二维数组,那么这个算法的空间复杂度是O(
n
2
n^2
n2)
3.编码复杂度
编码复杂度是一个定性的概念,并没有什么量化的标准。对于一个问题来说,如果用了冗长的算法思想,那么代码量就会非常巨大,其编码复杂度就会非常大。