算法(二)- 算法分析基础
一、反证法 数学归纳法
渐近界:O、Ω、θ
迭代、换元、差消、递归树
1.1反证法
例:背包问题最优解
- 假设命题不成立
- 假设出发,经推理论证,推出矛盾
- 由矛盾判断假设不成立,原成立
- H1^…Hn → C 得 非(H1合取…Hn)析取C
得 非(H1合取…Hn合取 非C)
1.2数学归纳法
二、算法分析基础
任务
对设计出的每一个具体的算法,利用数学工具,讨论其复杂度,主要包括时间复杂度和空间复杂度。
评价
1.人对算法的维护的方便性
人对算法主要注重可读性、为了利用率,考虑适用范围,注重通用性,可重用性,可扩充性。
2.算法在实现运行时占有的机器资源的多少即算法的运行的时间和空间效率
运行效率主要包括时间效率和空间效率,算法交互要有友好性和健壮性
和算法执行时间相关因素
1.数据结构
2.数学模型
3.策略
4.问题规模
5.程序设计语言
6.代码质量
7.计算机执行指令速度
N、I、A表示算法要解问题的规模、算法的输入和算法本身,用C表示复杂性,就有C=F(N,I,A)。时间复杂度T=T(N,I,A)和空间复杂度S=S(N,I,A),A隐含在复杂性函数名当中,可省略A。
T(N,I)=Σte(N,I),其中,元运算所需时间为ti,用到元运算Oi的次数为ei。
算法效率衡量方法
1.事后统计法(有缺点,较少使用)
2.事前分析估算法
算法的时间效率是问题规模的函数。T(n)=O(f(n)),称T(n)为算法的渐近时间复杂度,简称时间复杂度。
时间复杂度估算
因为
算法=控制结构+原子操作(固有数据类型的操作)
所以
算法的执行时间=Σ子操作的执行次数*原子操作
语句的频度指的是该语句重复执行的次数。
数量级相等定义:设f(n)是一个关于正整数n的函数,若存在一个常数C,使
lim
x
→
∞
=
f
(
n
)
g
(
n
)
=
C
\frac{\lim}{x→\infty}=\frac{f\left( n \right)}{g\left( n \right)}=C
x→∞lim=g(n)f(n)=C
则称f(n)与g(n)是同数量级的函数。
算法(渐进)时间复杂度,一般均表示为以下几种数量级的形式(n为问题的规模,c为一常量):
- O(1)称为常数级
- O(logn)称为对数级
- O(n)称为线性级
- O(nlogn)
- O(nc)称为多项式级
- O(cn)称为指数级
- O(n!)称为阶乘级
时间复杂度的上下界
常引入渐进意义下记号O(渐进上界)、Ω(渐进下界)、θ(渐进紧界记号)和o、Ω(非紧渐连下界记号)。
O:得到的只是当规模充分大时的一个上界,越低则评估越精确。
Ω:如果存在整的常数C和自然数N0,使得当N>=N0时有f(N)>=Cg(N),则称函数f(N)当N充分大时下有界,且g(N)是它的一个下界,记为f(N)=Ω(g(N))。得下界,阶越高则评估越精确。
一个算法的时间用Ω符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑下界”或“紧确下界”。
1.O(f)+O(g)=O(max(f,g))
2.O(f)+O(g)=O(f+g)
3.O(f)O(g)=O(fg)
4.如果g(N)=O(f(N)),则O(f)+O(g)=O(f)
5.O(Cf(N))=O(f(N)),其中C是一个正的常数
6.f=O(f)
时间复杂度的最好情况和最坏情况
最坏情况下
T
max
=
max
T
(
N
,
T
)
=
max
Σ
t
i
e
i
(
N
,
I
)
=
T
(
N
,
I
∗
)
T_{\max}=\max T\left( N,T \right) =\max \varSigma t_ie_i\left( N,I \right) =T\left( N,I* \right)
Tmax=maxT(N,T)=maxΣtiei(N,I)=T(N,I∗)
最好情况下
T
min
=
min
T
(
N
,
T
)
=
min
Σ
t
i
e
i
(
N
,
I
)
=
T
(
N
,
I
)
T_{\min}=\min T\left( N,T \right) =\min \varSigma t_ie_i\left( N,I \right) =T\left( N,\overset{~}{I} \right)
Tmin=minT(N,T)=minΣtiei(N,I)=T(N,I )
平均情况下
T
a
v
g
=
Σ
P
(
I
)
T
(
N
,
T
)
=
Σ
P
(
I
)
Σ
t
i
e
i
(
N
,
I
)
T_{avg}=\varSigma P\left( I \right) T\left( N,T \right) =\varSigma P\left( I \right) \varSigma t_ie_i\left( N,I \right)
Tavg=ΣP(I)T(N,T)=ΣP(I)Σtiei(N,I)
实践表明可操作性最好,最有实际价值,是Tmax
空间复杂度
算法的存储量包括:
1.输入数据所占空间
2.算法本身所占空间
3.辅助变量所占空间
算法的空间复杂度是指 算法在执行过程中所占辅助存储空间的大小,用S(n)表示。S(n)=O(g(n))
非递归算法分析
1.仅依赖于问题规模的时间复杂度
例1.交换i和j的内容
例2.变量计数之一
例3.变量计数之二
2.时间复杂度与输入实例的初始状态有关
算法频度不仅和问题规模n有关,还和实例A的各元素取值及k的取值有关。
递归(推)方程的求解
例子:Hanoi塔
直接迭代:插入排序最坏情况下时间分析
二分归并排序:
给出二分归并排序算法的伪代码及递推方程,分析其算法的时间复杂度。
归并过程:
换元迭代:
迭代模型:递归树
求出T(n)=2T(n/2)+nlogn的算法的时间复杂度,采用递归树的方法进行求解。
主定理:递归算法分析
列出二分检索方法的递推方程,并采用主定理方法求出其算法的时间复杂度。
尝试法:快速排序
三、NP完全性理论
是否存在经过V中各顶点恰好一次的回路,使得该回路的费用不超过k。
课后题
1.关于时间复杂性的理解, 有人说:时间复杂性高的算法,算法运行速度一定比时间复杂性低的算法慢。(×)
2.平均时间复杂性是指算法在最好和最坏情况下的时间复杂性的算术平均值。(×)
加
权
\color{red}加权
加权
3.