一. 时间复杂度
评价标准:▶ 运行时间 ▶ 运算步骤 ▶ 增长量级
1.运行时间
运行时间随机器而异,它是由机器本身软硬件环境决定的,与算法无关。我们更多的讨论影响运行时间的另一个因素—运算步骤。
2.运算步骤
① 什么是运算步骤?
基本运算(加,减,乘,除,余,判断,数组的读取,写入,函数调用等)发生的次数。
②优点
机器无关,具有解释力
③缺点
计数繁琐,求解有难度,函数复杂
④注意
算法复杂度主要考虑输入规模较大的情形,此时具体的增长函数不是那么重要,关键是其增长量级。
3.增长量级(Order of growth)
假设某算法的执行步骤 f(n)
跟输入的规模的关系为 f(n) = 3n2+150n+10000,影响最大的项为3n2。能否用n2表示?为什么?
基本可以,但是不完全可以。
为什么基本可以?
当n很大时,后面的项(增长速度慢)不重要。
为什么不完全可以?
只用n2表示不了后面的项,也表示不了系数。
① 增长量级的近似表示
下界(Big-Ω):Ω(n2) 表示存在常数 c 使得当 n >= n0 时,cn2 =< f(n)
上界(Big-O):O(n2) 表示存在常数 c 使得当 n >= n0 时,cn2 >= f(n)
确界(Big-θ):θ(n2) 表示存在常数 c1、c2 使得当 n >= n0 时,c1n2 <= f(n) <= c2n2
② 常见的时间复杂度
- O(1) ——常数阶
- O(log2n) ——对数阶
- O(n) ——线性阶
- O(nlog2n) ——nlogn阶
- O(n2) ——平方阶
- O(nk) ——k方阶
- O(2n) ——指数阶
- O(n!) ——阶乘阶
③ 算法复杂度分析的三种情形
算法的运算次数并非固定不变,而有随机因素。如搜索,运气好一次找到,运气差最后找到。
- 最好情形(Best cae)
- 最差情形(Worst case)
- 平均情形(Average case)
例:从已经排好序的数组A中,查找某个数是否在A中,若在,返回其位置。
对于分治法:得到结果时,数据规模为1。此时应满足 n/2t-1 = 1,t
表示比较次数。化简得到 t = log2n+1。
比较次数 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
数据规模 | n | n/2 | n/4 | n/23 | n/24 |
枚举法和分治法分别的花费次数:
类型 | BC | AC | WC |
---|---|---|---|
Brute force approach(枚举法) | 1 | n/2 | n |
Divide and conquer(分治法) | 1 | log2n/2+1 | log2n+1 |
例子:斐波那锲数列迭代,递归的方式各自的时间复杂度。
迭代:O(n)
递归:O(2n) (实际上是二叉树的结点个数)
二. 空间复杂度
暂无