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