如果算法A需要的时间与f(n)成正比,则算法A称为f(n)阶,表示为O(f(n))。函数f(n)称为算法的增率函数(growth-rate function)。该表示法使用大写字母O来表示(order),故称大O表示法。若规模为n的问题需要的时间与n成正比,则问题表示为O(n),即n阶。若需要的时间与n^2成正比,则问题表示为O(n^2),以此类推。
下面是算法的阶的定义。
        若存在常量k和n0,使算法A在解决规模n>=n0的问题时,需要的问题单元不大于k*f(n),则算法A为f(n)阶,表示为O(f(n))。
        O(f(n))定义中的条件n>=n0正式阐明了问题规模足够大的概念,一般地,有很多k和n值可以满足这个定义。大O表示法的几个数学属性有助于简化算法分析。在讨论这些属性是要记住,O(f(n))意为f(n)阶,O并不是一个函数。
       1)可忽略算法增率函数的低阶项。
       2)可忽略算法增率函数中高阶项的倍数常量。
       3)O(f(n))+O(g(n))=O(f(n)+g(n))可组合增率函数。

来源: <http://blog.csdn.net/chenloug/article/details/6917244>

对于任何数学函数,这三个记号可以用来度量其“渐近表现”,即当趋于无穷大时的阶的情况,这是算法分析中非常重要的概念。大家可以把它们分别想象成≤、≥和,分别估计了函数的渐近上界、渐近下界和准确界。诚然,渐近关系和确切大小关系是有区别的,但当问题规模很大时,忽略这种区别能大大降低算法分析的难度。

下面我们就来具体定义这三种记号的表示。

设函数f ( n )代表某一算法在输入大小为n的情况下的工作量(效率),则在n趋向很大的时候,我们将f (n)与另一行为已知的函数g(n)进行比较:

1)如果0,则称f (n)在数量级上严格小于g(n),记为f (n)=o( g(n))。(小o表示法)

2)如果正无穷,则称f (n)在数量级上严格大于g(n),记为f (n)=( ( g(n))。(?)

3)如果c,这里c为非0常数,则称f (n)在数量级上等于g(n),即f (n)和g(n)是同一个数量级的函数,记为:f (n)=Θ( g(n))。

4)如果f (n)在数量级上小于或等于g(n),则记为f (n)=O( g(n))。(大O表示法)

5)如果f(n)在数量级上大于或等于g(n),则记为f (n)=Ω( g(n))。

