算法分析(渐进分析)

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+274=θ(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+27423n2n2

寻找上界: 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+27423n2+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+27n10=θ(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}) 2n212n=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}) n32n=Ω(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(cf(n))=O(f(n))

以上是关于算法分析(渐进分析)的主要内容,如果未能解决你的问题,请参考以下文章

斯坦福算法分析和设计02渐进分析

算法分析和设计_渐进符号的表示

算法分析中常用的几种渐进符号

算法设计与分析笔记:知识点和题目

学好数据结构和算法 —— 复杂度分析

算法的定义和特征;算法的正确性证明方法; 算法的时间和空间复杂性分析方法及复杂性函数的渐进表示