相对增长率
我们将两个函数的相对增长速度称为相对增长率,从数学角度上来说其实就是一阶导数,看谁的增长速度更快,比如
f
(
x
)
=
x
2
f(x)=x^2
f(x)=x2的增长速度比
g
(
x
)
=
x
g(x)=x
g(x)=x要更快。
在算法分析中:
- 我们将 f ( x ) f(x) f(x)的增长率大于或等于 g ( x ) g(x) g(x)的增长率记为 g ( x ) = O ( f ( x ) ) g(x)=O(f(x)) g(x)=O(f(x)),也叫大O标记法。
- 反之,我们将 f ( x ) f(x) f(x)的增长率小于或等于 g ( x ) g(x) g(x)的增长率记为 g ( x ) = Ω ( f ( x ) ) g(x)=Ω(f(x)) g(x)=Ω(f(x))
- 将 f ( x ) f(x) f(x)的增长率等于 g ( x ) 的 增 长 率 g(x)的增长率 g(x)的增长率记为 g ( x ) = Θ ( f ( x ) ) g(x)=Θ(f(x)) g(x)=Θ(f(x))
- 另外还有一个 g ( x ) = o ( f ( x ) ) g(x)=o(f(x)) g(x)=o(f(x)),不同于 O O O的大于等于,小 o o o表示 f ( x ) f(x) f(x)的增长率大于 g ( x ) g(x) g(x)
基于上面的定义,有几点推论:
-
如果 T 1 ( N ) = O ( f 1 ( N ) ) T_1(N)=O(f_1(N)) T1(N)=O(f1(N)), T 2 ( N ) = O ( f 2 ( N ) ) T_2(N)=O(f_2(N)) T2(N)=O(f2(N)),则有 T 1 ( N ) + T 2 ( N ) = O ( f 1 ( N ) + f 2 ( N ) ) T_1(N)+T_2(N)=O(f_1(N)+f_2(N)) T1(N)+T2(N)=O(f1(N)+f2(N))
-
如果 T 1 ( N ) = O ( f 1 ( N ) ) T_1(N)=O(f_1(N)) T1(N)=O(f1(N)), T 2 ( N ) = O ( f 2 ( N ) ) T_2(N)=O(f_2(N)) T2(N)=O(f2(N)),则有 T 1 ( N ) ⋅ T 2 ( N ) = O ( f 1 ( N ) ⋅ f 2 ( N ) ) T_1(N) \cdot T_2(N)=O(f_1(N) \cdot f_2(N)) T1(N)⋅T2(N)=O(f1(N)⋅f2(N))
-
设 T ( N ) T(N) T(N)为k次多项式, T ( N ) = Θ ( N k ) T(N)=Θ(N^k) T(N)=Θ(Nk),即低次项和常数可以忽略
-
对于任意尝试k, l o g k N = O ( N ) log^kN=O(N) logkN=O(N),对于对数,无论是几次幂,他的增长率也没有N的增长率大,说明对数函数的增长率极其慢。
相对增长率与极限的关系
-
lim x → ∞ T ( N ) f ( N ) = 0 \displaystyle \lim_{x \to \infty}{\frac{T(N)}{f(N)}}=0 x→∞limf(N)T(N)=0,则 T ( N ) = o ( f ( N ) ) T(N)=o(f(N)) T(N)=o(f(N))
-
lim x → ∞ T ( N ) f ( N ) = c \displaystyle \lim_{x \to \infty}{\frac{T(N)}{f(N)}}=c x→∞limf(N)T(N)=c,c为常数,则 T ( N ) = Θ ( f ( N ) ) T(N)=Θ(f(N)) T(N)=Θ(f(N))
-
lim x → ∞ T ( N ) f ( N ) = ∞ \displaystyle \lim_{x \to \infty}{\frac{T(N)}{f(N)}}= \infty x→∞limf(N)T(N)=∞,c为常数,则 f ( N ) = o ( T ( N ) ) f(N)=o(T(N)) f(N)=o(T(N))
程序的增长率函数
对于不同的程序逻辑都会对应不同增长率,所以不同的算法在大数据下执行效率千差万别,对于一般的顺序执行或者判断,他的增长率为 O ( 1 ) O(1) O(1),你不管传入多大的入参,执行起来是无差别的,而对于循环语句则意味着 O ( N ) O(N) O(N),而循环中嵌入了k重循环,则增长率是 O ( N k ) O(N^k) O(Nk)。而一些折半或者二分算法他的增长率就是 O ( l o g N ) O(logN) O(logN)。