前言
算法分析是关于计算程序性能和资源利用的理论研究。
比性能更重要的要素:
- 模块性
- 准确性
- 可维护性
- 功能性
- 健壮性
- 用户友好
- 程序开发耗时
- 简易性
- 可扩展性
- 可靠性
为什么学习算法分析:
- 有时性能直接决定程序可行或者不可行
- 算法是一种描述程序行为的语言
sorting example
排列:我们输入一组序列 a 1 , a 2 … a n a_1,a_2\dots a_n a1,a2…an,输出 a 1 ′ , a 1 2 … a n ′ a'_1,a1_2\dots a'_n a1′,a12…an′, a 1 ′ ≤ a 2 ′ ≤ … a n ′ a'_1 \le a'_2 \le \dots a'_n a1′≤a2′≤…an′
算法时间复杂度:
- 输入本身,如果输入本身排序好了,时间复杂度就很小
- 输入的规模,比如序列长短
- 通常讨论算法的最坏情况耗时
分析的种类
- 最坏情况分析: T ( n ) T(n) T(n)定义为输入规模为n时的最长运行时间。
- 平均情况: T ( n ) T(n) T(n)定义为输入规模为n时的期望运行时间。
- 最好情况
算法时间分析
取决于电脑:
- 相对速度(同一电脑)
- 绝对速度(不同电脑)
算法的大局观(渐进分析):
- 忽略依赖于机器的常量
- 不检查实际的运行时间,关注运行时间的增长(舍弃低阶)
3 n 3 + 90 n 2 – 5 n + 6046 = Θ ( n 3 ) 3n^3 + 90n^2 – 5n + 6046 = Θ(n^3) 3n3+90n2–5n+6046=Θ(n3),当n足够大, Θ ( n 2 ) Θ(n^2) Θ(n2)终究会优于 Θ ( n 3 ) Θ(n^3) Θ(n3) 。渐进符号的伟大之处在于,满足我们对相对和绝对速度的双重比较要求(不同的计算平台只是相差一个常数)。
插入排序
插入排序介绍
描述:先取定位置j,将j这个位置上的元素插进前j-1的序列(此时前j-1个元素的序列是排序好的了),j从2到n。
插入算法复杂度分析
最坏情况: T ( n ) = ∑ j n Θ ( j ) = Θ ( n 2 ) T(n)=\sum_j^nΘ(j)=Θ(n^2) T(n)=∑jnΘ(j)=Θ(n2)
归并排序
归并排序介绍
描述:n不为1时,将序列前后分两部分,两部分排序后只要对这两个已排序序列的头元素进行比较,按顺序输出到最后结果。
归并算法复杂度分析
T
(
n
)
=
2
T
(
n
2
)
+
c
n
T(n) = 2T(\frac{n}{2}) + cn
T(n)=2T(2n)+cn,利用迭代的思想。
Θ
(
n
l
g
n
)
Θ(n lg n)
Θ(nlgn)在渐进情况下小于
Θ
(
n
2
)
Θ(n^2)
Θ(n2),因此归并排序优于插入排序。