【计算机算法与设计(2)】比较不同函数的渐进阶大小

算法复杂度渐进阶比较

AgenticCoding·十二月创作之星挑战赛 10w+人浏览 266人参与

要点2:比较不同函数的渐进阶大小

📌 适合对象:算法学习者、计算机科学学生
⏱️ 预计阅读时间:40-50分钟
🎯 学习目标:掌握O、Ω、Θ记号的定义和使用,能够比较不同函数的渐进阶大小,理解函数增长的渐近性态
📚 参考PPT:第 1 章-PPT-N2_v4(算法概述)- 渐进记号相关内容


📚 学习路线图

理解渐进记号
Asymptotic Notation
大O记号
O (上界)
大Ω记号
Ω (下界)
大Θ记号
Θ (同阶)
比较函数增长
从慢到快
应用:评估算法效率

本文内容一览(快速理解)

  1. 大O记号(O):表示"阶不高于",用于描述算法复杂度的上界(最坏情况)
  2. 大Ω记号(Ω):表示"阶不低于",用于描述算法复杂度的下界(最好情况)
  3. 大Θ记号(Θ):表示"同阶",用于精确描述算法复杂度的渐近性态
  4. 函数增长顺序:从O(1)到O(n!),了解不同复杂度函数的增长快慢
  5. 比较方法:如何判断两个函数的渐进阶关系

一、大O记号(Big-O Notation):阶不高于

这一章要建立的基础:理解大O记号用于描述函数的上界,表示"阶不高于"。

核心问题:如何表示一个函数的增长速度不超过另一个函数?


[!NOTE]
📝 关键点总结:设 f ( n ) f(n) f(n) g ( n ) g(n) g(n)是两个定义域为自然数的正函数。如果存在一个常数 c > 0 c > 0 c>0和某个自然数 n 0 n_0 n0使得对任意 n ≥ n 0 n \geq n_0 nn0,都有关系 f ( n ) ≤ c ⋅ g ( n ) f(n) \leq c \cdot g(n) f(n)cg(n),我们就说 f ( n ) f(n) f(n)的阶不高于 g ( n ) g(n) g(n)的阶,并记作 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))

1.1 大O记号的定义(Definition):理解"阶不高于"的含义

概念的本质

大O记号用于描述函数的上界。如果存在常数 c > 0 c > 0 c>0 n 0 n_0 n0,使得对所有 n ≥ n 0 n \geq n_0 nn0都有 f ( n ) ≤ c ⋅ g ( n ) f(n) \leq c \cdot g(n) f(n)cg(n),则 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))

图解说明

f(n) = O(g(n))
存在常数c > 0
和n₀
对任意n ≥ n₀
f(n) ≤ c·g(n)
f(n)的阶
不高于g(n)

💡 说明

  • 定义:f(n) = O(g(n)) 表示f(n)的阶不高于g(n)的阶
  • 数学表达:存在常数c > 0和n₀,使得对任意n ≥ n₀,都有f(n) ≤ c·g(n)
  • 含义:当n足够大时,f(n)的增长速度不超过g(n)的某个常数倍
  • 用途:描述算法复杂度的上界(最坏情况)

类比理解

想象比较两个人的跑步速度:

  • f(n) = O(g(n)):f的速度"不高于"g的速度
  • 含义:当距离足够长时,f的速度不会超过g的某个倍数
  • 例子:如果f(n) = 3n,g(n) = n,那么f(n) = O(n),因为3n ≤ 3·n(取c=3)

实际例子

大O记号示例:

例1:证明 n³ + 2n + 5 = O(n³)

证明:当n ≥ 1时,我们有
n³ + 2n + 5 ≤ n³ + 2n³ + 5n³ = 8n³

所以 n³ + 2n + 5 = O(n³)
(取c = 8, n₀ = 1)