这里我们假定f (n),g (n)是非负单调的,且极限存在。如果这个极限不存在,则无法对f (n)和g (n)进行比较。在进行此种计算时,一个经常用到的技术是洛必达(L'Hopital)法则。该法则由17世纪法国数学家Guillaume de L'Hopital发现(也有人认为是瑞士数学家Johann Bernoulli发现的)。该法则声称,两个函数的比率极限等于两个函数的导数的比率极限,这里当然假定两个函数的导数比率的极限存在,即有:

有了这个定义,就可以对素性测试的两个算法进行比较了。

,符合第1个定义,因此这两个素性测试算法的效率差异是数量级的差异。

在算法分析中,最常选取的g(n)有如下一些,见表2-1。

一个值得提醒的问题是,根据定义,对于任意一个g (n)函数来说,可能存在很多个函数f (n),使得f (n)=O(g(n)),即O(g(n))表示的实际上是一个函数的集合,这里的等于也不是普通意义上的等于,而是说明f (n)是函数集合o(g(n))里的一员,即f (n)=O(g(n))并不意味着f (n)等于O(g(n))。等于号的这种使用令那些严谨的科学家非常不快甚至愤怒,但计算机界人士很喜欢这种马虎的表示。不过,我们在心里应该知道,f (n)=O(g(n))并不意味着f (n)≠O(g(n))。不然,我们就被自己骗了!

等号在其他渐近表示中的使用也可以同样解释。

来源: <http://book.2cto.com/201211/8127.html>

算法概念:大O表示法/小o表示法/Ω/Θ相关推荐

  1. JAVA(4)学习笔记:JVM虚拟机上的栈、大驼峰命名法和小驼峰命名法、实参和形参、重载方法、调用栈、递归练习(汉诺塔+斐波那契数列)、数组的定义、数组的初始化、增强for循环。

    接上次的博客:JAVA学习(3)--知识整理以及一些简单程序(猜数字游戏.求各种自幂数.求出一个数字的二进制位中1的个数.获取一个数二进制序列中所有的偶数位和奇数位.求公约数的多种实现方式.输入密码程 ...

  2. 命名规则之大驼峰命名法和小驼峰命名法

    大驼峰命名规则又称骆驼式命名法(Camel-Case),是电脑程式编写时的一套命名规则(惯例).是指混合使用大小写字母来构成变量和函数的名字. 程序员们为了自己的代码能更容易的在同行之间交流,所以多采 ...

  3. 大驼峰命名法和小驼峰命名法

    前言 我们在做项目的时候,命名格式必须统一,这样才会方便不同人之间的编码阅读!,所以今天就来说一下驼峰命名法! 骆峰式命名法(Camel-Case)是电脑程式编写时的一套命名规则(惯例). 骆峰式命名 ...

  4. 算法 - 堆排序(大顶堆、小顶堆)

    用的是顺序存储二叉树,也就是数组实现的二叉树,遍历的时候按照的是二叉树的形式 代码实现 package tree;import java.util.Arrays;public class HeapSo ...

  5. 图像处理_Ostu算法(大律法、最大类间方差法)

    一.算法简述 Otsu算法是一种用于二值化最佳阈值的选取方法.基本原理是根据阈值T将图像中的像素点分为C1和C2两类,不断的调整阈值T之后若此时两类之间存在最大的类间方差,那么此阈值即是最佳阈值. 二 ...

  6. 算法分析之大O、大Ω、大Θ和小o表示法

    算法分析中常常使用大O表示法.大Ω表示法.大Θ表示法和小o表示法来对算法复杂度进行分析.本文就来讨论它们的具体定义并给出一些例子. 在不同的参考书上大O表示法会出现不同的定义,但是本质上它们都是统一的 ...

  7. 编程面试的10大算法概念汇总

    编程面试的10大算法概念汇总 嘿,第一次翻译文章,在ProgramCreek看到的,原文章名为Top 10 Algorithms for Coding Interview, 对于我这个明年即将直奔BA ...

  8. 数据结构考研:大O表示法最浅显易懂且详细深入的解释及与小o表示法的区别(十分钟必懂)

    大O表示法的背景 作为软件工程专业的学生,在我们学习数据结构的时候,总是会碰见对各种算法时间复杂度和空间复杂度的大O表示法的描述.我们只是将信将疑的用着,并不知道大O表示法的准确含义,今天博主李同学在 ...

  9. 计算机e的指数怎么计算方法,e^x的基本算法——剥离大指数法

    e^x的基本算法--剥离大指数法 e^x泰勒展开式 e^x = 1+x+x^2/2!+x^3/3!+--+x^n/n!+-- 当x<0.1时,e^x泰勒展开式收缩很快, 当x=1时,e=1+1/ ...

最新文章

  1. Nginx配置文件nginx.conf中文详解(转)
  2. Lambda表达式很鸡肋?它到底有何用呢?
  3. 在Windows下安装配置OpenCV-Python-PyCharm开发环境
  4. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.2. 鸟哥的Linux苦难经验全都录)
  5. [导入]软件工程和乒乓球
  6. 运行第一个docker容器
  7. 学计算机的男孩子怎么追女孩子,男孩子追女孩子的套路,原来有这么多,快来学一学...
  8. MySQL中GTID的几个限制和解决方案(r13笔记第21天)
  9. 105款移动应用程序就此被清理下架!
  10. 常用图表的用法-分布类
  11. 商户监控中一个基础的反洗钱规则不要漏了
  12. 2018阿里笔试题一道
  13. css flex布局iOS8兼容性问题
  14. 跨平台调用之一——java调用so库
  15. 24位RGB颜色转换为16位RGB
  16. LFSR和PRBS是什么关系?prbs怎么产生?
  17. 职场六大困惑,处理不好每一个都很扎心
  18. mysql 用户名唯一,mysql用户名和密码(mysql忘记用户名密码)
  19. 【OCR】文本检测方案 TextFuseNet解读
  20. 收支两条线资金管理模式的应用

热门文章

  1. 方舟服务器id哪里显示,方舟怎么看自己的ID | 手游网游页游攻略大全
  2. S@Kura的PHP进阶之路(四)
  3. S@Kura的PHP进阶之路(五)
  4. post 防篡改_Cookie防篡改机制
  5. php+Sphinx分词中间件的认识和基础使用(亲测)
  6. C++ XML操作类
  7. 【投资】如何绘制期权收益图
  8. 微信扫码下载APP(带有蒙层)
  9. Pytorch目标检测实现
  10. 提前祝福你和你和家人国庆节快乐,旅途愉快!