《算法导论》为什么经典

长期以来,我对于是否要在博客上写非技术类的东西取决不下。同是从0开头学习技术,一定会遇到许多相似的问题,我把它们记下来,还会给人以帮助。但是非技术类的东西,写了也是给自己看的,在没有从“对小我的思考”转变为“对大我的思考”之前(看了刘未鹏的博客后的感触),我不需要别人的理解和同情。再者,即使面对面交流,也不能保证使一个人完全理解另一个人,更何况活的思考变成死的文字。然而今天,我只是想把憋在心里的话写出来。人的层次并不相同,譬如许多计算机专业的学生在进入大学之前已能熟练编程,而我其时还连光驱和光盘都弄不清楚。我只是也想在这里说说自己一直放在心里没有说的话,来我博客的朋友请略过这一篇。

事情源于一次对比。最近学习网络流算法,啃了国内一本知名的算法教材好几天,通过不断重复倒是熟记了很多基本概念,但是记住的概念越多,心里的问号越多。对于算法学习来说,死记硬背算法是很低效的。我于是翻开《算法导论》,交叉学习。看了《算法导论》几页,发现两本书讲解方式上有非常大的不同,简单对比如下:《算法导论》中,第26章讲网络流算法,总共用了35页(翻译过来的中文版),使用了10组演示图片,总共使用了64行伪代码;国内的那本知名教材,讲解同样内容的网络流算法,用了40页,4张图片,没有一张图片是用来演示算法执行流程的,最让我吃惊的是,在40页的算法讲解中,C++代码超过了20页!

64行伪代码和超过20页的C++代码,这巨大的反差,使我对国内那本教材非常失望和惋惜。这让我想到霍金引用过的一句话,大意是书中每一条物理公式会使读者的数量减少一半,同样,对于讲解算法的书,代码的行数是与书的可读性成反比的。代码是非常有个人特色的,看到与自己风格不同的代码,不自觉就会产生一种排斥的心理。更不用说我们国内教材中的代码:风格混乱,字体难看,纸张低劣,印刷错误。最让我痛苦的是,完整的代码被切割得很碎,配合着讲解算法的需要,这里撒一小块,那里撒一小块,我经常为了一个莫名其妙的变量和函数调用到处在前面的书页中找它的意义,或者根据上下文去猜它的意义。代码中不可避免地要用到如栈、队列、链表等这些基本数据结构,为了能集中精力讲算法,这些数据结构的实现代码是不应该贴上来的,所以只好杜撰一些名称,用惯了STL,我对这些不遵守STL中的约定的代码非常反感。一边看书我一边提醒自己,知道这些代码表示什么意思就行了,没必要对这些代码这么认真。我想,作者的初衷是为了实用,我仔细读了些代码,感觉作者对算法的实现是非常精简的,代码的细节也处理的很好,但是很可惜,代码中有太多的细节了,一门生僻的伪代码又会加重读者的负担,两难的选择。

如果说这本教材让我感到惋惜,那么其它的教材,书店里铺天盖地的基础教程、入门教程,就让人愤怒了。尽管电子工业出版社和机械工业出版社不断推出让人一看就想买下来的书,这却对教材没有产生任何的影响。回想我大学时候的教材,C、C++、数据结构、算法,其中充斥着大量风格糟糕的代码:没有缩进,没有注释、变量名一律abcd或者汉语拼音。我当时痛苦地写着这样的代码,在我上C++课时看到老师在黑板上写下int anIntVar;这样的语句时,我为这个变量名兴奋了好久。随着写的代码多了起来,与非教材类的经典技术书籍的接触多了起来,我对大学的教材和课堂的失望和反感也与日俱增。大学里那些理论性强的专业课的教材,很多地方明明几句话就可以点透的东西,却啰哩啰嗦晦涩难懂的讲上一大堆,在需要仔细讲解的时候,却往往又一句话带过,似乎唯恐不能炫耀其高超的水平。那些艰涩的文字,读完很多遍才发现也不过就是那么回事,真让人觉得,采用这种方式讲解的目的,就是因为对真正的难题束手无策,才专门在这些小问题上大做文章。既没有数学的简洁直接,又不通俗,一句话:入的貌似很深,出的绝对不浅。

这些烂教材和烂书导致了一个更严重的后果:真正好的教材被忽视了。而今,一提起“教材”这个词语,我们的印象就是一堆内容陈腐、讲解死板、形式僵化、专门用来应付考试的垃圾纸。这使得那些教材中十分珍贵的精华被一起当成了垃圾,考完试就随手抛掉。这对任何一方,都是巨大的浪费。

