定义:
\[f(n)=\Theta(g(n))\\ \exist c_1,c_2,n_0,使得:\forall n\geq n_0,有 0\leq c_1g(n)\leq f(n)\leq c_2g(n) \]即存在常数c1,c2,使得在n足够大(n>n0)的时候,f(n)能被夹在c1g(n),c2g(n)中间,称g(n)是f(n)的渐进紧确界。Θ符号确定了一个函数的渐进上界和下界,即时间复杂度定为g(n)的常数倍。
定义:
\[f(n)=O(g(n))\\ \exist c,n_0,使得:\forall n\geq n_0,有 0\leq f(n)\leq cg(n) \]即存在常数c,使得在n足够大(n>n0)的时候,f(n)的上界是cg(n)。O符号确定了一个函数的渐进上界,这个上界可能是渐进紧确的,也可能不是,即最坏情况下复杂度为c*g(n),但是不一定取到最坏情况。通常都采用O符号表示算法的时间复杂度。
定义:
\[f(n)=o(g(n))\\ \forall c,\quad \exist n_0,使得:\forall n\geq n_0,有 0\leq f(n)< cg(n) \]即存对于任意常数c,均有在n足够大(n>n0)的时候,f(n)会小于cg(n)。o符号确定了一个函数的渐进上界,这个上界不是渐进紧确的,即复杂度一定不超过g(n),即使在最坏情况下也达不到g(n)的程度。
与O,o类似,Ω,ω分别定义了f(n)的渐进下界和渐进非紧确下界,不过使用比较少,不多论述。
循环为主的算法,一般直接计算循环次数即可。
而对于递归算法,要写出递归式,然后求解,令T(n)表示规模为n的数据的运行时间。大致可以分成两种情况
主定理(简化版本):
\[令f(n)=\Theta(n^d)\\ if \quad d>log_b(a),\quad T(n)=O(n^d)\\ if \quad d=log_b(a),\quad T(n)=O(n^d*log(n))\\ if \quad d<log_b(a),\quad T(n)=O(n^{log_b(a)}) \]