目录:

  • 1.渐近紧确界记号:ΘΘΘ(big-theta)
  • 2.渐近上界记号 :OOO(big-oh)
  • 3.渐近下界记号 :ΩΩΩ(big-omege)
  • 4.非渐近紧确上界:o(小-oh)
  • 5.非渐近紧确下界:ω(小-omege)
  • 6.渐近记号Θ、Ο、o、Ω、ω关系
  • 7.参考资料

1.渐近紧确界记号: Θ(big-theta)

  假设算法A的运行时间表达式T1(n)T_1(n)T1​(n)为:T1(n)=30n4+20n3+40n2+46n+100T_1(n)=30n^4+20n^3+40n^2+46n+100T1​(n)=30n4+20n3+40n2+46n+100
  假设算法B的运行时间表达式T2(n)T_2(n)T2​(n)为:T2(n)=1000n3+50n2+78n+10T_2(n)=1000n^3+50n^2+78n+10T2​(n)=1000n3+50n2+78n+10
当问题规模足够大的时候,例如n=100万,算法的运行时间将主要取决于时间表达式的第一项,其它项的执行时间只有它的几十万分之一,可以忽略不计。第一项的常数系数,随着n的增大,对算法的执行时间也变得不重要了。
  于是,算法A的运行时间可以记为:T1(n)≈n4T_1(n)≈n^4T1​(n)≈n4,记为T1(n)=Θ(n4)T_1(n)=Θ(n^4)T1​(n)=Θ(n4);算法B的运行时间可以记为:T2(n)≈n3T_2(n)≈n^3T2​(n)≈n3,记为T2(n)=Θ(n3)T_2(n)=Θ(n^3)T2​(n)=Θ(n3)。

ΘΘΘ的数学含义
方式一:设f(n)f(n)f(n)和g(n)g(n)g(n)是定义域为自然数集合的函数。如果lim⁡n→∞f(n)g(n)\displaystyle\lim_{n\rightarrow ∞}\dfrac{f(n)}{g(n)}n→∞lim​g(n)f(n)​存在,并且等于某个常数c(c>0)c(c>0)c(c>0),那么f(n)=Θ(g(n))f(n)=Θ(g(n))f(n)=Θ(g(n))。通俗理解为f(n)和g(n)f(n)和g(n)f(n)和g(n)同阶,ΘΘΘ用来表示算法的精确阶。

方式二:Θ(g(n))Θ(g(n))Θ(g(n))= f(n)f(n)f(n) :存在正常量 c1、c2和n0c_1、c_2和n_0c1​、c2​和n0​,使得对所有n≥n0n≥n_0n≥n0​,有0≤c1g(n)≤f(n)≤c2g(n)0≤c_1g(n)≤f(n)≤c_2g(n)0≤c1​g(n)≤f(n)≤c2​g(n) 若存在正常量c1、c2c_1、c_2c1​、c2​,使得对于足够大的n,函数f(n)f(n)f(n)能“夹入”c1g(n)与c2g(n)c_1g(n)与c_2g(n)c1​g(n)与c2​g(n)之间,则f(n)f(n)f(n)属于集合Θ(g(n))Θ(g(n))Θ(g(n)),记作f(n)∈Θ(g(n))f(n)∈Θ(g(n))f(n)∈Θ(g(n))。作为代替,我们通常记“f(n)=Θ(g(n))f(n)=Θ(g(n))f(n)=Θ(g(n))”。

  由下图中左侧f(n)=Θ(g(n))f(n)=Θ(g(n))f(n)=Θ(g(n))图可以看出,对所有n>n0n>n_0n>n0​时,函数f(n)f(n)f(n)乘一个常量因子可等于g(n)g(n)g(n),我们称g(n)g(n)g(n)是f(n)f(n)f(n)的一个 渐近紧确界 。ΘΘΘ记号在五个记号中,要求是最严格的,因为g(n)g(n)g(n)即可以表示上界也可以表示下界。

  需要注意的是:Θ(g(n))Θ(g(n))Θ(g(n))的定义要求每个成员f(n)∈Θ(g(n))f(n)∈Θ(g(n))f(n)∈Θ(g(n))均 渐近非负,即当n足够大时,f(n)f(n)f(n)非负。 渐近正函数 就是对所有足够大的n均为正的函数。

