点击上方蓝字,关注公众号

目录

  • 1. The Gist

    • 1.1 为什么要学它(Motivation)

    • 1.2 High level idea

    • 1.3 4个例子

  • 2. Big-Oh Notation

    • 2.1 文本定义

    • 2.2 图形定义

    • 2.3 数学定义

  • 3. 2个例子

    • 3.1 k阶多项式是O(n^k)

    • 3.2 k阶多项式不是O(n^(k-1))

  • 4. Big Omega and Theta

    • 4.1 Big-Omega表示法

    • 4.2 Big-theta表示法

    • 4.3 Little-O表示法

    • 4.4 渐进性表示法的来源

  • 5. 几个额外的例子【可选】

    • 5.1 在指数中添加一个常数

    • 5.2 指数乘以一个常数

    • 5.2 最大值和求和

1. The Gist

1.1 为什么要学它(Motivation)

我们的目的是寻找一种对算法进行衡量的最有效力度,我们希望忽略不重要的细节,例如常数因子和低阶项,把注意力集中在算法的运行时间是怎样随着输入长度的增长而增长的,这些任务是通过大O表示法(包括它的近亲表示法)的形式完成的,每个程序员都应该掌握这个概念。


它是行业术语渐进性表示法提供了讨论算法设计与分析的基本术语,当我们听到某个程序员谈论他的某段代码以"n的大O时间运行",而另一段代码,以"n平方的大O时间运行"时,我们需要知道其中的意思。它是区别不同算法的"sweet spot"它有粗放和精细的两个特征。粗放:忽略了所以我们想要忽略的细节,比如说计算机体系结构,具体选择的编程语言以及编译器等方面的细节。精细:可以在不同层次对解决这个问题不同算法进行比较,尤其在巨大输入情况下,输入的规模越大,就越需要精妙的算法。

1.2 High level idea

一句话概括渐进性表示法的话,就是忽略常数因子和它的低阶项。为什么我们要忽略常数因子和它的低阶项?根据定义,我们把注意力放在大规模的输入时低阶项的作用就几乎可以忽略了,而大规模的输入才是需要精妙算法的时候,同时常数因子一般高度依赖于环境的细节,如果我们分析算法时并不想固定于某种特定语言计算机体系结构和编译器,那么使用不在意的常数因子就会非常合理。不是说忽略的就不重要,什么时候它重要?忽略的意思并不是说常数因子是完全无关紧要的,只不过当我们想要对解决同一个问题的一些不同方法进行比较的时候,渐进性表示法往往是正确的工具,它能帮助我们理解哪种算法的性能最佳,尤其是当输入规模非常大时,但我们确定了某个问题的最佳高级算法后,可能还想进一步优化常数因子和低阶项。

1.3 4个例子

这里有4个比较简单的例子,如果是第一次接触这个概念的朋友可以自己试着做一下,求每个例子的渐进性运行时间。后台回复【渐进性表示法】查看答案。Algorithm 1数组A中包含整数t吗?

  1: for i = 1 to n do  2:   if A[i] == t then  3:       Return TRUE  4: Return FALSE

Algorithm 2给定数组A,B和整数t,A或B中包含t吗?

1:  for i = 1 to n do2:     if A[i] == t then3:         Return TRUE4:  for i = 1 to n do5:     if B[i] == t then6:         Return TRUE7:  Return FALSE

Algorithm 3数组A,B有相同的元素吗?

1: for i = 1 to n do2:    for j = 1 to n do3:       if A[i] == B[j] then4:           Return TRUE5: Return FALSE

Algorithm 4数组A中有重复的元素吗?

1: for i = 1 to n do2:    for j = i+1 to n do3:       if A[i] == A [j] then4:           Return TRUE5: Return FALSE

2. Big-Oh Notation

2.1 文本定义

大O表示法关注的是定义在正整数n = 1,2,3..上的函数T(n),T(n)总是表示某个算法的最坏情况运行时间的上界,那么当我们说T(n)=O(f(n))的时候表示什么意思呢?


T(n)=O(f(n))当且仅当T(n)的最终上界是f(n)的一个常数积。

2.2 图形定义

由下图我们看到T(n)的上界并不是由f(n)决定的,是由f(n)乘以3所形成的上面那个虚线决定的,当n的值足够大时超过n0这个分界点,之后它的值就会大于T(n),所以T(n)实际上最终是由f(n)的常数积确定上界,我们就可以说T(n)=O(f(n))。


这里的常数c满足f(n)的常数倍,常数n0满足最终。

2.3 数学定义


T(n)=O(f(n))表示当且仅当存在正常数c和n0,对所有的,不等式都成立。这个数学公式实际上是对文本定义的直接翻译。“对所有的n大于等于n0”表示这个不等式只需要当n足够大的时候(n0确定了具体的大小)最终能够成立,而在图中常数c对应的是3,n0对应的是函数T(n)和cf(n)之间的分界值.warning:一个警告,当我们说c和n0是常数,意思是它并不依赖于n,比如说图中的c和n0是固定的数字,像是300,1000,如果我们在证明中看到n0=n,或者c=log(n)这样的说法,它就是与n有关的,就不是常数值了。

