对于某些问题,一些算法更适合于用小规模的输入,而另一些则相反。幸运的是,在评价算法运行效率时,我们往往可以忽略掉其处理小规模问题时的能力差异,转而关注其在处理大规模数据时的表现。道理是显见的,处理大规模的问题时,效率的些许差异都将对实际执行效率产生巨大的影响。这种着眼长远,更为关注时间复杂度的总体变化趋势和增长速度的策略和方法,即所谓的渐进分析(asymptomatic analysis)。

1. 大 OO 记号

出于保守的估计,我们首先关注 T(n)T(n) 的渐进上界,为此引入大 OO 记号。具体地,若存在正的常数 cc 和函数 f(n)f(n),使得对任何 n>>2n >> 2 都有:

T(n)≤c⋅f(n)

T(n)\leq c\cdot f(n)
则可认为在 nn 足够大之后,f(n)f(n) 给出了 T(n)T(n) 增长速度的一个渐进上界,此时,记之为:

T(n)=O(f(n))

T(n)=O(f(n))
由这一定义,可导出大 OO 记号的以下性质:

  • (1)对于任一常数 c>0c>0,有 O(f(n))=O(c⋅f(n))O(f(n))=O(c\cdot f(n))

    取 c′>cc'>c,则c⋅f(n)≤c′⋅f(n)c\cdot f(n)\leq c'\cdot f(n)

    • (2)对于任意常数 a>b>0a>b>0,有 O(na+nb)=O(na)O(n^a+n^b)=O(n^a)

      na+nb≤2⋅nan^a+n^b\leq 2\cdot n^a

    2. 大 Ω\Omega 记号

    为了对算法的时间复杂度最好情况做出估计,需要借助另一个记号,如果存在正的常数 cc 和函数 g(n)g(n),使得对于任何 n>>2n >> 2 都有:

    T(n)≥c⋅g(n)

    T(n)\geq c\cdot g(n)

    就可以认为,在 nn 足够大之后,g(n)g(n) 给出了 T(n)T(n) 的一个渐进下界。此时我们记之为:

    T(n)=Ω(g(n))

    T(n)=\Omega(g(n))

    与大 OO 记号恰好相反,大 Ω\Omega 是对算法执行效率的乐观估计,对于规模为 nn 的任意输入,算法的运行时间都不低于 Ω(g(n))\Omega(g(n))。

    3. 大 Θ\Theta 记号

    借助大 OO 记号,大 Ω\Omega 记号,可以对算法的时间复杂度做出定量的界定,亦即,从渐进的趋势看,T(n)T(n) 介于 Ω(g(n))\Omega(g(n)) 与 O(f(n))O(f(n)) 之间。若恰巧出现 g(n)=f(n)g(n)=f(n) 的情况,则可以使用另一个记号表示,如果存在正的常数 c1<c2c_1和函数 h(n)h(n),使得对于任何 n>>2n>>2,都有,

    c1⋅h(n)≤T(n)≤c2⋅h(n)

    c_1\cdot h(n)\leq T(n) \leq c_2\cdot h(n)

    就可以认为在 nn 足够大之后,h(n)h(n) 给出了 T(n)T(n) 的一个确界,我们记之为:

    T(n)=Θ(h(n))

    T(n)=\Theta(h(n))

