算法复杂度的O到底是什么

放肆的年华 提交于 2019-12-18 15:30:24

以前在玩程序竞赛的时候。经常跟朋友讨论算法复杂度:

  • “这个算法复杂度是O(n2)O(n^2),肯定爆掉了,这道题要用O(nlogn)O(n\log{n})的算法”

类似的讨论非常多。但当时没深究过这个O到底是如何定义出来的,一直以为它跟数学分析里的高阶无穷小之类的是否有关系。上了大学课上的情报数学后,终于慢慢揭开了O的面纱。这里就来分享给还没学过的朋友。

定义1

对于函数f:NN,g:NNf:\mathbb{N}\rightarrow \mathbb{N},g:\mathbb{N}\rightarrow \mathbb{N} ,若满足

noN,cRs.t.nNnnof(n)cg(n) \exist n_o \in \mathbb{N}, \exist c \in \mathbb{R}\quad s.t. \quad\forall n\in \mathbb{N} \\ n \geq n_o \Rightarrow f(n)\leq cg(n)

则可写作

f(n)=O(g(n))f(n)=O(g(n))

定理1

f(n)f(n)kk次多项式,则f(n)=O(nk)f(n)=O(n^k)

证明:

可设f(n)=i=0kainif(n)=\sum_{i=0}^{k}{a_in^i}
有:
f(n)nk=i=0kainik\frac{f(n)}{n^k} = \sum_{i=0}^{k}{a_in^{i-k}}
另设b=maxi=0,,kaib=\max_{i=0,\dots,k}{|a_i|},这时
n1,ainkib\forall n\geq 1, \left |\frac{a_{i}}{n^{k-i}} \right | \leq b
所以
f(n)nk=i=0kainiki=0kb=(k+1)bf(n)(k+1)bnk\frac{f(n)}{n^k} = \sum_{i=0}^{k}{a_in^{i-k}}\leq \sum_{i=0}^{k}{b} = (k+1)b \\ f(n)\leq (k+1)bn^{k}
这时只要设n0:=1,c:=(k+1)bn_0:=1,c:=(k+1)b,根据定义1,定理1成立。

习题

试证明:

  1. 2n=O(n)2n=O(n)
  2. n=O(nk),k1,kNn=O(n^k),k\geq1,k \in \mathbb{N}
  3. f(n)=O(g(n)),g(n)=O(h(n))f(n)=O(g(n)), g(n)=O(h(n)),则f(n)=O(h(n))f(n)=O(h(n))
  4. 3nO(2n)3^n\neq O(2^n) (提示:反证法)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!