渐近界与渐进函数简介
函数渐近界实际上算是一个集合,用来表示函数的边界或范围的集合
可以按大小/量级区分为:上界(高阶),平均界(同阶),下界(低阶)
再根据是否渐进区分(有没有可能相等)
一般来讲,用于表示函数渐近界的渐进符号有五个:
- 平均界(average bound)/渐进确界(asymptotically tight bound):θ
- 渐进上界(upper bound):O
- 渐进下界(lower bound):Ω
- 非渐进紧确上界:o
- 非渐进紧确下界:ω
💬注释
o ( g ( x ) ) o(g(x)) o(g(x))是一个集合, 所以实际上 f ( x ) ∈ o ( g ( x ) ) f(x) \in o(g(x)) f(x)∈o(g(x))
通常我们记作 f ( x ) = o ( g ( x ) ) f(x)=o(g(x)) f(x)=o(g(x)) 以表达相同的概念, 其它几个记号同理.
可以理解为:
- f ( x ) = O ( g ( x ) ) ⟹ f ( x ) ≤ g ( x ) f(x)=O(g(x)) \Longrightarrow f(x) \leq g(x) f(x)=O(g(x))⟹f(x)≤g(x)
- f ( x ) = o ( g ( x ) ) ⟹ f ( x ) < g ( x ) f(x)=o(g(x)) \Longrightarrow f(x) < g(x) f(x)=o(g(x))⟹f(x)<g(x)
- f ( x ) = Ω ( g ( x ) ) ⟹ f ( x ) ≥ g ( x ) f(x)=\Omega(g(x)) \Longrightarrow f(x) \geq g(x) f(x)=Ω(g(x))⟹f(x)≥g(x)
- f ( x ) = ω ( g ( x ) ) ⟹ f ( x ) > g ( x ) f(x)=\omega(g(x)) \Longrightarrow f(x) > g(x) f(x)=ω(g(x))⟹f(x)>g(x)
- f ( x ) = θ ( g ( x ) ) ⟹ f ( x ) ≈ g ( x ) f(x)=\theta(g(x)) \Longrightarrow f(x) \approx g(x) f(x)=θ(g(x))⟹f(x)≈g(x)
高等数学中的例子
举一个高等数学中的例子:
α ( x ) \alpha(x) α(x) 是 β ( x ) \beta(x) β(x) 的高阶无穷小,也就是 lim α ( x ) β ( x ) = 0 \displaystyle{\lim\limits{\frac{\alpha(x)}{\beta(x)}}=0} limβ(x)α(x)=0
那么记为: α ( x ) = o ( β ( x ) ) \alpha(x)=o(\beta(x)) α(x)=o(β(x)),可以理解为 β ( x ) \beta(x) β(x) 是 α ( x ) \alpha(x) α(x) 的非渐进紧确上界
函数阶的例子
再以函数阶举例:
任取图上两个函数 a = f ( n ) a=f(n) a=f(n) 和 b = g ( n ) b=g(n) b=g(n) ,只要 a a a 在 b b b 的左边,那都可以说:
- a = O ( b ) a=O(b) a=O(b) 或 a = o ( b ) a=o(b) a=o(b)
- b = Ω ( a ) b=\Omega(a) b=Ω(a) 或 b = ω ( a ) b=\omega(a) b=ω(a)
运用于算法性能分析
渐近界的概念经常被用于算法性能分析中,当参数 n n n 趋于无穷的时候,各个算法(函数)孰优孰劣一看便知
对于两个算法的成本函数(时间、空间等) f ( n ) f(n) f(n) 和 g ( n ) g(n) g(n),谁更低阶谁性能更优
- 若 lim n → ∞ f ( n ) g ( n ) = c \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=c n→∞limg(n)f(n)=c,则 f ( n ) = θ ( g ( n ) ) f(n)=\theta(g(n)) f(n)=θ(g(n)),二者性能相当
- 若 lim n → ∞ f ( n ) g ( n ) = 0 \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=0 n→∞limg(n)f(n)=0,则 f ( n ) = o ( g ( n ) ) f(n)=o(g(n)) f(n)=o(g(n)), f ( n ) f(n) f(n) 算法更优
- 若 lim n → ∞ f ( n ) g ( n ) = ∞ \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=\infty n→∞limg(n)f(n)=∞,则 f ( n ) = ω ( g ( n ) ) f(n)=\omega(g(n)) f(n)=ω(g(n)), g ( n ) g(n) g(n) 算法更优
比如对于冒泡排序算法而言
- 冒泡排序伪代码
(输入N个待排序的数,其中的第i个数可用a[i]表示)
定义一个i,i的值从N到2递减,对于每个i:
定义一个j,j的值从1到i-1递增,对于每个j:
如果a[j]>a[j+1]:
将a[j]和a[j+1]的值交换
- 冒泡排序流程图
- 冒泡排序过程动图
冒泡的平均时间复杂度是 O ( n 2 ) O(n^2) O(n2),这意味着排序 n n n 个数据,平均需要耗费 n 2 n^2 n2 量级的时间
其他算法的复杂度如下图