什么是算法的复杂度
(1)算法复杂度即算法所需要的计算机资源
(2)算法的复杂度可分为算法的时间复杂度 T ( n ) T(n) T(n) 和算法的空间复杂度 S ( n ) S(n) S(n),其中 n n n 是问题的规模(输入大小)
算法的时间复杂度
时间复杂度就是函数中基本操作所执行的次数,记为 T ( n ) T(n) T(n),可分为:
(1)最坏情况下的时间复杂度: T m a x ( n ) = m a x { T ( l ) ∣ s i z e ( l ) = n } T_{max}(n)=max\{T(l)|size(l)=n\} Tmax(n)=max{T(l)∣size(l)=n}
(2)最好情况下的时间复杂度: T m i n ( n ) = m i n { T ( l ) ∣ s i z e ( l ) = n } T_{min}(n)=min\{T(l)|size(l)=n\} Tmin(n)=min{T(l)∣size(l)=n}
(3)平均情况下的时间复杂度: T a v g ( n ) = ∑ s i z e ( I ) = n p ( I ) T ( I ) T_{avg}(n)=\sum\limits_{size(I)=n}p(I)T(I) Tavg(n)=size(I)=n∑p(I)T(I)
其中, I I I是问题的规模为 n n n的实例(或称合法输入), p ( I ) p(I) p(I)是实例 I I I出现的概率。
算法的空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记为 S ( n ) S(n) S(n),可分为:
(1)程序的保存所需要的存储空间资源。即程序的大小;
(2)程序在执行过程中所需要消耗的存储空间资源,如中间变量等;
时间与空间复杂度的联系
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。
算法的渐近时间复杂度
当 n → ∞ n→∞ n→∞时,若 ( T ( n ) − t ( n ) ) / T ( n ) → 0 (T(n)-t(n))/T(n)→0 (T(n)−t(n))/T(n)→0,则称 t ( n ) t(n) t(n)是 T ( n ) T(n) T(n)的渐近性态,为算法的渐近时间复杂度。在直观上, t ( n ) t(n) t(n)是 T ( n ) T(n) T(n)略去低阶项留下的主项,它比 T ( n ) T(n) T(n)简单。
复杂度排序: ( l o g n ) x < ( l o g n ) x + ε < n x < n x + ε < 2 n < 2 n + ε (logn)^x<(logn)^{x+ε}<n^x<n^{x+ε}<2^n<2^{n+ε} (logn)x<(logn)x+ε<nx<nx+ε<2n<2n+ε
(1)渐近上界记号O —— 大O表示法
当 N N N充分大时,函数 t ( N ) t(N) t(N)有上界 g ( N g(N g(N),即 t ( N ) < = C g ( N ) t(N)<= Cg(N) t(N)<=Cg(N),记为 t ( N ) = O ( g ( N ) ) t(N)=O(g(N)) t(N)=O(g(N)),此时, t ( N ) t(N) t(N)的阶不高于 g ( N ) g(N) g(N)的阶
- 满足大O表示法的c和 n 0 n_0 n0的值并不重要,只需要说明存在即可。
- 大O表示法试图给算法的时间代价找到一个最小上界,这个上界的阶越低,则算法评估就越精确,结果就越有价值
- 用低次项(如 n n n)的项目替换高次项的项目(如 n 2 n^2 n2),直到剩下一个单项为止
举例如下:
(2)渐近下界记号Ω —— 大Ω表示法
当 N N N充分大时,函数 t ( N ) t(N) t(N)有下界 g ( N ) g(N) g(N),即 t ( N ) > = C g ( N ) t(N)>= Cg(N) t(N)>=Cg(N),记为 t ( N ) = Ω ( g ( N ) ) t(N)=Ω(g(N)) t(N)=Ω(g(N)),此时, t ( N ) t(N) t(N)的阶不低于 g ( N ) g(N) g(N)的阶
-
满足大Ω表示法的 c c c和 n 0 n_0 n0的值并不重要,只需要说明存在即可。
-
试图给算法的时间代价找到一个最大下界,因为这个下界的阶越高,则算法评估就越精确,结果就越有价值
-
省略低次项,直到剩下一个单项为止
举例如下:
(3)紧渐近界记号Θ —— Θ表示法
当且仅当 t ( N ) = O ( g ( N ) ) t(N)= O(g(N)) t(N)=O(g(N))且 t ( N ) = Ω ( g ( N ) ) t(N)=Ω(g(N)) t(N)=Ω(g(N))时,有 t ( N ) = Θ ( g ( N ) ) t(N)= Θ(g(N)) t(N)=Θ(g(N)),此时, t ( N ) t(N) t(N)的阶等于 g ( N ) g(N) g(N)的阶
举例如下:
(4)非紧上界记号o —— 小o表示法
当且仅当 t ( N ) = O ( g ( N ) ) t(N)= O(g(N)) t(N)=O(g(N))且 t ( N ) ≠ Ω ( g ( N ) ) t(N) ≠Ω(g(N)) t(N)̸=Ω(g(N))时,有 t ( N ) = o ( g ( N ) ) t(N)= o(g(N)) t(N)=o(g(N))。即 t ( N ) t(N) t(N)的阶不高于 g ( N ) g(N) g(N)的阶
问题的下界及最优算法
-
给定充分大的问题规模 N N N,对于这个问题的所有算法的复杂性中取相应的下界
-
问题的计算时间下界为 Ω ( f ( N ) ) Ω(f(N)) Ω(f(N)),则计算时间复杂性为 O ( f ( N ) ) O(f(N)) O(f(N))的算法为最优算法。
算法分析的基本法则
非递归算法:
(1)for/while循环:循环体内计算时间*循环次数。
(2)嵌套循环:循环体内计算时间*所有循环次数。
(3)顺序语句:各语句计算时间相加。
(4)if-else语句:if语句计算时间和else语句计算时间的较大者。
