例2:常见的大O记号
- 1 = O(1)           // 常数时间
- log n = O(log n)   // 对数时间
- n = O(n)           // 线性时间
- n log n = O(n log n) // 线性对数时间
- n² = O(n²)         // 平方时间
- 2ⁿ = O(2ⁿ)         // 指数时间

 


二、大Ω记号(Big-Omega Notation):阶不低于

这一章要建立的基础:理解大Ω记号用于描述函数的下界,表示"阶不低于"。

核心问题:如何表示一个函数的增长速度不低于另一个函数?


[!NOTE]
📝 关键点总结:设 f ( n ) f(n) f(n) g ( n ) g(n) g(n)为两个定义域为自然数的正函数。如果存在一个常数 c > 0 c > 0 c>0和某个自然数 n 0 n_0 n0使得对任意 n ≥ n 0 n \geq n_0 nn0,都有 f ( n ) ≥ c ⋅ g ( n ) f(n) \geq c \cdot g(n) f(n)cg(n),我们则说 f ( n ) f(n) f(n)的阶不低于 g ( n ) g(n) g(n)的阶,并记作 f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n))

2.1 大Ω记号的定义(Definition):理解"阶不低于"的含义

概念的本质

大Ω记号用于描述函数的下界。如果存在常数 c > 0 c > 0 c>0 n 0 n_0 n0,使得对所有 n ≥ n 0 n \geq n_0 nn0都有 f ( n ) ≥ c ⋅ g ( n ) f(n) \geq c \cdot g(n) f(n)cg(n),则 f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n))

图解说明

f(n) = Ω(g(n))
存在常数c > 0
和n₀
对任意n ≥ n₀
f(n) ≥ c·g(n)
f(n)的阶
不低于g(n)

💡 说明

  • 定义:f(n) = Ω(g(n)) 表示f(n)的阶不低于g(n)的阶
  • 数学表达:存在常数c > 0和n₀,使得对任意n ≥ n₀,都有f(n) ≥ c·g(n)
  • 含义:当n足够大时,f(n)的增长速度不低于g(n)的某个常数倍
  • 用途:描述算法复杂度的下界(最好情况)

类比理解

想象比较两个人的跑步速度:

  • f(n) = Ω(g(n)):f的速度"不低于"g的速度
  • 含义:当距离足够长时,f的速度不会低于g的某个倍数
  • 例子:如果f(n) = n²,g(n) = n log n,那么f(n) = Ω(n log n),因为n² ≥ 1·n log n(当n足够大时)

实际例子

大Ω记号示例:

例1:证明 n² = Ω(n log n)

证明:当n ≥ 1时,我们有n > log n,
从而有 n² > n log n,n ≥ 1

所以 n² = Ω(n log n)
(取c = 1, n₀ = 1)

例2:常见的大Ω记号
- n² = Ω(n)           // n²不低于n
- n log n = Ω(n)      // n log n不低于n
- 2ⁿ = Ω(n²)          // 2ⁿ不低于n²

 


三、大Θ记号(Big-Theta Notation):同阶

这一章要建立的基础:理解大Θ记号用于精确描述函数的渐近性态,表示"同阶"。

核心问题:如何表示两个函数的增长速度相同(相差常数倍)?


[!NOTE]
📝 关键点总结:设 f ( n ) f(n) f(n) g ( n ) g(n) g(n)为两个定义域为自然数的正函数。如果关系 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n)) f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n))同时成立,我们则说 f ( n ) f(n) f(n) g ( n ) g(n) g(n)同阶,并记作 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n))

3.1 大Θ记号的定义(Definition):理解"同阶"的含义

概念的本质

大Θ记号用于精确描述函数的渐近性态。如果 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n)) f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n))同时成立,则 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n))

图解说明

f(n) = Θ(g(n))
f(n) = O(g(n))
f(n) = Ω(g(n))
f(n)与g(n)
同阶

