以前在玩程序竞赛的时候。经常跟朋友讨论算法复杂度:
- “这个算法复杂度是O(n2),肯定爆掉了,这道题要用O(nlogn)的算法”
类似的讨论非常多。但当时没深究过这个O到底是如何定义出来的,一直以为它跟数学分析里的高阶无穷小之类的是否有关系。上了大学课上的情报数学后,终于慢慢揭开了O的面纱。这里就来分享给还没学过的朋友。
定义1
对于函数f:N→N,g:N→N ,若满足
∃no∈N,∃c∈Rs.t.∀n∈Nn≥no⇒f(n)≤cg(n)
则可写作
f(n)=O(g(n))
定理1
若f(n)是k次多项式,则f(n)=O(nk)
证明:
可设f(n)=∑i=0kaini
有:
nkf(n)=i=0∑kaini−k
另设b=maxi=0,…,k∣ai∣,这时
∀n≥1,∣∣∣nk−iai∣∣∣≤b
所以
nkf(n)=i=0∑kaini−k≤i=0∑kb=(k+1)bf(n)≤(k+1)bnk
这时只要设n0:=1,c:=(k+1)b,根据定义1,定理1成立。
习题
试证明:
- 2n=O(n)
- n=O(nk),k≥1,k∈N
- 若f(n)=O(g(n)),g(n)=O(h(n)),则f(n)=O(h(n))
- 3n=O(2n) (提示:反证法)