先修课程
离散数学、概率论、编程课程
算法分析
算法分析是理论研究,是关于计算机性能和资源利用的研究(尤其关注性能)。
比性能更重要的因素
比如有正确性、简洁性、可维护性、编程成本、稳定性、功能性、模块化、安全性、可扩展性、用户友好度等。
算法的重要性
- 算法将不可行变为可行。
- 算法是一种描述程序行为的语言。
排序问题
将一组数(A[1~n])按大小顺序(从小到大)排序。
插入排序
- 伪码:
for j ← 2 to n
do key ← A[j]
i ← j-1
while i > 0 and A[i] >key
do A[i+1] ← A[i]
i ← i-1
A[i+1] ← key
- 运行时间:
- 取决于输入数据的有序性。
- 取决于输入数据的规模。
- 关注运行时间的上限,作为对用户的保证。
- 分析方法:
- 最坏情况
- 取决于计算机性能。
- 通常描述不使用绝对速度,关注相对速度。
- 平均情况
- 期望时间,每种输入消耗的时间与这种输入出现的概率的乘积之和。
- 需要对输入情况做出假设,通常假设为均匀分布。
- 最好情况
假象(用于欺骗用户),意义不大。 - 大局观 渐进分析:
- 不关注实际运行时间。
- 关注运行时间如何增长(随输入数据的规模增加时的增长情况)。
- 渐进符号Θ,去掉函数的低阶项和最高阶项系数。
- 分析函数循环的层数。
- 最坏情况
- 插入排序时间复杂度为Θ(n^2)
归并排序
- 排序步骤:
- n为1时,已经完成排序。
- n大于1时,递归的对A[1~n/2向上取整]这部分以及A[n/2+1向上取整~n]这部分排序。
- 将排序好的两个表合并,比较两个表,依次取出最小者到输出序列中。
- 构造递归树:
- 归并排序时间复杂度为Θ(nlgn)。
- 归并排序时间复杂度为Θ(nlgn)。
注意:算法描述中lg默认表示以2为底的对数。