渐近等价
考虑函数: f(x)=x2+4x
当x→∞时,该函数可以看作x2与它的高阶无穷小o(x2)之和,即
f(x)=x2+4x=x2+o(x2)
于是我们称f(x)和x2是渐近等价的,设g(x)=x2,那么我们可以用下面的符号表示渐进等价
f(x)∼g(x)
更一般地,如果存在两个函数f(x)和g(x),使得下面式子成立
f(x)=g(x)+o(g(x))
就称f(x)和g(x)渐进等价
你也可以用极限的方法来判断两个函数是否渐近等价
x→∞limg(x)f(x)=1
我们可以轻而易举地得到一个结论:f(x)总是跟自己渐近等价
f(x)∼f(x)
渐近上界
若对于函数f(n),g(n),存在c和k,使得
c>k→0≤f(n)≤cg(n)
即从k开始,f(n)永远无法超过cg(n),则称g(n)为f(n)的渐近上界,写作
f(n)=O(g(n))
注意O(g(n))表示的是一个集合,它代表了所有以g(n)为渐近上界的函数,此处的等于号是用于指出f(n)是所有以g(n)为渐近上界的函数里的一员
下面的图片可以帮助你更好的理解f(n)与g(n)的关系
若选取c=5,则当x>1时,f(n)<5g(n)
同样的,我们也可以轻易得到一个结论,f(x)总是自己的渐近上界
f(x)=O(f(x))
渐近时间复杂度
设有下面一段函数
1 2 3 4 5
| for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ swap(i,j); } }
|
外循环共执行了n次,内循环共执行了i次,所以总共执行次数为
S(n)=i=1∑ni=2n2+n
如果我们把代码改成如下所示
1 2 3 4 5 6 7 8
| for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ execute1(i,j); execute2(i,j); execute3(i,j); execute4(i,j); } }
|
那么此时算法执行命令的总次数就翻了4倍,随着n的逐渐增大,这两个算法所用时间的增长规模是相似的,并且我们并不需要特别高的精度.因此我们可以用算法执行时间t(n)的渐近上界f(n)来表示一个算法的效率
f(n)=O(f(n))=O(21n2+21n)
在渐近时间复杂度中,我们只关心执行时间的增长规模,而不关心具体数字,显然以下两个函数的规模是一致的
⎩⎪⎨⎪⎧f(n)=21n2+21ng(n)=21n2+23n
因此我们需要对渐近时间复杂度进行化简
函数推导
f(n)=O(g(n))Λg(n)=O(h(n))→f(n)=O(h(n))
根据定义,我们得到
⎩⎪⎨⎪⎧0≤f(n)≤c1g(n),n≥n10≤g(n)≤c2h(n),n≥n2
合并,得到
0≤f(n)≤c1c2h(n),n>max{n1,n2}
命题得证
f(x)~g(x)→O(f(x))=O(g(x))
我们设h(x)=O(f(x)),由渐近等价得定义得
f(x)=g(x)+o(g(x))
由无穷小定义可得,对于任意ε>0,总存在N,使得下列不等式成立
o(g(x))<εg(x),x>N
取ε=1,便得到
g(x)+o(g(x))<2g(x),x>N
替换掉f(x),得到
0≤h(x)≤cf(x)≤2cg(x)
命题得证
其它结论
通过上面两个结论,再利用其它高等数学知识,我们便可以推出下面的结论
1.2.3.4.f(x)+g(x)=O(f(x)+g(x))O(k)=O(1)O(kx)=O(x)O(xn+o(xn))=O(xn)
因此,在计算渐近时间复杂度时,若出现多项式,我们可以遵守以下准则
- 只保留最高阶的项
- 最高阶的项系数为1
例如: O(4n3+2n2+9)=O(n3)