3. 2个例子

3.1 k阶多项式是O(n^k)


这个命题表示在多项式的大O表示法中,我们需要关注的是出现在多项式的最高阶。因此大O表示法确实忽略了常数因子和低阶项。简化版的证明过程如下


以下是详细版本的解释。根据大O表示法的数学定义,我们需要的是找到一对正整数c和n0,我们先假设这两个常量的值: n0=1,c等于所有系数的绝对值之和:。这两个数都与n无关,现在我们需要证明选择的这两个常量满足不等式,即对所有,都有。首先我们看看T(n)的定义:如果我们在右边取每个系数的绝对值,这个表达式只会变得更大。(只会比更大,由于是正数,只会比更大),于是:既然系数是非负数,我们也可以用类似的技巧让n的不同乘方转换成n的公共乘方。由于,对于每个,只会比更大,由于是非负正数,所以只会比更大。就意味着:对于每个,这个不等式是成立的,这就是我们想要的证明结果。

3.2 k阶多项式不是O(n^k-1)

它表示不同阶的多项式的大O表示法是不同的。我们可以用反证法,假设结论的相反结论是对的,并在这个假设上进行一系列的逻辑正确的步骤,最后推导出出错。简单的证明过程如下


以下是详细的文字解释。因此假设=,那么它意味着什么呢?的最终上界是的一个常数积确定的。也就是说,存在常数c和,对于所有的,都存在由于n是正数,我们可以从两边消去,于是对于所有的,都存在。相当于说c比每个正整数都要大,这是明显错误的(可以取n的值是c+1向上取最接近的整数),这就说明原来的假设是错误的。

4. Big Omega and Theta

4.1 Big-Omega表示法

文字表示法就是,当且仅当T(n)的下界是由f(n)的一个常数积所确定,那么T(n)就是另一个函数f(n)的大。数学定义如下:当且仅当存在正常数c和,使得对于每一个,都有。对应的图形式如下:


f(n)并没有确定T(n)的下界,但是如果把它乘以常数,那么就是在临界点的右边确定了T(n)的下界。

4.2 Big-theta表示法

它可以类比于“等于”,相当于同时满足和,相当于T(n)被夹在f(n)的两个不同的常数积之间。数学定义如下:


当且仅当存在正常数,使得当的时候,有。

4.3 Little-O表示法


T(n)=o(f(n))表示当且仅当对所有c>0的常数,存在常数n0,对所有的,不等式都成立。

4.4 渐进性表示法的来源

渐进表示法不是由计算机科学家发明的,是开始于数论。


5. 几个额外的例子【可选】

5.1 在指数中添加一个常数

这个例子是说,一个函数的指数与一个常数相加,并不会改变这个函数的渐进性时间增长率。简化的证明过程:

更详细的解释:要证明这个,我们需要找到合适的正常数c和,使得对于所有的,T(n)的最大值是,我们来对它进行反向工程。我们在寻找一个推导方式,不断的放大T(n)使得它是的常数倍,我们看到T(n)的指数里有个10,很自然的想着把它分出去:我们发现右边就是的常数倍,这就提醒我们c取1024。假设选择这个c,那么对于所有的都有,因此我们取,那么就证明出来了。

5.2 指数乘以一个常数

这个命题的意思是,把一个指数函数的指数和一个常数相乘改变了它的渐进性增长率。简化的证明过程:更详细的文字:这个用反证法来证明,它的相反结论是对的,就是。根据大O的定义,存在正常数c和,对于所有的,都有,因为是个正数,所以我们可以两边去掉,就得,这个是错误的,因为右边是个固定的数,而左边是随着n增加而无限增加的,说明我们的假设是错误的,这就证明得了原问题。

5.2 最大值和求和

这个例子表示从渐进性的角度,取两个非负数的逐点最大值和取她们的和没有什么差别。简化的证明过程:的含义表示T(n)最终位于f(n)的两个不同常数倍之间。我们需要三个常数: ,,,后面两个对应较大倍数和较小倍数。我们对几个数进行反向工程。任何一个正整数都存在以下关系:因为不等式的右边就是左边的数加上另一个非负数(f(n)和g(n)中较小的那个数)。类似的因为不等式的左边是f(n)和g(n)中较大那个的两倍,把两个不等式合在一起就是,对每个,都有确实位于两个不同倍数之间,相当于今日互动欢迎在评论区留下不懂的~原创文章,欢迎转载,转载请在公众号菜单栏查看【联系我】。喜欢本文的小伙伴点【在看】分享给你的朋友?↓↓↓