2.渐近上界记号:O(big-oh)

定义:设f(n)和g(n)f(n)和g(n)f(n)和g(n)是定义域为自然数集NNN上的函数。若存在正数c和n0c和n_0c和n0​,使得对一切n≥n0n≥n_0n≥n0​都有0≤f(n)≤cg(n)0≤f(n)≤cg(n)0≤f(n)≤cg(n)成立,则称f(n)f(n)f(n)的渐进的上界是g(n)g(n)g(n),记作f(n)=O(g(n))f(n)=O(g(n))f(n)=O(g(n))。通俗的说n满足一定条件范围内,函数f(n)f(n)f(n)的阶不高于函数g(n)g(n)g(n)。

  根据符号OOO的定义,用它评估算法的复杂度得到的只是问题规模充分大时的一个上界。这个上界的阶越低,评估越精确,越有价值。

例如:设f(n)=n2+nf(n)=n^2+nf(n)=n2+n,则
f(n)=O(n2)f(n)=O(n^2)f(n)=O(n2),取c=2c=2c=2,n0=1n_0=1n0​=1即可
f(n)=O(n3)f(n)=O(n^3)f(n)=O(n3),取c=1c=1c=1,n0=2n_0=2n0​=2即可。显然,O(n2)O(n^2)O(n2)作为上界更为精确。

几种常见的复杂度关系

O(1)<O(log⁡(n))<O(n)<O(nlog⁡n)<O(1)<O(\log(n))<O(n)<O(n\log n)<O(1)<O(log(n))<O(n)<O(nlogn)<O(n2)<O(2n)<O(n!)<O(nn)O(n^2)<O(2^n)<O(n!)<O(n^n)O(n2)<O(2n)<O(n!)<O(nn)
需要注意的是:对数函数在没有底数时,默认底数为2;如lg⁡n=log⁡n=log⁡2n\lg n=\log n=\log_2 nlgn=logn=log2​n因为计算机中很多程序是用二分法实现的。

符号用法测试:素数测试

int isprime(int n) {for(int i=2; i<=(int)sqrt(n); i++) {if(n%i==0) { return0;}}return1;
}

在上面这个素数测试的例子中,基本运算是整除;时间复杂度T(n)=O(n12)T(n)=O(n^{\frac{1}{2}})T(n)=O(n21​)是正确的。当被测的数n为偶数时,基本运算一次也没执行,所以T(n)=Θ(n12)T(n)=Θ(n^{\frac{1}{2}})T(n)=Θ(n21​)是错误的,因为没有办法证明T(n)T(n)T(n)的下界是Ω(n12)Ω(n^{\frac{1}{2}})Ω(n21​)。


3.渐近下界记号:Ω(big-omege)

定义:设f(n)和g(n)f(n)和g(n)f(n)和g(n)是定义域为自然数集NNN上的函数。若存在正数c和n0c和n_0c和n0​,使得对一切n≥n0n≥n_0n≥n0​都有0≤cg(n)≤f(n)0≤cg(n)≤f(n)0≤cg(n)≤f(n)成立,则称f(n)f(n)f(n)的渐进的下界是g(n)g(n)g(n),记作f(n)=Ω(g(n))f(n)=Ω(g(n))f(n)=Ω(g(n))。通俗的说n满足一定条件范围内,函数f(n)f(n)f(n)的阶不低于函数g(n)g(n)g(n)。

  根据符号ΩΩΩ的定义,用它评估算法的复杂度得到的只是问题规模充分大时的一个下界。这个下界的阶越高,评估越精确,越有价值。

例如:设f(n)=n2+nf(n)=n^2+nf(n)=n2+n,则
f(n)=Ω(n2)f(n)=Ω(n^2)f(n)=Ω(n2),取c=1c=1c=1,n0=1n_0=1n0​=1即可
f(n)=Ω(100n)f(n)=Ω(100n)f(n)=Ω(100n),取c=1/100c=1/100c=1/100 ,n0=1n_0=1n0​=1即可

显然,Ω(n2)Ω(n^2)Ω(n2)作为下界更为精确。

