第1章 算法概述
(一)算法与程序
1.算法
算法是解决问题的一种方法或过程
算法是由若干条指令组成的有穷序列
算法满足:
①输入:有零个或多个输入
②输出:至少有一个输出
③确定性:每条指令是清晰无歧义的
④有限性:每条指令执行次数和执行时间是有限的
2.程序
程序是算法用某种程序设计语言的具体实现
算法必须满足①~④,而程序不一定满足④
操作系统是在无限循环中执行的程序而不是算法,操作系统的各种任务由特定的子程序实现,子程序既是程序也是算法
数据结构+算法=程序
(二)算法复杂性分析
1.算法的复杂性
算法复杂性=算法所需要的计算机资源
n:问题的规模、输入数据的大小
时间复杂度T(n):需要的时间资源,对应CPU
空间复杂度S(n):需要的空间资源,对应内存
当n→∞,有T(n)T(n)−t(n)→0,称t(n)是T(n)的渐进性态,为算法的渐进复杂性
数学上,t(n)是T(n)的渐进表达式,为T(n)略去低阶项留下的主项(n→∞时,变化最快的项)
例如:T(n)=4N2+3N−1,则t(n)=4n2
I:问题的规模为n的实例 p(I):实例I出现的概率
最坏情况下的时间复杂性
Tmax(n)=max{T(I)∣size(I)=n}
最好情况下的时间复杂性
Tmin(n)=min{T(I)∣size(I)=n}
平均情况下的时间复杂性
Tavg(n)=∑size(I)=np(I)T(I)
(1)渐近上界记号O
$\Omicron(g(n))={f(n)|存在正常数c和n_0使得对所有n\geq{n}_0有:0\leq{f(n)}\leq{cg(n)}} $
如:3N+10=O(N)
如:4N2+3N−1=O(N2)
$\Omega(g(n))={f(n)|存在正常数c和n_0使得对所有n\geq{n}_0有:0\leq{cg(n))}\leq{f(n)}} $
如:3N+10=Ω(1)
如:4N2+3N−1=Ω(N2)
$\omicron(g(n))={f(n)|对于任何正常数c,存在正数n_0使得对所有n\geq{n}_0有:0\leq{f(n)}\leq{cg(n)}} $
等价于当n→∞有g(n)f(n)→0
如:4N2+3N−1=ο(N3)
$\omega(g(n))={f(n)|对于任何正常数c,存在正数n_0使得对所有n\geq{n}_0有:0\leq{cg(n))}\leq{f(n)}} $
等价于当n→∞有g(n)f(n)→∞
如:4N2+3N−1=ω(N)
$\Theta(g(n))={f(n)|存在正常数c_1、c_2和n_0使得对所有n\geq{n}_0有:c_1g(n)\leq{f(n)}\leq{c_2g(n)}} $
Θ(g(n))=O(g(n))⋂Ω(g(n))
如:4N2+3N−1=Θ(N2)
f(n)=Θ(g(n))⇔f(n)∈Θ(g(n))
一般来说,Θ(g(n))表示Θ(g(n))中的某个函数
如:4n2+3n−1=4n2+Θ(n)表示4n2+3n−1=4n2+f(n),f(n)是Θ(n)中的某个函数
O、ο、Ω、ω同理
f(n)=O(g(n))≈a≤b
f(n)=Ω(g(n))≈a≥b
f(n)=ο(g(n))≈a<b
f(n)=ω(g(n))≈a>b
f(n)=Θ(g(n))≈a=b
(1)传递性
f(n)=Θ(g(n)),g(n)=Θ(h(n))⇒f(n)=Θ(h(n))
f(n)=O(g(n)),g(n)=O(h(n))⇒f(n)=O(h(n))
f(n)=Ω(g(n)),g(n)=Ω(h(n))⇒f(n)=Ω(h(n))
f(n)=ο(g(n)),g(n)=ο(h(n))⇒f(n)=ο(h(n))
f(n)=ω(g(n)),g(n)=ω(h(n))⇒f(n)=ω(h(n))
f(n)=Θ(f(n))
f(n)=O(f(n))
f(n)=Ω(f(n))
f(n)=Θ(g(n))⇔g(n)=Θ(f(n))
f(n)=O(g(n))⇔g(n)=Ω(f(n))
f(n)=ο(g(n))⇔g(n)=ω(f(n))
O(f(n))+O(g(n))=O(max{f(n),g(n)})
O(f(n))+O(g(n))=O(f(n)+g(n))
O(f(n))∗O(g(n))=O(f(n)∗g(n))
O(cf(n)=O(f(n))
g(n)=O(f(n))⇒O(f(n))+O(g(n))=O(f(n))

9.渐近关系的快速判断
f(n)=Θ(g(n))⇔n→∞limg(n)f(n)=c(f(n)与g(n)同阶)
f(n)=ο(g(n))⇔n→∞limg(n)f(n)=0(f(n)比g(n)低阶)
f(n)=ω(g(n))⇔n→∞limg(n)f(n)=∞(f(n)比g(n)高阶)
f(n)=O(g(n))⇔O(g(n))为Θ(g(n))和ο(g(n))中阶数更低的那个
f(n)=Ω(g(n))⇔O(g(n))为Θ(g(n))和ω(g(n))中阶数更高的那个
求渐近表达式的一般步骤:去除低阶项只保留最高阶项,再去掉最高级项的系数
O(n−1)<O(n21)<O(1)<O(logn)<O(n32)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
(1)单调函数
单调递增:m≤n⇒f(m)≤f(n)
单调递减:m≤n⇒f(m)≥f(n)
严格单调递增:m<n⇒f(m)<f(n)
严格单调递减:m<n⇒f(m)>f(n)
x−1<⌊x⌋≤x≤⌈x⌉<x+1
⌊2n⌋+⌈2n⌉=n
对于n≥0,a,b>0,有:
⌈b⌈an⌉⌉=⌈abn⌉
⌊b⌊an⌋⌋=⌊abn⌋
⌈ba⌉≤ba+(b−1)
⌊ba⌋≥ba−(b−1)
p(n)=a0+a1n+a2n2+...+adnd,ad>0
p(n)=Θ(nd)
f(n)=O(nk)⇔f(n)有界
f(n)=O(1)⇔f(n)≤c
k≥d⇒p(n)=O(nk)
k≤d⇒p(n)=Ω(nk)
k>d⇒p(n)=ο(nk)
k<d⇒p(n)=ω(nk)
(am)n=(an)m=amn
aman=am+n
a>1,nb=ο(an)
ex=1+x+2!x2+3!x3+...=i=0∑∞i!xi
∣x∣≤1,1+x≤ex≤1+x+Θ(x2)
n→∞lim(1+nx)n=ex
logn=log2n,lgn=log10n,lnn=logen
a>0,b>0,c>0:
a=blogba
logc(ab)=logca+logcb
logc(ba)=logca−logcb
logb(an)=nlogba
logb(a)=logcblogca
logb(a)=logab1
alogbc=clogba
a>0,logbn=ο(na)
x>−1,1+xx≤ln(1+x)≤x
∣x∣≤1,ln(1+x)=x−2x2+3x3−4x4+...
n!=1×2×3...×n
n!={1,n=1n(n−1)!,n>1
n!=ο(nn)
n!=ω(2n)
1.计算时间选择
(1)for/while循环
循环体内计算时间*循环次数
(2)嵌套循环
循环体内计算时间*所有循环次数
(3)顺序语句
各语句计算时间相加
(4)if-else语句
if语句计算时间和else语句计算时间的较大者
2.最优算法
问题的计算时间下界为Ω(f(n)),则计算时间复杂性为O(f(n))的算法是最优算法
如:排序问题的计算时间下界为Ω(nlogn),计算时间复杂性为O(nlogn)(堆排序)的排序算法是最优算法
1.P类问题与NP类问题
|
说明 |
易处理的问题 |
需要多项式时间算法求解的问题 |
难处理的问题 |
需要超多项式时间才能求解的问题 |
不可解问题 |
任何计算机无论耗费多长时间都不能解决的问题 |
|
如:图灵停机问题——不能给出一个判断任意一个图灵机是否停机的一般方法 同理还有: 理发师悖论:村里有个理发师,该理发师有条原则:村里的人如果不自己理发,理发师就给这个人理发,否则不给这个 人理发,那么理 发师能否给自己理发是不可解的。 停机测试悖论:计算机有个测试程序,该测试程序有条原则:计算机里的程序如果不递归调用自己,测试程序就调用它,否则不调它, 那么测试程序能否自己递归调用自己是不可解的。 |
非确定性问题 |
问题的答案无法直接计算得到,只能通过判断猜算的正确与否得到 |
|
多项式非确定性问题:判断猜算正确与否的算法可以在多项式时间内算出来 完全多项式非确定性问题:该问题的所有可能答案能在多项式时间内进行正确与否的验算 |
|
如:旅行售货员问题(TSP) G=(V,E)是一个带权图,图中各边的权为费用,周游路线是包含V中每个顶点的一条回路 最优化形式的TSP问题——在G中找出费用最小的周游线路——较难 判定形式的TSP问题——判断G中是否存在总费用不超过d的周游线路——较易 |
|
非确定性算法:将问题分解为猜想和验证两个阶段 猜测:给出问题的一个猜想——非确定性 验证:验证猜测阶段给出解的正确性——确定性 |
P、NP、NPC、NP-Hard问题
|
说明 |
P |
可以在多项式时间解决的问题 (确定性计算模型下的易解问题类) |
NP |
目前无多项式时间解决的算法,但可以在多项式时间内验证候选答案是否正确 (NP类问题是非确定性计算模型下的易验证问题类) |
NPC |
①本身是NP问题 ②任何一个NP问题都可以在多项式时间规约到该问题 |
NP-Hard |
①本身不能确定是NP问题 ②任何一个NP问题都可以在多项式时间规约到该问题 |

P⊆NP
如果一个NP完全问题(NPC)能在多项式时间内得到解决,那么NP中的每一个问题都可以在多项式时间内求解
目前还没有一个NP完全问题(NPC)有多项式时间算法
3.一些典型的NP完全问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IiQ7bR68-1647060345749)(C:\Users\86136\Desktop\图片_笔记用\NP完全问题.PNG)]
4.NP完全问题的近似算法
(1)只对问题的特殊实例求解
(2)只求近似解
(3)用动态规划法或分支限界法求解
(4)用概率算法求解
(5)用启发式方法求解
[外链图片转存中…(img-jKHdtrUX-1647060345747)]
P⊆NP
如果一个NP完全问题(NPC)能在多项式时间内得到解决,那么NP中的每一个问题都可以在多项式时间内求解
目前还没有一个NP完全问题(NPC)有多项式时间算法
3.一些典型的NP完全问题

4.NP完全问题的近似算法
(1)只对问题的特殊实例求解
(2)只求近似解
(3)用动态规划法或分支限界法求解
(4)用概率算法求解
(5)用启发式方法求解