科普一下算法的度量——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) 一、概述 这是我们在算法的时间复杂度分析中经常会碰到的几个符号。符号后面括号里的是他们相应的读法。简单来说,第一个符...

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

算法设计与分析这门课学了很久了,竟然对Θ、O、o、Ω、ωΘ、Ο、o、Ω、ω还没有一个清晰的认识,是总结一下的时候了。下面正式开始:目录: 1.渐进精确界记号:ΘΘ(big-theta) 2.渐进上界记...

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

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

C++抽象编程——算法分析(3)——深入了解Big-O

从代码中减少计算复杂度下面的代码计算的是vector中的元素的平均值。double average(vector & vec) { int n = vec.size(); double...

C++抽象编程——算法分析(2)——Big-O表示法

进行如果我们按照上一篇的文章那样的详细分析的问题是您最终得到的信息太多。 虽然有一个公式来预测一个程序将要花多长时间,但是通常可以采取更多的定性措施。 本质上,选择排序的问题在于,将输入向量的大小加倍...

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

原文网址:http://bigocheatsheet.com/ Word文档下载:http://download.csdn.net/detail/anshan1984/5583399 ...

Big O notation大零符合 入门讲解

Big O notation大零符号一般用于描述算法的复杂程度,比如执行的时间或占用内存(磁盘)的空间等,特指最坏时的情形。 Linus Torvalds说过“Talking is cheap, s...

hdu 1171 Big Event in HDU 母函数解法。。以后再来用背包A一下

Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. Bu...

Big-O-ology

  • 2011-12-19 09:12
  • 193KB
  • 下载

big O notation

大O符号是一种算法复杂度的相对表示方式。 这个句子里有一些重要而严谨的用词: 相对(relative):你只能比较相同的事物。你不能把一个做算数乘法的算法和排序整数列表的算法进行比较。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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