数据结构与算法的分析 —— 渐进复杂度(三个记号)相关推荐

  1. 数据结构与算法 (1)复杂度---(时间复杂度)

    这是一个全新的专栏,内容主要是用C语言学习数据结构的初阶内容,一是复习,二是希望能带给大家一些帮助. 从今天开始,我们进入数据结构与算法的学习,在进入今天的内容之前,我们先了解一下什么是数据结构,什么 ...

  2. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  3. 数据结构与算法--举例分析法- 栈的压入弹出序列

    举例分析 与上两篇问中画图方法一样,我们可以用举例模拟的方法思考分析复杂问题.当一眼不能看出问题的规律的时候,我们可以用几个具体的例子来模拟一下问题的过程.这样就和我们在程序出现问题时候的debug一 ...

  4. 数据结构与算法的分析

    算法的分析包括两部分内容: 1. 时间复杂度: 2. 空间复杂度. 1. 空间复杂度分析 1.1 装填因子(load factor) 我们以向量(Vector)的实现为例.向量实际规模与其内部数组容量 ...

  5. 数据结构与算法之-----栈的应用(三)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...

  6. 数据结构与算法的分析 —— 平均时间复杂度 vs 分摊时间复杂度

    平均时间复杂度:假定各种输入实例的出现符合某种概率分布(如均匀独立随机分布)之后,进而估计出的加权时间复杂度均值. 分摊时间复杂度,纵观连续的足够多次操作,并将其间总体所需的运行时间分摊至各次操作.与 ...

  7. 算法复杂性和渐进复杂意义下的记号 O、Ω、θ

    算法复杂性 算法复杂性 === 算法运行时所需要的计算机资源的量 通常指的是空间.时间资源 影响时间复杂性的因素 影响时间复杂性的因素有: 问题规模nnn.输入序列III.算法本身AAA 问题规模:如 ...

  8. 【离散数学中的数据结构与算法】七 排列与组合三

    前两篇文章学习了不可重复选取的排列与可重复选取的可重排列.本篇文章开始学习组合的相关定理. 文章目录 1 组合 1.1 组合的计算公式 2 总结 1 组合 跟排列一样.组合也分为不重复选取的组合,与可 ...

  9. 记一次数据结构与算法作业:利用循环和递归输出1-N的正整数的程序分析比较

    随便记录一次数据结构与算法的分析作业,内容为分析循环和递归实现输出1-N的正整数的对比.从时间和空间上分析了两种方式实现的递归方法和循环区别. 一.数据记录图表 二.分析 第一张图表制作时由于在打游戏 ...

最新文章

  1. 开启JanusGraph中的监控功能
  2. linux系统的数据库是本地吗,Linux下MySQL无法在本地以非root用户身份连接数据库...
  3. 基于SSD的Kafka应用层缓存架构设计与实现
  4. oracle 在数据库打开状态下进行备份时_下面描述不正确的是,Oracle数据库DBA面试题50道及答案_经典...
  5. 12 File and Device I/O using System Calls
  6. LINUX 下 RABBITMQ安装与配置
  7. dxComponentPrinter记录
  8. mysql select string,MySql查询在select中用空stringreplaceNULL
  9. 体系结构方案 - 临时性数据计算
  10. 社区保密计算机使用制度,社区保密工作制度
  11. 六万字 HTTP 必备知识学习,程序员不懂网络怎么行,一篇HTTP入门 不收藏都可惜
  12. flask 数据库迁移migration
  13. 泰拉瑞亚试图加载不正确的_泰拉瑞亚Switch中文版将在12月19日发售|宝可梦 剑/盾大量细节公布 自动存档可关经验平均分配等...
  14. 按头安利 好看又实用的相机 单反免抠元素素材看这里
  15. Lenovo X61鸟枪换炮之更换大硬盘
  16. Python分布式爬虫实战 - 豆瓣读书
  17. 7-2 计算正五边形的面积和周长 (25分)
  18. 将Shapefile数据导入Winbugs的方法
  19. 解决:docker容器内可以访问web应用,端口映射到宿主机却无法访问,错误代码:curl: 56 Recv failure: 连接被对方重设
  20. 孔子的名言,值得一生品读!

热门文章

  1. android双usb麦克风,USB麦克风24bit192K单麦芯片方案-SSS1630
  2. js图片 area 颜色_JS提取图片的主体颜色
  3. Intellij IDEA的配置
  4. java一览删除一条数据_可以删除单条数据,不能再返回列表页面,我使用的是Spring MVC...
  5. jquery 操作 input显示或者隐藏
  6. oracle数据库索引介绍,SQL Server和Oracle数据库索引介绍
  7. 2字段添加注释_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  8. 1 linux下tcp并发服务器的几种设计的模式套路,Linux下几种并发服务器的实现模式(详解)...
  9. html5的video怎么把里面的控制器移出来_电动车突然不走了,但控制器和转把没坏,但车走电,这是怎么回事...
  10. Redis教程:主从复制