科普一下算法的度量——Big O, Big Omega, Big Theta以及Udi Manber的大OO

原创 2008年08月06日 23:35:00

科普一下算法的度量——Big O, Big Omega, Big Theta以及Udi Manber的大OO

目录
[引子]
[正文]
[结论]
[关于作者]
[声明]

[引子]
在很久很久以前……久以前……久以前……久以前——有一个阿拉伯的故事……伯的故事……伯的故事……伯的故事——故事的发生是这样的……是这样的……是这样的……这样的——大约是90年代初期,当时还算天真无鞋、聪明蟀气的俺,一不小心看到一本老教授们给小盆友们编的奥赛辅导,里面给出了一个无法证明但是被我无数次证伪的公式:程序=算法+数据结构。于是我立即去买了《Data Structure》,也就不小心中了绿毒(Pascal第一版),大学时又被迫买了蓝毒(ISBN7-302-02368-9)

(据说ISBN自带校验,码矩为2,哪位达人可以算一算,看我上面抄写的书号是不是有问题?严重怀疑俺们大学老师卖D版书的说)

现在终于可以开始解毒:科普一下算法的度量——Big O符号、Big Omega符号和Big Theta符号的区别,以及Udi Manber的大OO符号

[正文]
大O符号是德国人Paul Bachmann在1894年引入的,此人精通数论,研究过费马大定理。在他生活的年代还没有计算机,认为mathematics在CS中灰常重要的人可以长笑三声了(当心引来一个红脸的放屁虫)

定义啊定义
--> 正常人类请跳过,火星人驻足,金星人可以去逛街了
A、大O的定义:
  如果存在正数c和N,对于所有的n>=N,有f(n)<=c*g(n),则f(n)=O(g(n))
B、Big Omega的定义
  如果存在正数c和N,对于所有的n>=N,有f(n)>=c*g(n),则f(n)=Omega(g(n))
C、Big Theta的定义
  如果存在正数c1,c2和N,对于所有的n>=N,有c1*g(n)<=f(n)<=c2*g(n),则f(n)=Theta(g(n))
(友情提示:大O和大Omega主要是>=和<=的区别)

