算法:是解决某个问题的确定性指令序列
算法思维:解决问题的思维,从现实问题出发,抽象、形式化描述问题,设计算法,实现算法,运行算法得到实际问题的解
常用算法设计模式
- 枚举(暴力求解)
- 分治
- 回溯
- 贪心
- 动态规划
- 分支限界
- 概率
算法的性质
- 输入:有外部提供的量作为算法的输入
- 输出:算法产生至少一个量作为输出
- 确定性:组成算法的每条指令是清晰的,无歧义的
- 有限性:算法中的每条指令的执行次数是有限的,执行每条指令的时间也是有限的
算法的描述方式
- 自然语言
- 流程图
- 数学公式
- 伪代码
- 程序设计语言
好的算法应该具备的特质
- 正确性
- 有效性(时间有效性、空间有效性)
- 易实现
- 易理解
- 通用性
算法评价
评价一个算法可以去分析其时间复杂度和空间复杂度,一般分析算法的复杂度,指的是这个算法的时间复杂度。 分析算法时间复杂度主要有执行时间、运算步骤和增长量级三种方式
执行时间
- 优点:简单直接
- 缺点:
- 机器依赖:在不同的机器上运行需要的时间不同
- 缺乏解释:没有回答不同程序运行为什么存在时间差异
运算步骤
统计基本运算的执行次数
- 优点:机器无关、具有解释力
- 缺点:
- 计数复杂
- 算法复杂度主要考虑规模较大的情形,具体的增长函数不重要,重要的是增长量级
增长量级的近似表示
用f(n)表示问题的运算步骤数量随问题规模n的变化
- Big-O: 上界O(g(n)) 存在常数c和n0,使得n>=n0时 c g(n) >= f(n)
- Big-Ω: 下界Ω(g(n)) 存在常数c和n0,使得n>=n0时 c g(n) <= f(n)
- Big-Θ: 同阶Θ(g(n)) 存在常数c1、c2、n0使得 n >= n0时 c1g(n) <= f(n) <=c2g(n)
增长量级从低到高
- O(1) 常数
- O(logn) 对数 底数一般都指2
- O(n) 线性
- O(nlogn) 线性对数
- O(n^2) 平方
- O(n^k) 多项式
- O(2^n) 指数
- O(n!) 阶层