时间复杂度&空间复杂度
1 综述
2 时间性能
算法主要由语句构成,因此一个算法的时间性能主要取决于两点:
- 每条语句的执行时间
- 语句执行次数
这里 语句执行次数
称为 语句频度或时间频度
, 记为T(n), n代表问题的规模。
如果只有两个算法需要比较,我们可以详细地计算出每个算法的T(n)。但是,
我们需要比较的成千上万的算法,因此需要一种 合适抽象层次的衡量方法
。
因此引入了 时间复杂度
的概念
2.1 时间复杂度
有n代表问题的规模, 如果有一个函数f(n),当n无限大时,T(n)/f(n)的极限值为不等于零的常数,
则称f(n)是T(n)的同数量级函数(也就是说可以使用f(n)来衡量这个函数),记作T(n)=O(f(n)),
称O(f(n)) 为算法的 渐进时间复杂度
,简称 时间复杂度
。
选择这个f(n)时,应该选择一个简单直观的函数,这样便于进行比较。
常见的f(n)有:
- 常数阶O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(nlog2n)
- 平方阶O(n2)
- 立方阶O(n3)
- k次方阶O(nk)
- 指数阶O(2n)
从图中可见,我们应该尽可能选用多项式阶O(nk)的算法,而不用指数阶的算法。
常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
2.2 时间复杂度计算方法
2.2.1 找到基本语句
找到最内层的循环体,体内的语句即为 基本语句
2.2.2 计算基本语句的数量级
只需要计算基本语句的 数量级
,因此只要保证基本语句执行次数的函数中的最高次幂正确即可
2.3 实例
2.3.1 n2 + n = n2
for (i=1; i<=n; i++) |
2.3.2 1 + n + n + n = n
a=0; |
2.3.3 log2n
int n = 8, count = 0;; |
2.3.4 nlog2n
int n = 8, count = 0;; |
2.3.5 n2
sum=0; (一次) |
2.3.6 n3
for(i=0;i<n;i++) |
3 空间复杂度
4 常用的算法的时间复杂度和空间复杂度