4.非渐近紧确上界:o(小-oh)

定义1:设 f(n)f(n)f(n) 和 g(n)g(n)g(n) 是定义域为自然数集NNN上的函数。若对于任意正数c,都存在n0c,都存在n_0c,都存在n0​,使得对一切n≥n0n≥n_0n≥n0​都有0≤f(n)<cg(n)0≤f(n)<cg(n)0≤f(n)<cg(n)成立,则称f(n)f(n)f(n)的渐进的非紧确上界是g(n)g(n)g(n),记作f(n)=o(g(n))f(n)=o(g(n))f(n)=o(g(n))。通俗的说n满足一定条件范围内,函数f(n)f(n)f(n)的阶低于函数g(n)g(n)g(n)。
定义2:设f(n)f(n)f(n)和g(n)g(n)g(n)是定义域为自然数集合的函数。如果lim⁡n→∞f(n)g(n)=0\displaystyle\lim_{n\rightarrow ∞}\dfrac{f(n)}{g(n)}=0n→∞lim​g(n)f(n)​=0,那么f(n)=o(g(n))f(n)=o(g(n))f(n)=o(g(n))。通俗理解为f(n)低于g(n)f(n)低于g(n)f(n)低于g(n)的阶。

由OOO记号提供的渐近上界可能是渐近紧确的,也可能是非紧确的。(如:2n2=O(n2)2n^2=O(n^2)2n2=O(n2)是渐近紧确的,而2n=O(n2)2n=O(n^2)2n=O(n2)是非紧确上界。)
例子:f(n)=n2+nf(n)=n^2+nf(n)=n2+n,则f(n)=o(n3)f(n)=o(n^3)f(n)=o(n3)


5.非渐近紧确下界:ω(小-omege)

定义1:设f(n)和g(n)f(n)和g(n)f(n)和g(n)是定义域为自然数集NNN上的函数。若对于任意正数c,都存在n0c,都存在n_0c,都存在n0​,使得对一切n≥n0n≥n_0n≥n0​都有0≤cg(n)<f(n)0≤cg(n)<f(n)0≤cg(n)<f(n)成立,则称f(n)f(n)f(n)的渐进的非紧确下界是g(n)g(n)g(n),记作f(n)=ω(g(n))f(n)=ω(g(n))f(n)=ω(g(n))。通俗的说n满足一定条件范围内,函数f(n)f(n)f(n)的阶高于函数g(n)g(n)g(n)。
定义2:设f(n)f(n)f(n)和g(n)g(n)g(n)是定义域为自然数集合的函数。如果lim⁡n→∞f(n)g(n)=∞\displaystyle\lim_{n\rightarrow ∞}\dfrac{f(n)}{g(n)}=∞n→∞lim​g(n)f(n)​=∞,那么f(n)=o(g(n))f(n)=o(g(n))f(n)=o(g(n))。通俗理解为f(n)高于g(n)f(n)高于g(n)f(n)高于g(n)的阶。

ωωω记号与ΩΩΩ的关系类似于o和Oo和Oo和O记号的关系。我们用ωωω表示一个非渐近紧确的下界。
例子:f(n)=n2+nf(n)=n^2+nf(n)=n2+n,则f(n)=ω(n)f(n)=ω(n)f(n)=ω(n)是正确的。f(n)=ω(n2)f(n)=ω(n^2)f(n)=ω(n2)则是错误的,f(n)=Ω(n2)f(n)=Ω(n^2)f(n)=Ω(n2)是正确的。


6.渐近记号Θ、Ο、o、Ω、ω关系

记号 含义 通俗理解
(1)Θ(西塔) 紧确界。 相当于"="
(2)O (大欧) 上界。 相当于"<="
(3)o(小欧) 非紧的上界。 相当于"<"
(4)Ω(大欧米伽) 下界。 相当于">="
(5)ω(小欧米伽) 非紧的下界。 相当于">"


7.参考资料

1.算法导论  殷建平 译   机械工业出版社
2.算法设计与分析 屈婉玲  著
3.算法设计与分析 王秋芬  吕聪颖著

