绪论
程序不等于算法
算法具有正确性、确定性、可行性、有穷性
好算法的特点:
- 正确:符合语法,能够编译、链接
- 健壮:能对不合法的输入做适当处理,而不至于非正常退出
- 可读:结构化+准确命名+注释
- 效率:(最重要的)速度尽可能快,存储空间尽可能少
算法的运行时间转换为算法需要执行的基本操作次数
渐进分析:大O记号
T(n)=O(f(n)) iff 存在c>0,当n>>2后,有T(n)<c*f(n)
与T(n)相比,f(n)更为简洁,但依然反应前者的增长趋势
常系数可忽略,低次项可忽略
渐进分析:其他记号
T(n) = Ω(f(n)):
存在c>0,当n>>2后,有T(n)>c*f(n)
T(n) = θ(f(n)):
存在c1>c2>0,当n>>2后,有c1f(n)>T(n)>c2f(n)
算法分析
级数
- 算数级数:与末项平方同阶。T(n)=1+2+3+…+n=O(n的平方)
- 幂方级数:比幂次高出一阶。
- 几何级数:与末项同阶
起泡排序
给定n个整数,按(非降序)排序
扫描交换:依次比较每一对相邻元素,如有必要,交换之,若整趟扫描都没有进行交换,则排序完成,否则再做一次扫描交换
- 不变性:经k轮扫描交换后,最大的k个元素必然就位
- 单调性:经k轮扫描交换后,问题规模缩减至n-k
- 正确性:经至多n轮扫描后,算法必然终止,给出正确解答