1. 算法的定义:
- 算法是对一种计算过程的严格描述
2. 算法的性质:
- 有穷性
- 能行性
- 确定性
- 终止性
- 输入输出
3. 算法的描述:
- 自然语言描述
- 自然语言结合数学记法或公式
- 计算模型描述法
- 专门的描述语言
- 采用某种编程语言的形式
- 伪代码
4. 程序
程序是算法的实际体现,程序可能用各种计算机语言描述,这里采用Python语言描述程序,定义各种数据结构,描述各种算法。
5. 算法设计与分析
- 算法设计:从实际问题出发,通过分析和思考得到一个解决问题的方案的过程
- 算法设计模式:算法设计中常见的通用想法
枚举法、贪心法、分治法、回溯法、动态规划法、分支限界法 - 算法分析: 分析算法的资源消耗
6. 算法的代价及其度量
在求解一个问题的具体算法时,需要考虑该算法在求解的过程中需要多少存储空间,需要多少时间。但是在不同的计算机上,时间和空间的基本单元大小可能是不同的,因此需要排除具体机器的个性,抽象的反应算法的共性和本质。
在考虑算法的代价的时候,做这样两个假设:
- 机器的基本单元能保存的数据空间大小固定
- 机器执行一个基本命令的消耗时间大小固定
那么,就可以以具体操作的执行次数作为时间开销的基本度量,以计数值作为存储开销的基本度量。
算法的实际计算代价通常与实际规模(大小)有关,为了处理这种情况,把一个算法的计算开销定义为问题的实力规模函数。即算法分析就是针对一个具体算法,设法确定一种函数关系,以问题实例的某种规模n为参量,反映这个算法在处理规模n的问题实例时需要输出的时间(或空间)代价。
7. 算法复杂度
大O记法:假设存在函数g,使得算法A处理规模为n的问题实例所用的时间T(n)=O(g(n)),则称O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,算法的空间复杂度S(n)的定义于此类似。
常用的渐进复杂度函数:
O(1), O(log n), O(n), O(n log n), O(n^2), O(n^3), O(2^n)
算法的复杂度决定了算法的可用性,如果复杂度低,算法就可能用于解决很大的实例,而复杂度很高的算法只能用于很小的实例,可用性很有限。
8. 算法分析
算法分析的目的是推导出算法的复杂度。
时间复杂度的计算规则:
- 基本操作: O(1)
- 加法规则:顺序符合,取复杂度最高的一个
- 乘法规则:循环结构,复杂度相乘
- 取最大规则:分支结构,取最大复杂度
递归算法的时间复杂度:
def recur(n):
if n == 0:
return g(...)
# do something
for i in range(a):
x = recur(n/b)
# do something
# do something
上面是常见的递归算法模式,这个算法可以归结为a个规模为n/b的子问题。
T(n) = O(n^k) + a * T(n/b)
结论:
T(n) = O(n^(logb (a))), a>b^k
T(n) = O(n^k log n), a = b^k
T(n) = O(n^k), a < b^k
9. 数据结构
数据之间关联和组合的形式
典型的数据结构有
- 集合结构
- 线性结构
- 层次结构
- 树形结构
- 图结构
数据结构上的操作需要通过算法实现