第3章 描述运行时间
本章研究算法的渐近(asymptotic)效率。我们关心的是,当输入规模足够大时,算法运行时间与随着输入规模的增大发生怎样的变化,即研究T(n)随着n的增大发生怎样的变化。
3.1 O符号,Ω符号,Θ符号
O符号
描述函数的渐近上界(upper bound)。换句话说,它表示一个函数的增长速度并不超过一定速率的速度,基于最高阶项。
例如,7n3+100n2−20n+6。它的最高项是7n3,所以我们说这个函数的增长率是n3。因为这个函数的增长率不大于n3,所以我们表示为O(n3)。你可能会好奇,我们也可以将其表示为O(n4)。为什么?因为其增长率确实比n4慢🤣。确实,我们也可以表示为O(n5)、O(n6)。
实际上,对于任何常数c≥3,O(nc)都可以表示。
Ω符号
描述函数的渐近下界(lower bound)。也就是说,函数的增长速度至少和某个速率一样快,基于O符号。
例如,7n3+100n2−20n+6。其中的最高阶项的增长速度至少和n3一样快,所以是Ω(n3)。同样也可以是Ω(n2)和Ω(n)。
实际上,对于任何常数c≤3,O(nc)都可以表示。
Θ符号
描述函数的渐近紧确界(tight bound)。
例如,7n3+100n2−20n+6。渐近上界O(n3),渐近下界Ω(n3),夹逼得渐近紧确界为Θ(n3)。
3.2 渐近符号:形式化定义
O符号
对于给定的函数g(n),
O(g(n))={f(n):∃ c>0, n0>0, ∀n≥n0, 0≤f(n)≤cg(n)}
f(n)∈O(g(n)),一般书写为f(n)=O(g(n)),计算可转化为0≤f(n)≤cg(n)
Ω符号
对于给定的函数g(n),
Ω(g(n))={f(n):∃ c>0, n0>0, ∀n≥n0, 0≤cg(n)≤f(n)}
f(n)∈Ω(g(n)),一般书写为f(n)=Ω(g(n)),计算可转化为0≤cg(n)≤f(n)
Θ符号
对于给定的函数g(n),
Θ(g(n))={f(n):∃c1>0, c2>0, n0>0, ∀n≥n0, 0≤c1g(n)≤f(n)≤c2g(n)}
f(n)∈Θ(g(n)),一般书写为f(n)=Θ(g(n)),计算可转化为c1g(n)≤f(n)≤c2g(n)

定理:对于任意两个函数f(n)和g(n),当且仅当f(n)=O(g(n))且f(n)=Ω(g(n))时,有f(n)=Θ(g(n))
ο符号
对于给定的函数g(n),
ο(g(n))={f(n):∀c>0, ∃n0>0, ∀n≥n0, 0≤f(n)<cg(n)}
limx→∞f(n)g(n)=0
ω符号
对于给定的函数g(n),
ω(g(n))={f(n):∀c>0, ∃n0>0, ∀n≥n0, 0≤cg(n)<f(n)}
limx→∞f(n)g(n)=∞
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了