简而言之
--> 正常人类观看,火星人请去multiverse求解EPR paradox(http://en.wikipedia.org/wiki/Epr_paradox),注意不是ERP,这个EPR和空洞骗钱的企业软件ERP不一样(其实EPR比ERP更加“空洞”,呵呵)

重来重来,呵呵——简而言之,广而告之:
1、O是一个算法最坏情况的度量(悲观主义者喜欢这个符号)
2、Big Omega是最好情况的度量(favorite notation of optimist)
3、Big Theta表达了一个算法的区间,不会好于某某,不会坏于某某(不这就是中庸之道嘛,偶喜欢)

不管是O,Omega,还是Theta,都隐藏了常量C的信息,因为一般来说这个常量是不重要的,当n值变得很大的时候,对时间和空间的耗用,还是由函数本身的阶来决定的。如果n很小,用什么算法都可以,所以我们一般用极大的n值来对比算法的优劣。但是在实际使用算法的时候就要注意,如果n值不大,就先去优化别处吧!

如果想看些具体的例子可以到这里:http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic3/

可能会有人极不赞同“常量C不重要”这句话,举(抬)一个例子:如果C=10^80(也就是宇宙中的粒子数量),那该怎么办?

先不说这种杠抬得是不是“欠抽”,因为一个自洽的系统欢迎任何抬杠,但是在编程时多半是不行的。别说这么大的常量复杂度了,就是用些边界条件,随手往里抛一些“单位元”或“逆元”,不少算法都会趴下。(用人类语言解说上述名词的结果为:单位元——0或1,视加法群和乘法群而定;逆元素——改变正负号。参见代数系统中群的概念http://en.wikipedia.org/wiki/Group_(mathematics) 注意wiki中的链接是有后半个括号的)

如果你也认为常量C很重要,那么恭喜你了——不光是geek和IT愤青,连Udi Manber(http://manber.com/)也是这么想的!Udi提出了一个新的符号,OO,用来表达这个常量C太大的情况。如果O(n)=1,但是未能表达出来的那个邪恶的常量C,其真实的取值是10^80,那个,这个算法还是不能被使用。

多八褂一句:Udi Manber后来去了google,还做了VP。想来也对,做算法(尤其是搜索算法)和网络研究的大牛,去google工作也算是众望所归吧。

[伊索寓言式的结论]
这故事是说,学习要先找对教材。

[关于作者]
Kenny Yuan,从1990年开始学习编程。目前对算法,语言,心理学和综合格斗感兴趣。

[声明]
本文写于2008年8月,文中涉及的技术性内容随时间变化可能会有变化(特别是某些观点、技术限制等)。

算法中的一些符号 O(big-Oh) Ω(big-theta) Θ(big-theta)

O(big-Oh)    Ω(big-theta)    Θ(big-theta) 一、概述 这是我们在算法的时间复杂度分析中经常会碰到的几个符号。符号后面括号里的是他们相应的读法。简单来说,第一个符...
  • zhuxiaok
  • zhuxiaok
  • 2015年10月30日 21:15
  • 3697

Big O,Big Theta,Big Omega,little o,little omega notation的定义

最近在看MTI关于算法导论的公开课,
  • bbewx
  • bbewx
  • 2014年04月24日 09:50
  • 2326

面试算法实践与国外大厂习题指南

面试算法实践与国外大厂习题指南 在线练习 LeetCode Virtual Judge CareerCup HackerRank CodeF...
  • xfyangle
  • xfyangle
  • 2017年03月13日 22:21
  • 163

科普一下算法的度量——Big O, Big Omega, Big Theta以及Udi Manber的大OO

科普一下算法的度量——Big O, Big Omega, Big Theta以及Udi Manber的大OO目录[引子][正文][结论][关于作者][声明][引子]在很久很久以前……久以前……久以前…...
  • yuankaining
  • yuankaining
  • 2008年08月06日 23:35
  • 14519

BIG MOD

做的一个题,是关于b^e%m的大运算  其中数据会比较大题就不具体写了把算法帖出来吧 #include int main() {long b;long e;long m;long a;while(s...
  • chengxu0921
  • chengxu0921
  • 2007年10月12日 18:29
  • 282

算法度量 Big O, Big Omega, Big Theta

A、大O的定义:   如果存在正数c和N,对于所有的n>=N,有f(n) B、Big Omega的定义   如果存在正数c和N,对于所有的n>=N,有f(n)>=c*g(n),则f(n)=Ome...
  • Yellowcard_
  • Yellowcard_
  • 2014年10月21日 17:39
  • 265

Big Omicron and Big Omega and Big Theta

http://www.phil.uu.nl/datastructuren/09-10/knuth_big_omicron.pdf
  • chenstrace
  • chenstrace
  • 2016年01月05日 13:36
  • 90

神话

HDD的C:盘比D:盘快LCD的黑屏和白屏几乎一样费电Cache大了不保证CPU更快CPU和compiler相互影响设计方案32位机可以管理超过4G的地址(数据总线和地址总线是两回事儿)虚拟机技术的流...
  • yuankaining
  • yuankaining
  • 2010年06月24日 22:58
  • 3727

VI-Big O

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1Welcome to my github: https://github...
  • gaoxiangnumber1
  • gaoxiangnumber1
  • 2017年03月29日 14:58
  • 181

大O表示法算法复杂度速查表(Big-O Algorithm Complexity Cheat Sheet)

(转自:大O表示法算法复杂度速查表(Big-O Algorithm Complexity Cheat Sheet)) 原文网址:http://bigocheatsheet.com/ ...
  • u010832643
  • u010832643
  • 2015年09月17日 16:01
  • 1603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:科普一下算法的度量——Big O, Big Omega, Big Theta以及Udi Manber的大OO
举报原因:
原因补充:

(最多只允许输入30个字)