第一次看到这本书是它的中文名字“算法之美”,一看原文才发现“之美”纯属子虚乌有,但如果没有这两个字我可能就不会跟这本书结缘了,翻译为“算法”可能会有10个人看,但翻译为“算法之美”可能就会吸引100个人,这就是语言的魅力。
其实是对这本书的评论吸引了我,发一段上来:
这是一本可以给人带来巨大阅读乐趣的专业书籍。作者娓娓道来,又惜墨如金。用极精炼的语言,为我们指明了一条通向那些美丽算法的线索。我要由衷地说:这本书不仅仅是一些结果的集合,更是一段美好的旅程。我对书中涉及的内容已然熟悉,但读过之后仍感收获良多,对算法这门学问又多了些认识。真的是,写书当如是。
三位作者可谓野心勃勃,几乎是胆大妄为。他们对传统算法教学思路的颠覆和背叛可谓前所未有。刚拿到目录的时候,我就替他们捏了一把汗,觉得这哪里像一本“正经”的算法书。可读下来,却不由得佩服——算法书早该这么写了。
他们并没有要全面的收录各种各样的算法,他们做的事情是理清了一条算法这门学问的线索。因此填鸭式的内容灌输不是这本书的目的;对结构的精心安排,对问题的数学结构的剖析、从而推出一个算法的过程的讲解,都体现除了这本书真正的用心:它要让学生获得最大程度的启发,要训练学生独立解决问题的能力。
我觉得这才是教育的真正目的,也是算法课应该追求的目标。
呵呵!看样子书评比书本身更能吸引人!
我看了一下,感觉作者使用了较艺术化的语言来写书,这给我在阅读上带来了极大的困难,呵呵,真不知这次能坚持多久。好,疲话不说,下面是正文:
第0章
序言
环顾四周。计算机和网络无处不在,它为复杂的人类活动纺织了一张巨大的网:教育,商业,娱乐,研究,制造业,卫生管理,人类通讯甚至战争。支撑起这种惊人增长的是两个主要的科技:高速发展的微电子技术和芯片设计已经带给我们越来越快的计算机硬件。
这本书讲述的是另一个知识产业的故事:计算机革命的动力:高效算法。这是令人着迷的故事。请搬好凳子慢慢听我讲来!
0.1 书籍和运算法则
有两个想法改变了世界。1448年德国美因兹,一个名叫Johann Gutenberg的金匠发现了把活动金属块这在一起来印刷书籍的方法。随着知识不断传播,黑暗时代从此结束,人类思想被完全解放,科学和技术迎来光明,工业革命爆发。很多历史学家把这归功于活版印刷术,设想一下只有极少数人能够阅读知识这个世界会是什么样子!但还有一部分人这一切的关键不是活版印刷术而是运算法则。
今天我们已经习惯于使用阿拉伯数字来书写数字,象Gutenberg那样把1448写成MCDXLVIII是非常容易被忘记的(译者注:MCDXLVIII是罗马数字,它代表1448,罗马数字是欧洲在阿拉伯数字(印度数字)传入之前使用的一种数码,现在应用较少。它的产生晚于中国甲骨文中的数码,更晚于埃及人的十进位数字。但是,它的产生标志着一种古代文明的进步)。你怎么样去对两个罗马数字进行相加呢?什么是MCDXLVIII + DCCCXII呢?(再想想如何对它们相乘。)甚至象Gutenberg这样聪明的人大概也只会使用手指头对两个很小的数字进行加减运算。对于那些复杂的运算他也只能请教算盘专家。
十进制系统,由印度发明于公元600年左右,它是定量推理的革命。它仅仅使用了10个符号,甚至可以很简洁地写出很大的数字,它使得后面演示的算法基本步骤变得非常有效率。尽管如此,由于传统语言的阻碍,在很长一段时间内它都不被人们所熟知。
对它的传播产生重大影响的是一本教材,这本书由一个居住于巴格达的阿拉伯人Al Khwarizmi写于19世纪。(译者注:Alkhwarizmi(约780~约850),生于 Khiva,卒地不详。回教的数学家,代数与算术的整理者,被誉为“代数之父”。Alkhwarizmi 离开了家乡,前往当时的学问中心巴格达,服务於回教势力极盛的 al-Mamun 及 al-MutaAiw 宫廷。他引进了印度数字,发展算术,后经 Fibonacci(1170~1250年)引介到欧洲,逐渐代替了欧洲原有的算板计算及罗马的记数系统。欧洲人就把 Alkhwarizmi 这个字拉丁化,称用十进位印度阿拉伯数字来进行有规则可寻之计算的算术为 Algorithm。後来算术转用其他的字(如 arithmetic)来表示,而 algorithm 现在则成为电脑科学的行话──电脑所赖以计算的「运算法则」。)Al Khwarizmi展示了数字的加、减、乘、除的基本方法,甚至展示了如何求平方根和π。这些方法精准、明确、有法可寻、具有效率、正确而且简单,它们叫“运算法则”,在很多世纪之后,十进制系统最终被欧州采用,而这个新名词也是用于纪念这位哲人的。
从那以后,十进制系统和它的数字运算法则在西方文明扮演了一个十分重要的角色。它促进了科学和技术的发展;加速了工业和商业的进步。很久以后,随着计算机的出现,它又明确地表达了位值系统中的位、单词和算法单元。科学家不断发展出复杂算法用于解决各类问题,并不断发明新奇的应用软件,最终改变了世界。(译者注:考虑到Al Khwarizmi没见过电脑,所以有些地方把algorithms译为运算法则而不是算法)