CS巴别塔(1)

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

Posted in Uncategorized by Kenny Yuan on 2009/05/20

[引子]
在很久很久以前……久以前……久以前……久以前——有一个阿拉伯的故事……伯的故事……伯的故事……伯的故事——故事的发生是这样的……是这样的……是这样的……这样的——大约是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工作也算是众望所归吧。

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

Advertisements
Tagged with:

3 Responses

Subscribe to comments with RSS.

  1. laoli said, on 2009/10/12 at 00:24

    很怀疑,你写文章是为了卖弄,还是为了让别人看懂。

    • Kenny Yuan said, on 2009/10/13 at 09:20

      文章的风格本来就是“仁者见仁、智能见智”的嘛

      我看你老兄还是很诚肯的一个人

  2. SeanQ said, on 2012/11/20 at 06:09

    简单诙谐,写的不错.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: