算法分析(渐进分析)
Posted jtwty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法分析(渐进分析)相关的知识,希望对你有一定的参考价值。
算法分析分为算法时间复杂度分析与算法空间复杂度分析。一般而言,时间对于我们来说更重要,算法的优化主要也是对时间的优化,而对于空间只要我们的计算机性能较好,对于计算结果影响就不会很大。,下面主要也是对算法一些关于时间复杂度的描述!
一.T(n)函数
当算法时间仅依赖于问题输入规模n,我们可以将其表示为T(n)。
T(n)直接由每一步的操作次数之和相加构成。
下面我们以插入排序的伪代码为例来计算它的T(n)
但是因为当规模变大时,其主要决定作用的就是最高项,所以我们只需要取它的最高项即可,那么久可以表示为 T(n) = n2
二.渐进分析
渐进分析: 就是指忽略掉T(n)的系数与低阶项,仅关注高阶项,用记号θ表示。
下面我们介绍一些渐进记号:
(1)渐进紧确界(θ记号)
先给出它的官方定义:
什么意思呢?就是用θ(g(n))来描述T(n)有一个具体的上界和一个具体的下界,当我们可以找到时,才能进行θ表示。
举例
T ( n ) = 3 2 n 2 + 7 2 − 4 = θ ( n 2 ) T(n) = \\frac{3}{2} n^{2} + \\frac{7}{2} - 4 = \\theta(n^{2}) T(n)=23n2+27−4=θ(n2)
令n0 = 2,那么当 n ≥ n0时,有
寻找下界: 3 2 n 2 + 7 2 − 4 ≥ 3 2 n 2 ≥ n 2 \\frac{3}{2} n^{2} + \\frac{7}{2} - 4 ≥ \\frac{3}{2} n^{2} ≥ n^{2} 23n2+27−4≥23n2≥n2
寻找上界: 3 2 n 2 + 7 2 − 4 ≤ 3 2 n 2 + 7 2 + n 2 = 6 n 2 \\frac{3}{2} n^{2} + \\frac{7}{2} - 4 ≤ \\frac{3}{2} n^{2} + \\frac{7}{2} + n^{2} = 6n^{2} 23n2+27−4≤23n2+27+n2=6n2
所以存在 c1 = 1,c2 = 6,n0 = 2,使得上式成立,存在渐进紧确界,才可以使用 θ(n2) 表示。
同理可得:
3 2 n 5 + 7 2 n − 10 = θ ( n 5 ) \\frac{3}{2} n^{5} + \\frac{7}{2}n - 10 = \\theta(n^{5}) 23n5+27n−10=θ(n5)
n 3 + n 2 + n = θ ( n 3 ) n^{3} + n^{2} + n = \\theta(n^{3}) n3+n2+n=θ(n3)
(2)渐进上界 (O记号)
渐进上界使我们算法分析最常用的方式,因为当我们评价一个算法的优劣时,一般都去找它的最差情况,那么这个就是渐进上界。(大O记法)
先看定义:
举例
c o s n = O ( 1 ) cos n = O(1) cosn=O(1)
因为 cos n 最大取1,所以是O(1)。
n 2 2 − 12 n = O ( n 2 ) \\frac{n^{2}}{2} - 12n = O(n^{2}) 2n2−12n=O(n2)
通过画坐标图来看,很明显 n2 更大,所以上界为O(n)。
l o g 7 n = l o g 2 n l o g 2 7 = O ( l o g 2 n ) = O ( l o g n ) log_{7} n = \\frac{log_{2}n}{log_{2}7} = O(log_2{n}) = O(logn) log7n=log27log2n=O(log2n)=O(logn)
使用换底公式进行求解。
对于一般的式子来说我们只需要去掉系数取最高项即可,对于特殊的函数我们才会去找他≤什么。
(3)渐进下界 (Ω记号)
渐进下界就是最好情况,一般不使用它来衡量算法的优劣。
它的定义如下:
举例
n 3 − 2 n = Ω ( n 3 ) n^{3} - 2n = Ω(n^{3}) n3−2n=Ω(n3)
n 2 + n = Ω ( n 2 ) n^{2} + n = Ω(n^{2}) n2+n=Ω(n2)
同理对于普通的式子,直接去掉系数取最高阶项,遇到复杂的例如调和级数等,我们才会去找他≥什么。
三.常用的换算公式
O ( f ( n ) ) + O ( g ( n ) ) = O ( m a x { f ( n ) , g ( n ) } ) O(f(n)) + O(g(n)) = O(max \\left \\{f(n),g(n)\\right \\}) O(f(n))+O(g(n))=O(max{f(n),g(n)})
O ( f ( n ) ) + O ( g ( n ) ) = O ( f ( n ) + g ( n ) ) O(f(n)) + O(g(n)) = O(f(n)+g(n)) O(f(n))+O(g(n))=O(f(n)+g(n))
O ( f ( n ) ) ∗ O ( g ( n ) ) = O ( f ( n ) ∗ g ( n ) ) O(f(n))*O(g(n)) = O(f(n)*g(n)) O(f(n))∗O(g(n))=O(f(n)∗g(n))
O ( c ∗ f ( n ) ) = O ( f ( n ) ) O(c*f(n)) = O(f(n)) O(c∗f(n))=O(f(n))
以上是关于算法分析(渐进分析)的主要内容,如果未能解决你的问题,请参考以下文章