💡 说明

  • 定义:f(n) = Θ(g(n)) 表示f(n)与g(n)同阶
  • 数学表达:f(n) = O(g(n)) 且 f(n) = Ω(g(n))
  • 含义:当n足够大时,f(n)的增长速度与g(n)的某个常数倍相同
  • 用途:精确描述算法复杂度的渐近性态

类比理解

想象比较两个人的跑步速度:

  • f(n) = Θ(g(n)):f的速度与g的速度"同阶"
  • 含义:当距离足够长时,f的速度与g的速度在同一个级别(相差常数倍)
  • 例子:如果f(n) = 3n,g(n) = n,那么f(n) = Θ(n),因为3n = O(n)且3n = Ω(n)

实际例子

大Θ记号示例:

例1:证明 n³ + 2n + 5 = Θ(n³)

证明:
- 已证明了 n³ + 2n + 5 = O(n³)
- 我们只需证明 n³ + 2n + 5 = Ω(n³)
- 注意到当n ≥ 1时,n³ + 2n + 5 > n³
- 所以 n³ + 2n + 5 = Ω(n³)(取c = 1, n₀ = 1)
- 因此 n³ + 2n + 5 = Θ(n³)

例2:常见的大Θ记号
- 3n + 5 = Θ(n)        // 与n同阶
- n² + n = Θ(n²)      // 与n²同阶
- n log n + n = Θ(n log n) // 与n log n同阶

 


四、函数增长顺序(Growth Order):从慢到快的排列

这一章要建立的基础:理解不同复杂度函数的增长顺序,从常数时间到指数时间。

核心问题:哪些函数增长更快?如何排列它们?


[!NOTE]
📝 关键点总结:表示算法复杂度的常用函数按增长慢到快的顺序排列。了解这些函数的增长顺序有助于我们评估算法的效率。

4.1 常用复杂度函数(Common Complexity Functions):从O(1)到O(n!)

概念的本质

不同复杂度函数按增长速度从慢到快排列。了解这个顺序有助于我们比较算法的效率。

图解说明

复杂度函数
从慢到快
O(1)
常数
O(log log n)
O(log n)
O((log n)²)
O(n log log n)
O(n log n)
O(n(log n)²)
O(n²)
O(n³)
...
O(2ⁿ)
O(n!)
O(nⁿ)

💡 说明

  • 从增长慢到快
    • O(1) - 常数时间
    • O(log log n),O(log n),O((log n)²) - 对数时间
    • O(n log log n),O(n log n),O(n(log n)²) - 线性对数时间
    • O(n),O(n log log n) - 线性时间
    • O(n²),O(n³),… - 多项式时间
    • O(2ⁿ),O(n!),O(nⁿ) - 指数时间

类比理解

就像交通工具的速度:

  • O(1):静止不动(常数时间)
  • O(log n):步行(对数增长,很慢但稳定)
  • O(n):自行车(线性增长,速度与距离成正比)
  • O(n log n):汽车(线性对数,比线性快一些)
  • O(n²):火车(平方增长,速度更快)
  • O(2ⁿ):飞机(指数增长,非常快但成本高)

实际例子

函数增长顺序示例:

当n = 1000时:
- O(1) = 1
- O(log n) ≈ 10
- O(n) = 1000
- O(n log n) ≈ 10,000
- O(n²) = 1,000,000
- O(2ⁿ) ≈ 10³⁰⁰(天文数字)

比较:
- n² = O(n³)          // n²增长慢于n³
- n log n = O(n²)     // n log n增长慢于n²
- 2ⁿ = Ω(n²)          // 2ⁿ增长快于n²
- n log n = Θ(n log n) // 同阶

 


五、比较函数渐进阶的方法(Comparison Methods):如何判断函数关系

这一章要建立的基础:掌握比较两个函数渐进阶的实用方法。

核心问题:给定两个函数,如何判断它们的渐进阶关系?


[!NOTE]
📝 关键点总结:比较函数渐进阶的方法包括:计算极限、使用定义证明、利用已知关系。关键是理解"当n足够大时"的含义。