算法导论------渐近记号Θ、Ο、o、Ω、ω详解相关推荐

  1. 算法导论 — 思考题3-4 渐近记号的性质

    (渐近记号的性质)假设f(n)f(n)f(n)和g(n)g(n)g(n)为渐近正函数.证明或反驳下面的每个猜测. a. f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))蕴含 ...

  2. EM算法(Expectation Maximization Algorithm)详解

    EM算法(Expectation Maximization Algorithm)详解 主要内容 EM算法简介 预备知识  极大似然估计 Jensen不等式 EM算法详解  问题描述 EM算法推导 EM ...

  3. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  4. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  5. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  6. 【JVM】对象存活判定算法、GC算法、STW、GC种类详解

    [JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...

  7. 【目标检测算法-锚框公式推导及代码详解】

    目标检测算法-锚框公式推导及代码详解 0 沐神对锚框的宽高计算并未推导以及讲解 1 锚框宽高公式推导 1.1 基础概念 1.2 锚框宽高公式推导 1.3 图片验证计算 1.4 小结 2 代码详解 2. ...

  8. 大白话解析Apriori算法python实现(含源代码详解)

    大白话解析Apriori算法python实现(含源代码详解) 一.专业名词解释 二.算法思路 三.python代码实现 四.Aprioir的优点.缺点及改进方法 本文为博主原创文章,转载请注明出处,并 ...

  9. 《算法导论》算法分析 5种渐近记号 Θ O o Ω ω

    当输入规模足够大,使得运行时间只与增长量级有关时,需要研究算法的渐近效率.也就是,当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加.本文中所用插图来自<算法导论> ...

  10. 算法复杂度分析(渐近记号)

    [见解]关于算法复杂度的理解不能只停留在根据代码直接凭感官或者经验直接推测其公式(例如:根据for循环直接推测出一个O(n)复杂度,关于复杂度的理解更应该深入到其所代表的函数空间中去. 1.渐进记号 ...

最新文章

  1. 如何找寻最适合的WEB应用安全解决方案(视频)
  2. android APK内存多少字节,Android apk安全测评、应用加固、字节对齐、二次签名(有这一篇就够了)...
  3. 下面方框中,那些包括有220欧姆的电阻呢?
  4. Python Django开发案例:显示登录页面
  5. Windows Server 2016与旧版本系统比较
  6. 《PHP和MySQL Web开发从新手到高手(第5版)》一一第1章 安装
  7. 古风一棵桃花树简笔画_广东有个现实版的“桃花源”,藏于秘境之中,最适合情侣来度假!...
  8. 1295. 统计位数为偶数的数字
  9. C++生成一个随机网络
  10. pythonjava有什么区别_Python与JAVA有何区别?
  11. iOS8以后,跳转到设置页面
  12. 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品 HTML+CSS+JavaScript
  13. mqtt测试工具(持续更新...)
  14. 选修了两门课的学生学号MySQL语句_SQL 语句:在sc表中查询至少选修了两门课的学生学号的语句...
  15. java 继承的写法_Java 类的继承详解
  16. 怎样在服务器找回网站后台密码,宝塔面板忘记后台账号密码怎么找回 一条命令轻松搞定...
  17. 用Android-X86和VirtualBox打造高性能Android开发环境
  18. 计算机文化基础案例教程第三版答案,计算机文化基础案例教程教学课件作者第3版谭宁教学课件素材排骨做法.doc...
  19. 关于JDBC我所想说的
  20. 【亲测有效!!!】解决git did not exit cleanly (exit code 1) 错误

热门文章

  1. 周伟焜:杨元庆一定会带领联想成功
  2. 超级管理器Android,超级文件管理器
  3. 【小教程】Ubuntu ASF steam自动挂卡
  4. 保存到千牛服务器的文件在哪里,压缩包里的文件保存后在哪里?
  5. UE4 实现C++蓝图接口
  6. oel6安装oracle报错,OEL6.1下安装Oracle 11gr2 RAC
  7. excel自动求和_excel工作表的行或列怎么自动求和
  8. 【转】redis利用姿势收集
  9. 私募基金相关知识介绍(一)——TOT
  10. [kernel]linux内核基础: 版本、源码、编译与调试