元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
算法基础
▶
复杂度分析
时间复杂度
空间复杂度
渐进符号
▶
算法思想
分治法
贪心算法
回溯法
概率算法
枚举算法
递推算法
递归算法
动态规划
分支限界法
模拟算法
▶
算法分析
正确性证明
性能优化
算法比较
▶
搜索算法
▶
基本搜索
顺序搜索
二分搜索
插值搜索
▶
图搜索
深度优先搜索
广度优先搜索
启发式搜索
▶
高级搜索
双向搜索
A*算法
模式匹配
▶
排序算法
▶
比较类排序
冒泡排序
快速排序
归并排序
插入排序
选择排序
▶
非比较类排序
计数排序
基数排序
桶排序
▶
高级排序
堆排序
希尔排序
外部排序
拓扑排序
▶
图论算法
▶
图的表示
邻接矩阵
邻接表
边集数组
▶
最短路径
Dijkstra算法
Floyd算法
Bellman-Ford算法
最短路径概述
▶
生成树
Prim算法
Kruskal算法
并查集
最小生成树
▶
图的连通性
强连通分量
割点与桥
双连通分量
欧拉路径
▶
动态规划
▶
基础概念
最优子结构
重叠子问题
状态转移方程
▶
经典问题
背包问题
最长公共子序列
编辑距离
▶
优化技巧
空间优化
状态压缩
区间动态规划
▶
字符串算法
▶
字符串匹配
KMP算法
Boyer-Moore算法
Sunday算法
▶
字符串处理
字典树
后缀数组
字符串哈希
▶
压缩算法
游程编码
Huffman编码
LZ77算法
发布时间:
2025-03-21 18:06
↑
☰
# 渐进符号 渐进符号是用来描述算法复杂度增长趋势的数学符号。本文将详细介绍常用的渐进符号、它们的含义和应用。 ## 什么是渐进符号 渐进符号用于描述函数在输入规模趋于无穷大时的增长行为。它帮助我们: 1. 简化复杂度分析 2. 忽略不重要的低阶项 3. 关注算法的主要增长趋势 ## 常用的渐进符号 ### 1. 大O符号(O) 大O符号表示算法的上界(最坏情况): - 定义:若存在正常数c和n₀,使得当n ≥ n₀时,有0 ≤ f(n) ≤ c·g(n),则记作f(n) = O(g(n)) - 含义:f(n)的增长率不会超过g(n) - 例子:2n² + 3n + 1 = O(n²) ### 2. 大Ω符号(Ω) 大Ω符号表示算法的下界(最好情况): - 定义:若存在正常数c和n₀,使得当n ≥ n₀时,有0 ≤ c·g(n) ≤ f(n),则记作f(n) = Ω(g(n)) - 含义:f(n)的增长率至少和g(n)一样快 - 例子:2n² + 3n + 1 = Ω(n²) ### 3. 大Θ符号(Θ) 大Θ符号表示算法的确界(精确界限): - 定义:若f(n) = O(g(n))且f(n) = Ω(g(n)),则记作f(n) = Θ(g(n)) - 含义:f(n)的增长率与g(n)相同 - 例子:2n² + 3n + 1 = Θ(n²) ### 4. 小o符号(o) 小o符号表示严格上界: - 定义:若对任意正常数c,存在n₀,使得当n ≥ n₀时,有0 ≤ f(n) < c·g(n),则记作f(n) = o(g(n)) - 含义:f(n)的增长率严格小于g(n) - 例子:n = o(n²) ### 5. 小ω符号(ω) 小ω符号表示严格下界: - 定义:若对任意正常数c,存在n₀,使得当n ≥ n₀时,有0 ≤ c·g(n) < f(n),则记作f(n) = ω(g(n)) - 含义:f(n)的增长率严格大于g(n) - 例子:n² = ω(n) ## 渐进符号的性质 ### 1. 传递性 - 若f(n) = O(g(n))且g(n) = O(h(n)),则f(n) = O(h(n)) - 对Ω和Θ符号也成立 ### 2. 反身性 - f(n) = O(f(n)) - f(n) = Ω(f(n)) - f(n) = Θ(f(n)) ### 3. 对称性 - 若f(n) = Θ(g(n)),则g(n) = Θ(f(n)) ### 4. 转化性 - 若f(n) = Θ(g(n)),则f(n) = O(g(n))且f(n) = Ω(g(n)) ## 常见函数的渐进关系 从增长速度慢到快的顺序: 1. 常数函数:O(1) 2. 对数函数:O(log n) 3. 线性函数:O(n) 4. 线性对数函数:O(n log n) 5. 多项式函数:O(nᵃ),a > 1 6. 指数函数:O(aⁿ),a > 1 7. 阶乘函数:O(n!) ## 在算法分析中的应用 ### 1. 复杂度分析 ```python def example(n): # O(1) a = 1 # O(n) for i in range(n): a += i # O(n²) for i in range(n): for j in range(n): a += i * j return a # 总复杂度:O(n²),因为取最高阶项 ``` ### 2. 算法比较 比较不同算法的效率: 1. 插入排序:O(n²) 2. 快速排序:O(n log n) 3. 计数排序:O(n + k) ### 3. 最优算法选择 根据输入规模选择合适的算法: - 小规模数据:常数项影响大,可能选择O(n²)的简单算法 - 大规模数据:渐进行为占主导,应选择O(n log n)等更优算法 ## 实际应用注意事项 1. 常数因子 - 渐进符号忽略常数因子 - 实际运行时间还需考虑系数大小 2. 输入规模 - 不同规模下最优算法可能不同 - 需要根据实际情况选择 3. 多个变量 - 可能涉及多个输入参数 - 需要考虑它们之间的关系 ## 总结 渐进符号是算法分析中的重要工具: 1. 提供了描述算法复杂度的标准语言 2. 帮助我们关注算法的主要增长趋势 3. 便于比较不同算法的效率 掌握渐进符号及其应用,对于理解和分析算法性能至关重要。在实际开发中,要结合具体场景,综合考虑各种因素,选择最适合的算法方案。