5.1 比较方法(Comparison Techniques):三种常用方法

概念的本质

比较两个函数 f ( n ) f(n) f(n) g ( n ) g(n) g(n)的渐进阶,有三种常用方法:

  1. 极限方法:计算 lim ⁡ n → ∞ f ( n ) g ( n ) \lim_{n \to \infty} \frac{f(n)}{g(n)} limng(n)f(n)
  2. 定义证明:直接使用O、Ω、Θ的定义
  3. 已知关系:利用已证明的函数关系

图解说明

= 0
= 常数
= ∞
比较f(n)和g(n)
方法1:极限法
方法2:定义证明
方法3:利用已知关系
lim f(n)/g(n)
f(n) = O(g(n))
f(n) = Θ(g(n))
f(n) = Ω(g(n))

💡 说明

  • 极限方法:如果 lim ⁡ n → ∞ f ( n ) g ( n ) = 0 \lim_{n \to \infty} \frac{f(n)}{g(n)} = 0 limng(n)f(n)=0,则 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n));如果极限为常数,则 f ( n ) = Θ ( g ( n ) ) f(n) = \Theta(g(n)) f(n)=Θ(g(n));如果极限为 ∞ \infty ,则 f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f(n)=Ω(g(n))
  • 定义证明:直接找到常数c和n₀,证明不等式成立
  • 已知关系:利用已证明的函数关系进行推导

类比理解

就像比较两个数列的增长率:

  • 极限方法:看两个数列的比值趋向于什么
  • 定义证明:直接找到证据证明大小关系
  • 已知关系:利用已经知道的事实进行推理

实际例子

比较方法示例:

例1:比较 n² 和 n log n

方法1(极限法):
lim(n→∞) n²/(n log n) = lim(n→∞) n/log n = ∞
所以 n² = Ω(n log n)

方法2(定义证明):
当n ≥ 2时,n > log n,所以 n² > n log n
因此 n² = Ω(n log n)(取c = 1, n₀ = 2)

例2:比较 n log n 和 n²

lim(n→∞) (n log n)/n² = lim(n→∞) log n/n = 0
所以 n log n = O(n²)

例3:比较 3n + 5 和 n

lim(n→∞) (3n + 5)/n = 3(常数)
所以 3n + 5 = Θ(n)

 


📝 本章总结

核心要点回顾

  1. 大O记号(O):表示"阶不高于",用于描述上界

    • 定义:存在c > 0和n₀,使得对n ≥ n₀,有f(n) ≤ c·g(n)
    • 用途:描述算法最坏情况复杂度
  2. 大Ω记号(Ω):表示"阶不低于",用于描述下界

    • 定义:存在c > 0和n₀,使得对n ≥ n₀,有f(n) ≥ c·g(n)
    • 用途:描述算法最好情况复杂度
  3. 大Θ记号(Θ):表示"同阶",用于精确描述

    • 定义:f(n) = O(g(n)) 且 f(n) = Ω(g(n))
    • 用途:精确描述算法复杂度
  4. 函数增长顺序:从O(1)到O(n!),了解不同函数的增长快慢

  5. 比较方法:极限法、定义证明、利用已知关系

知识地图

渐进记号
大O记号
O (上界)
大Ω记号
Ω (下界)
大Θ记号
Θ (同阶)
比较函数增长
应用:算法复杂度分析

关键决策点

  • 何时使用O:需要描述算法的最坏情况或上界
  • 何时使用Ω:需要描述算法的最好情况或下界
  • 何时使用Θ:需要精确描述算法的渐近复杂度
  • 如何比较函数:优先使用极限法,必要时使用定义证明

💡 延伸学习:渐进记号是算法分析的基础工具。掌握这些记号有助于我们:

  1. 比较不同算法的效率
  2. 评估算法的性能
  3. 理解算法复杂度的渐近性态
  4. 设计指定复杂度的算法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值