事实上,大学的专业课教材有些并不比那些经典著作省钱。为什么我们在课堂上就只能看到那些纸张低劣的教材,既然自己没有好的,为什么不“拿来”更好的?

上面这些只是我的牢骚,我刚上大学时对计算机是个白痴,经常被一大堆名词弄的晕头转向,上很多课,我看不到这和计算机有什么联系,老师也从不讲开的这些课都有什么用,所以经常逃课,等到知道逃的课很有用的时候,那门课已经考完试了,所以积累了不少牢骚。但我也在网上看到很多的对我极有启发的博客,看到很多文笔非常优秀的技术作家,牢骚归牢骚,我还是充满了希望的。只是感觉,需要时间。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 --------------------------------------------------------------- 目录 Introduction to Algorithms, Third Edition 出版者的话 译者序 前言 第一部分 基础知识 第1章 算法在计算中的作用  1.1 算法  1.2 作为一种技术的算法  思考题  本章注记 第2章 算法基础  2.1 插入排序  2.2 分析算法  2.3 设计算法   2.3.1 分治法   2.3.2 分析分治算法  思考题  本章注记 第3章 函数的增长  3.1 渐近记号  3.2 标准记号与常用函数  思考题  本章注记 第4章 分治策略  4.1 最大子数组问题  4.2 矩阵乘法的Strassen算法  4.3 用代入法求解递归式  4.4 用递归树方法求解递归式  4.5 用主方法求解递归式  4.6 证明主定理   4.6.1 对b的幂证明主定理   4.6.2 向下取整和向上取整  思考题  本章注记 第5章 概率分析和随机算法  5.1 雇用问题  5.2 指示器随机变量  5.3 随机算法  ?5.4 概率分析和指示器随机变量的进一步使用   5.4.1 生日悖论   5.4.2 球与箱子   5.4.3 特征序列   5.4.4 在线雇用问题  思考题  本章注记 第二部分 排序和顺序统计量 第6章 堆排序  6.1 堆  6.2 维护堆的性质  6.3 建堆  6.4 堆排序算法  6.5 优先队列  思考题  本章注记 第7章 快速排序  7.1 快速排序的描述  7.2 快速排序的性能  7.3 快速排序的随机化版本  7.4 快速排序分析   7.4.1 最坏情况分析   7.4.2 期望运行时间  思考题  本章注记 第8章 线性时间排序  8.1 排序算法的下界  8.2 计数排序  8.3 基数排序  8.4 桶排序  思考题  本章注记 第9章 中位数和顺序统计量  9.1 最小值和最大值  9.2 期望为线性时间的选择算法  9.3 最坏情况为线性时间的选择算法  思考题  本章注记 第三部分 数据结构 第10章 基本数据结构  10.1 栈和队列  10.2 链表  10.3 指针和对象的实现  10.4 有根树的表示  思考题  本章注记 第11章 散列表  11.1 直接寻址表  11.2 散列表  11.3 散列函数   11.3.1 除法散列法   11.3.2 乘法散列法   11.3.3 全域散列法  11.4 开放寻址法  11.5 完全散列  思考题  本章注记 第12章 二叉搜索树  12.1 什么是二叉搜索树  12.2 查询二叉搜索树  12.3 插入和删除  12.4 随机构建二叉搜索树  思考题  本章注记 第13章 红黑树  13.1 红黑树的性质  13.2 旋转  13.3 插入  13.4 删除  思考题  本章注记 第14章 数据结构的扩张  14.1 动态顺序统计  14.2 如何扩张数据结构  14.3 区间树  思考题  本章注记 第四部分 高级设计和分析技术 第15章 动态规划  15.1 钢条切割  15.2 矩阵链乘法  15.3 动态规划原理  15.4 最长公共子序列  15.5 最优二叉搜索树  思考题  本章注记 第16章 贪心算法  16.1 活动选择问题  16.2 贪心算法原理  16.3 赫夫曼编码  16.4 拟阵和贪心算法  16.5 用拟阵求解任务调度问题  思考题  本章注记 第17章 摊还分析  17.1 聚合分析  17.2 核算法  17.3 势能法  17.4 动态表   17.4.1 表扩张   17.4.2 表扩张和收缩  思考题  本章注记 第五部分 高级数据结构 第18章 B树  18.1 B树的定义  18.2 B树上的基本操作  18.3 从B树中删除关键字  思考题  本章注记 第19章 斐波那契堆  19.1 斐波那契堆结构  19.2 可合并堆操作  19.3 关键字减值和删除一个结点  19.4 最大度数的界  思考题  本章注记 第20章 van Emde Boas树  20.1 基本方法  20.2 递归结构   20.2.1 原型van Emde Boas结构   20.2.2 原型van Emde Boas结构上的操作  20.3 van Emde Boas树及其操作   20.3.1 van Emde Boas树   20.3.2 van Emde Boas树的操作  思考题  本章注记 第21章 用于不相交集合的数据结构  21.1 不相交集合的操作  21.2 不相交集合的链表表示  21.3 不相交集合森林  *21.4 带路径压缩的按秩合并的分析  思考题  本章注记 第六部分 图算法 第22章 基本的图算法  22.1 图的表示  22.2 广度优先搜索  22.3 深度优先搜索  22.4 拓扑排序  22.5 强连通分量  思考题  本章注记 第23章 最小生成树  23.1 最小生成树的形成  23.2 Kruskal算法和Prim算法  思考题  本章注记 第24章 单源最短路径  24.1 Bellman?Ford算法  24.2 有向无环图中的单源最短路径问题  24.3 Dijkstra算法  24.4 差分约束和最短路径  24.5 最短路径性质的证明  思考题  本章注记 第25章 所有结点对的最短路径问题  25.1 最短路径和矩阵乘法  25.2 Floyd?Warshall算法  25.3 用于稀疏图的Johnson算法  思考题  本章注记 第26章 最大流  26.1 流网络  26.2 Ford\Fulkerson方法  26.3 最大二分匹配  26.4 推送重贴标签算法  26.5 前置重贴标签算法  思考题  本章注记 第七部分 算法问题选编 第27章 多线程算法  27.1 动态多线程基础  27.2 多线程矩阵乘法  27.3 多线程归并排序  思考题  本章注记 第28章 矩阵运算  28.1 求解线性方程组  28.2 矩阵求逆  28.3 对称正定矩阵和最小二乘逼近  思考题  本章注记 第29章 线性规划  29.1 标准型和松弛型  29.2 将问题表达为线性规划  29.3 单纯形算法  29.4 对偶性  29.5 初始基本可行解  思考题  本章注记 第30章 多项式与快速傅里叶变换  30.1 多项式的表示  30.2 DFT与FFT  30.3 高效FFT实现  思考题  本章注记 第31章 数论算法  31.1 基础数论概念  31.2 最大公约数  31.3 模运算  31.4 求解模线性方程  31.5 中国余数定理  31.6 元素的幂  31.7 RSA公钥加密系统  31.8 素数的测试  31.9 整数的因子分解  思考题  本章注记 第32章 字符串匹配  32.1 朴素字符串匹配算法  32.2 Rabin\Karp算法  32.3 利用有限自动机进行字符串匹配  32.4 Knuth?Morris?Pratt算法  思考题  本章注记 第33章 计算几何学  33.1 线段的性质  33.2 确定任意一对线段是否相交  33.3 寻找凸包  33.4 寻找最近点对  思考题  本章注记 第34章 NP完全性  34.1 多项式时间  34.2 多项式时间的验证  34.3 NP完全性与可归约性  34.4 NP完全性的证明  34.5 NP完全问题   34.5.1 团问题   34.5.2 顶点覆盖问题   34.5.3 哈密顿回路问题   34.5.4 旅行商问题   34.5.5 子集和问题  思考题  本章注记 第35章 近似算法  35.1 顶点覆盖问题  35.2 旅行商问题  35.2.1 满足三角不等式的旅行商问题  35.2.2 一般旅行商问题  35.3 集合覆盖问题  35.4 随机化和线性规划  35.5 子集和问题  思考题  本章注记 第八部分 附录:数学基础知识 附录A 求和  A.1 求和公式及其性质  A.2 确定求和时间的界  思考题  附录注记 附录B 集合等离散数学内容  B.1 集合  B.2 关系  B.3 函数  B.4 图  B.5 树   B.5.1 自由树   B.5.2 有根树和有序树   B.5.3 二叉树和位置树  思考题  附录注记 附录C 计数与概率  C.1 计数  C.2 概率 C.3 离散随机变量  C.4 几何分布与二项分布  *C.5 二项分布的尾部  思考题  附录注记 附录D 矩阵  D.1 矩阵与矩阵运算  D.2 矩阵基本性质  思考题  附录注记

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值