主要材料来源
时间复杂度
- 概念
- 执行当前算法所消耗的时间(最坏情况的运行时间)
- 推导
O
阶的方法- 用常数
1
取代运行时间中的所有加法常数 - 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是1,则去掉该最高阶项系数。
- 得到的最后结果就是
O
阶
- 用常数
- 常用的时间复杂度所耗费的时间从小到大依次是
O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn) - 常见复杂度量级
- 常数阶
O(1)
:没有循环等复杂结构 - 线性阶
O(n)
:循环 n n n次i = 0 while i <= n: i += 1
- 对数阶
O(log(n))
m m m为常数,则循环次数 x x x: m x = n ⇒ x = l o g m n m^x = n \Rightarrow x = log_m{n} mx=n⇒x=logmn,故量级为: l o g ( n ) log(n) log(n)i = 1 while i <= n: i *= m
- 线性对数阶
O(nlog(n))
:将复杂度为对数阶O(log(n))
的代码循环 n n n次,则其复杂度为: n × l o g ( n ) n \times log(n) n×log(n),即:O(nlog(n))
- 平方阶
O(n²)
:复杂度为O(n)
的代码嵌套循环 - 立方阶
O(n³)
、 k k k次方阶O(n^k)
:同O(n²)
- 常数阶
- 常见排序算法复杂度
排序法 | 平均时间 | 最差情况 | 稳定度 | 额外空间 | 备注 |
---|---|---|---|---|---|
冒泡 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 稳定 | O ( 1 ) O(1) O(1) | n n n小时较好 |
交换 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O ( 1 ) O(1) O(1) | n n n小时较好 |
选择 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O ( 1 ) O(1) O(1) | n n n小时较好 |
插入 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 稳定 | O ( 1 ) O(1) O(1) | 大部分已排序时较好 |
基数 | O ( l o g R B ) O(log_R{B}) O(logRB) | O ( l o g R B ) O(log_R{B}) O(logRB) | 稳定 | O ( n ) O(n) O(n) |
B
B
B是真数(0-9) R R R是基数(个十百) |
Shell | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n s ) , 1 < s < 2 O(n^s), 1 < s < 2 O(ns),1<s<2 | 不稳定 | O ( 1 ) O(1) O(1) | s s s是所选分组 |
快速 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | n n n大时较好 |
归并 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | 稳定 | O ( 1 ) O(1) O(1) | n n n大时较好 |
堆 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | 不稳定 | O ( 1 ) O(1) O(1) | n n n大时较好 |
空间复杂度
- 概念
- 执行当前算法需要占用的内存空间
- 常见复杂度量级
O(1)
:算法执行所需要的临时空间不随着某个变量 n n n的大小而变化- 场景
- 变量赋值(变量分配的内存不会随着处理数据量的变化而变化)
- 变量数学计算(同上)
x = 91 y = 100 while y > 0: if x > 100: x -= 10 y -= 1 else: x += 1
- 场景
O(n)
:数组,列表等,随着元素的增多,内存将会增加
两者都平衡
- 判断是否闰年
- 空间复杂度 > 时间复杂度:算法判断
- 时间复杂度 > 空间复杂度:列表