算法 ( Algorithm )
一、功能: 有限时间内解决问题的一系列清晰指令
二、效率
- 空间
- 时间
三、目标
- 能够识别程序要求的功能以解决当前任务设计
- 能够高效解决此任务的数据结构与算法
- 评价该方案的效率和正确性
算法分析
运行时间 (时间复杂度)
- 运行时间会随着输入的大小如何变化
- 最好的情况: 运行时间的上限 (最少运行时间) 由最简单的输入决定 提供了所有输入的最终优化目标
- 最差的情况:运行时间的下限 (最多运行时间) 由最复杂的输入决定 提供了所有输入的保障时间
- 平均情况: 随机输入的运行时间的期望 需要建立随机输入的模型 是一种评价算法表现的方法
- 平均情况时间通常很难测定 ,我们通常情况下关注最差情况下的运行时间
可以看出,运行时间的效率从高到低的排序为:
Constant (常数的)> Logarithmic(对数的) > Linear(线性的) > N-log-N(N对数N) > Guadratic(二次方的) > Exponential(指数的) > Cubic(三次方的)
评估算法运行时间
算法 arrayMax 在最差情况下执行了 8n − 3 个基本操作。
定义:
a = 最快的基本操作所需要的运行时间
b = 最慢的基本操作所需要的运行时间
令 T (n) 为 arrayMax 的运行时间。
则应该有:
a (8n − 3) ≤ T (n) ≤ b (8n − 3)
因此,运行时间 T (n) 由两条线性函数所划定其范围
近似记法
Big - O 记法
一般习惯用 Θ (n) 记法来 渐进界定算法运行 时间的常数函数边界。有时,我们只希望这 个常数函数代表算法运行时间的上界。
尽管在最差情况下二分法搜索的运行时间为 Θ (lgn),认为在所有情况下二分法搜索的搜 索时间为 Θ (lgn) 是错误的。
二分法搜索的时间从来不会超过 Θ (lgn), 多数情况下其搜索时间都会少于Θ (lgn)
时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某 个辅助函数f(n) ,使得当n趋近于无穷大时
T(n)/f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。 记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度
#一般我们根据时间复杂度来判断该算法的时间效率 #举例说明 for (n): xxxxxxx #这种为常见的O(n) for (n): for(m): xxxxxx #这种为O(n×m) #若嵌套的两条程度同级别可视为 O(n^2) for (n): xxxxxxx for (n): xxxxxxx #这种为O(n)+O(n),也为O(n)
附上Python内置方法时间复杂度的学习链接: