上章 算法概述 中讲述了 在设计算法和比较算法时,设计人员更倾向于假设输入规模n无限大,然后再比较算法的渐进效率。

为什么要分析算法的渐进效率,而不是直接按照输入规模直接计算效率进行比较?

很直观的原因就是,当输入规模小的时候,各种算法间的差距并不会太大,对于大部分应用程序来讲,这些差距都可以被忽略。

现实原因是,要精确计算算法执行时所消耗的资源是非常繁琐,代价较大,甚至说不太切于实际的。

所以就有人发明了使用渐进分析法来分析算法的渐进效率。接下来的文章我们就将根据实际的例子进行具体的分析。

但在进行算法的渐进效率分析的时候,需要用到一些渐进符号,所以这里实现先对之后可能用到的渐进符号进行简单描述。

这地方可能有点比较难理解的是,渐进符号描述的表达式 表示 一个函数集合。而在渐进分析中的 ”=“更倾向于“∈ ”的意思。打个比方:渐进表达式 f(n) = O(g(n))所表达的意思是,O(g(n)) = [ f(n),h(n).....g(n) ]; f(n) ∈ O(g(n))

一、大O表示法

一般用于界定函数集合的上界,渐进表达式O(g(n))的含义就是,c为正常数,函数集合O中的元素的最大值不会超过c.g(n)。f(n) = O(g(n))的含义是,函数f(n)的属于集合O(g(n)),因为函数集合O中的最大值为c.g(n),所以f(n)的最大值为c.g(n)。由于只是渐进的上界,所以当函数g(n)的阶数越小时,上界越紧确。

下面来看下 算法导论 中是如何描述大O表示法的。

当函数的大小只有上界,没有明确下界的时候,则可以使用大O表示法。f(n)= O(g(n))正式的数学定义:存在正常数c、n、n0,当n>n0的时,对于任意的f(n)对符合0<= f(n)<= c.g(n)。

直观视觉图如下示:

该渐进描述符一般用与描述算法的最坏复杂度。读者可以在这地方思考下,为什么用大Ω来描述算法的最坏复杂度没有意义(大Ω描述的界是渐进最小,当用大Ω来描述最坏复杂度时,因为这只是一个下界,并不能说明算法的最坏复杂度,所以没意义)。

二、大Ω表示法

一般用于界定函数集合的下界,渐进表达式Ω(g(n))的含义就是,函数集合Ω中的元素的最小值不会低于c.g(n)。f(n) = Ω(g(n))的含义是,函数f(n)的属于集合Ω(g(n)),因为函数集合Ω中的最小值为c.g(n),所以f(n)的最小值为c.g(n)。

算法导论 中是如何描述大Ω表示法的。

当函数的大小只有下界,没有明确的上界的时候,可以使用大Ω表示法。f(n)= Ω(g(n))正式的数学定义:存在正常数c、n、n0,当n>n0的时,对于任意的f(n)对符合0<= c.g(n)<= f(n)。

直观视觉图如下所示:

该渐进描述符一般用与描述算法的最优复杂度。读者可以在这地方思考下,为什么用大O来描述算法的最优复杂度没有意义(因为大O描述的界时渐进最大的,当你说你的算法最快为O(f(n))的时候,因为函数描述的只是个上界,并无法描述最小值,所以没意义)。

三、大θ表示法

用于界定函数的渐进上界和渐进下界。当f(n)= θ(g(n))的时候,代表着g(n)为f(n)的渐进紧确界。而θ渐进描述符在所有的渐进描述符中是最严格的一个,因为它既描述了函数的上界,有描述了函数的下界。

算法导论 中是如何描述大θ表示法的。

f(n)= θ(c.g(n))正式的数学定义:存在正常数c1、c2、n、n0,当n>n0的时,对于任意的f(n)对符合c1.g(n)<= f(n)<= c2.g(n),c1.g(n)、c2.g(n)都是渐进正函数(当n趋于无穷大的时候,f(n)为正)。

直观视觉图如下所示:

算法导论中还根据大O,大Ω,大θ的定义得到一个定理:

当且仅当函数f(n)= O(g(n))and f(n)=Ω(g(n))时,f(n)= θ(g(n))

四、小o表示法

刚才我们介绍了大O表示法,大O表示法所描述的界,可以是渐进紧确的,也可以是非渐进紧确的。而小o表示法所描述的界是非渐进紧确的。下面我们看下小o表示法的数学定义:

函数f(n)= o(g(n))对于任意的正常数c,存在常数n0 > 0,使得对所有的n > n0 都存在0 <= f(n)<= c.g(n)。

这里可以根据定义看出同样是0 <= f(n)<= c.g(n),大O表示法是存在一个常数c符合该条件,而小o表示法是对于所有的正常数c都符合该条件。所以当n趋于无穷大,c也趋于无穷大的时候,小o表示法描述的界的宽松范围比大O表示法描述的界宽松范围大最少一个次方,所以小o表示法所描述的界必然是渐进非紧确的。

五、小ω表示法

小ω表示法和大Ω表示法的区别和小o表示法和大O表示法的区别类似。其描述的界也是渐进非紧确的。下面是小o表示法的数学定义:

函数f(n)= o(g(n))对于任意的正常数c,存在常数n0 > 0,使得对所有的n > n0 都存在0 <= c.g(n)<=  f(n)。

函数间的特性和比较

在后续的实际算法分析中,会经常使用到以上五种描述符,这里也说一下它们之间的比较关系和特性,方便以后做分析时,理解公式的推演过程。

传递性:

f(n) = θ(g(n))  和 g(n) =  θ(h(n))   可以得出 f(n) =   θ(h(n))

f(n) = O(g(n))  和 g(n) = O(h(n))   可以得出 f(n) =  O(h(n))

f(n) = Ω(g(n))  和 g(n) = Ω(h(n))   可以得出 f(n) =  Ω(h(n))

f(n) = o(g(n))  和  g(n) =  o(h(n))   可以得出 f(n) =  o(h(n))

f(n) = ω(g(n))  和 g(n) = ω(h(n))   可以得出 f(n) =  ω(h(n))

自反性:

f(n) = θ(f(n))     可以得出  f(n) = O(f(n))   和  f(n) = Ω(f(n))

对称性:

f(n) = Θ(g(n))   当且仅当 g(n) = Θ(f(n))

转置对称性:

f(n) = O(g(n))   当且仅当 g(n) = Ω(f(n))

f(n) = o(g(n))   当且仅当 g(n) = ω(f(n))

下面是关于这五种渐进符号在视觉上的直观的比较关系:

除了这些渐进符号之外,还有一些标准记号和常用符号在算法分析中也有遇到,不过因为其相对渐进符号来讲,比较易懂,这里就不一一赘述了,如果大家感兴趣可以去 算法导论的3.2章节自行了解下。这里也说一下,个人感觉渐进符号在算法分析的基础中还是比较重要的一块基础知识,建议基础较差的同学可以多看看其他的资料(书籍,帖子),自己多总结思考下,相信很快就可以掌握其中的奥秘

算法分析——算法的渐进效率分析 和 渐进符号大O、大Ω、大θ、小o、小ω相关推荐

  1. 算法分析—大O、大Ω、大θ

    前言 在算法的学习中,最开始便是要学习算法的分析.学习算法分析时,我们便会接触到这么几个符号:大O.大Ω.大θ,常常让人难以理解. 在通常的算法分析时,我们可以明白,在输入规模较小,各种算法之间的时间 ...

  2. 算法笔记——渐进分析和渐进符号

    算法分析是理论研究,是关于计算机程序性能(performance)和资源利用(resource usage)的研究. More important than performents 模块化(耦合度越低 ...

  3. 算法效率分析基础-算法四

    主要内容: 介绍研究算法效率的通用框架 介绍三种符号: O(读作O),Ω(读作omega),和Θ(读作theta).这些数学借来的符号已经成为讨论算法效率的特定语言 使用通用框架系统对非递归算法进行分 ...

  4. 《算法设计与分析基础》Chapt 2 算法效率分析基础

    2.1 分析框架 2.1.1 输入规模的度量 大多数情况,以输入数n 矩阵,维数 数值算法,数字的比特数 2.1.2 运行时间的度量单位 找出算法中最重要的操作,即基本操作 计算他们的运行次数 2.1 ...

  5. 03|复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

    目录 为什么需要复杂度分析? 大 O 复杂度表示法 时间复杂度分析 几种常见时间复杂度 空间复杂度分析 为什么需要复杂度分析? 事后统计法:代码跑一遍,通过统计.监控,就能得到算法执行的时间和占用的内 ...

  6. 【数据结构与算法-java实现】一 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

    今天开始学习程序的灵魂:数据结构与算法. 本文是自己学习极客时间专栏-数据结构与算法之美后的笔记总结.如有侵权请联系我删除文章. 我们都知道,数据结构和算法本身解决的是"快"和&q ...

  7. 编程方法学23:搜索排序与算法效率分析

    前言 本笔记是斯坦福公开课,编程方法学的学习笔记. 总体而言,这门课讲了很多很基础的东西,具有很强的通用性. 正文 本次的笔记对应的是第二十三节课,这堂课是助教来讲搜索排序与算法效率分析的知识. 1线 ...

  8. abaqus算界面脱粘_基于内聚力模型的圆形夹杂与基体界面渐进脱粘分析

    基于内聚力模型的圆形夹杂与基体界面渐进脱粘分析 张炯 ; 屈展 ; 黄其青 ; 王萍 [期刊名称] <西安石油大学学报(自然科学版) > [年 ( 卷 ), 期] 2014(029)003 ...

  9. huffman编解码算法实验与压缩效率分析

    一.基本原理 1.huffman编码原理 huffman编码是一种无失真编码方式,是可变长(VLC)编码的一种. huffman编码基于信源的概率统计模型,基本思路是出现概率大的信源符号编长码,出现概 ...

  10. 算法导论习题—主方法求渐进紧确界、递归树方法

    算法导论习题-主方法求渐进紧确界.递归树方法 4.5-1 a. T(n)=2T(n/4)+1T ( n ) = 2 T ( n / 4 ) + 1T(n)=2T(n/4)+1 b. T(n)=2T(n ...

最新文章

  1. mysql优化说明_MySQL性能优化各个参数解释说明
  2. Python 【企鹅号、QQ看点】短视频的自动上传与发布实例演示,同时支持抖音、快手、哔哩哔哩、小红书、微视、西瓜视频、视频号等平台的视频自动化同步发布
  3. nyoj841最高位数字
  4. 微博环境下利用综合策略构建推荐引擎
  5. FTP(二)相关配置
  6. 算法题复习(快排、链表、二分、哈希、双指针)
  7. 对DataTable的一些解释
  8. select 条件字段,数字类型加1
  9. 使用scatter()绘制散点图
  10. 测试linux系统的程序员,日常测试Linux命令
  11. acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)
  12. leetcode 【 Add Two Numbers 】 python 实现
  13. Nginx源码分析 - HTTP模块篇 - TCP连接建立过程(21)
  14. OpenCV --- 实现两幅图像并排合并(ROI)
  15. UOJRoundPLUS+
  16. 时空图卷积网络:一种用于交通预测的深度学习框架
  17. 3ds max渲图自从使用了云渲染,不可能在自己渲图了
  18. xiuno开发文档_$ip-XiunoPHP 4.0 开发手册
  19. Nginx代理域名证书替换失效
  20. GraphQL 概念入门

热门文章

  1. Git出现 fatal: Authentication failed for 'http://xxx.xxx.xx:xxx.git/'解决方法
  2. 【NLP】文本分类算法-基于字符级的无词嵌入双向循环神经网络(双向 GRU)
  3. win10 屏幕亮度自动调节关闭
  4. FlashFXP基本使用教程
  5. 一个简单的搜狗微信公众号案例
  6. win10一直正在检查更新_受够了WIN10自动更新?阿虚教你一键禁止!
  7. AR和VR,有哪些知名的开源平台
  8. AR/VR应用前景探讨
  9. 音视频基础 、IPB帧及其特点
  10. 你的程序员是在努力工作还是在偷懒?