哈工大威海算法设计与分析_【斯坦福算法分析和设计02】渐进分析相关推荐

  1. 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  2. 怎么用spss做冗余分析_用SPSS进行医学统计信度分析——【杏花开医学统计】

    杏花开生物医药统计 一号在手,统计无忧! 关 注 用SPSS进行医学统计信度分析 关键词:SPSS.信度分析 导 读 上期,我们介绍了量表的基本形式及其研制步骤. 点击观看:<医学研究中量表研制 ...

  3. 数据库课程设计矿大_管理信息系统课程设计样本.pdf

    管理信息系统课程设计样本 小组成绩: -- <校园二手书服务系统> -- <校园二手书服务系统> 小组名称:进行时 小组名称:进行时 专业年级:人 12 级 力 2 专业年级: ...

  4. java ui设计用什么_什么是UI设计?

    UI设计是什么? 做为一名设计师前辈我来帮你和帮想学习UI设计的小伙伴们解答一下这个问题 首先大家先跟着我来了解一下什么是UI设计 我们只有了解了什么是UI设计才能进一步的学习. 什么是UI设计? U ...

  5. r语言进行go富集分析_好用的在线GO富集分析工具

    点击上方蓝字关注生信宝典,换个角度学生信. GeneOntology富集分析是高通量数据分析的标配,不管是转录组.甲基化.ChIP-seq还是重测序,都会用到对一个或多个集合的基因进行功能富集分析.分 ...

  6. 大豆技术面分析_技术贴 | GIS三维视域分析—面要素

    GIS 视域分析 理论 01 部分 之前写了一篇技术贴:GIS三维视域分析里面讲了视域分析的相关理论及应用案例,以及具体点.线的视域分析,面要素比较概况,应某位小可爱的要求,今天详细分析面要素的视域分 ...

  7. 用python对股票进行可视化分析_使用Python对股票进行可视化分析

    前言 本文通过对 一.数据爬取 博主采用的数据爬取方式是:利用python的财经数据包tushare,就直接可以将你想获取的数据下载下来,它也是有接口的,利用不同的接口可以获取不同的数据. 代码如下: ...

  8. 产品设计美学案例分析_美学在产品设计中的重要性

    产品设计美学案例分析 重点 (Top highlight) In one of my previous jobs, I had really interesting debates with the ...

  9. 因子分析_主成分分析_独立成分分析_斯坦福CS229_学习笔记

    Part VIII 因子分析 主成分分析 独立成分分析 在上个部分介绍了EM算法,在此部分因子分析中,我们会再次应用到. 因子分析.主成分分析和独立成分分析都作为对于数据维度进行处理的手段,对于我们理 ...

最新文章

  1. python爬取网易云音乐问题陈述_python 网易云音乐 评论爬取问题
  2. 更少的标签,更好的学习,谷歌半监督学习算法FixMatch
  3. python3 循环获取checkbutton_Python3 tkinter基础 Menu add_checkbutton 多选的下拉菜单
  4. 传统反病毒产品丧钟响起
  5. 若启用该计算机上的无线功能 请使用,无线网络启用后还显示已禁用怎么办_常见问题解析...
  6. php调用winhttp,HTTP HTTPS POST GET(包含curl版本和winhttp两种实现)
  7. 小米笔记本Pro 黑苹果10.15.2记录 不需要焊接,完美支持airdrop、接力、随航
  8. 我连鼠标光标都是爱你的形状——MATLAB自定义光标及png转化为光标数组
  9. JSD-2204-(业务逻辑开发)-发酷鲨商城front模块-开发购物车功能-Day09
  10. C#判断用户是否使用微信浏览器,并据此来显示真实内容或二维码
  11. 核桃编程学员对话诺贝尔奖得主 用童心预见未来 探讨人工智能发展
  12. ocv特性_锂离子电池的三大特性分析
  13. 关于数据治理的读书笔记 - 企业数据治理的“道、法、术、器”
  14. (四)Linux环境部署(Centos+Nginx+Tomcat+Mysql) - 安装Tomcat和JDK 以及 Nginx与Tomcat整合
  15. 3D EXPERIENCE DraftSight的协作能力
  16. #python+open3d 3D模型的读取与应用
  17. 永远的优客李林——Just for you
  18. 聊一聊火爆的DevOps到底是什么
  19. Python爬取哔哩哔哩弹幕并且造词云图简单版!!!
  20. 选择法排序的两种方法

热门文章

  1. mysql语句解析_mysql 语句的查询过程解析
  2. IAR下μCosIII移植心得
  3. C/C++ stack栈的理解以及使用
  4. java mvel_mvel java和脚本的融合 -- kkito的博客
  5. java一致性hash api_一致性哈希算法学习及JAVA代码实现分析
  6. MogDB/openGauss 故障排查思路
  7. 2场直播丨CloudQuery最佳实践,
  8. MYSQL 5.7.26 二进制版本安装
  9. 静默错误:Oracle 数据库是如何应对和处理的 ?
  10. Java编程中忽略这些细节,Bug肯定找上你