数据结构与算法设计是CS相关专业的必修课,也是IT公司笔试面试的重点。网上这方面的资料多如牛毛,我列出了一些我认为非常值得推荐的资源,供有需求的读者研习之用。
1、法国鲁昂大学(University of Rouen )Thierry Lecroq 教授关于字符串(模式)匹配算法的介绍内容
http://igm.univ-mlv.fr/~lecroq/string/node1.html
如果说道字符串匹配算法,你会想到哪些?只有KMP吗?那你弱爆了:) 还不快来看Thierry Lecroq 教授的主页,在上述网站上,教授给出了超过30种模式匹配算法的详细介绍(有图有文有例子)和实现代码。实在是不可多得但又未被人知的宝藏。国内很多教科书、文章、博客都是以讹传讹,连KMP和MP算法的不同都搞不清楚,常常将二者混为一谈,殊不知它们是两个算法。这个问题讲起来话太长,总之各位还是要明辨真伪,自身水平挺高了,才不会收到误导。
2、美国佛罗里达国际大学Mark Allen Weiss教授的主页http://users.cis.fiu.edu/~weiss/
Weiss教授是Knuth的徒孙(因为他博士导师是塞奇威克)。他在教书育人上的成就其实比他在学术上的成就更大。其关于数据结构方面的教材在全世界大学范围内被广泛采用(后面我还要推荐他的著作),并曾荣获SIGCSE计算机科学教育杰出成就奖。他的数据结构书籍有多个版本,既有Java版,又有C++版,还有C版。而他的主页提供了所有这些书籍中的源代码下载。你能想过的数据结构,他基本都实现过,所以具有极高的参考价值。
3、Leetcode
这个网站名气很大!CSDN上到处是其中题目的解答。相信读者可能已经了解过,这是美国一个IT笔试面试题目的online judge系统。里面搜罗了超过300道算法与数据结构相关的题目。刷Leetcode绝对是训练思维技巧、增进编码能力的好方法。我偶尔也从里面挑几道题目做做,觉得是一件很有趣的事情,我思故我在:) 但我其实有种相见恨晚的感觉。我知道它的时候,我的算法之美已经交稿编排了,(尽管后来发现我的书和Leetcode选的很多题目有很多类似的)但如果我早日知道它,应该会为我的新书增加更多精彩。Anyway,各位可千万别错过它。当然,Leetcode上题目的答案到处都是,但我还是建议你先自己做做看,抄别人的答案就没意思了,自己先做一遍再去看看别人有没有更好的方法,或许更有帮助。
4、“那谁的技术博客”的主页http://www.cppblog.com/converse/category/974.html
其实我本来想推荐July的主页的,他在CSDN上名气已经很大了,何况更有超过千万的超人气访问量。直到我看到了知乎的帖子http://www.zhihu.com/question/24957182。我不想评论他的事情,公道自在人心。我推荐“那谁的技术博客”主要是因为上述帖子中讲到July的很多内容抄袭了这个博客,我才寻根溯源找到原帖。我转而推荐原帖,也是表示对原创的一种支持。博主用了很长时间对Btree、红黑树、AVL树、字典树、二分查找树等树形搜索结构进行了总结,给出了难能可贵的实现代码,又分享给大家,希望大家能在用别人无私奉献的内容时,保留一份尊重。尊重他人也尊重自己。
下面是一些书籍的点评(注意我用的词是点评,所以不是我列的所有书都是推荐。你要看清楚我具体说的内容)
1、两本神作
Knuth的《计算机程序设计艺术》,绝对业界巨擘,开山鼻祖,旷世奇书。国内中英文都已经有了,但是我非常不推荐大家阅读。总之一句话,好书也不一定适合你。我在这评论它,因为我确实看过。别说没告诉你,书里的代码是用汇编语言写的,而且是Knuth大神自创的一种汇编语言,你要想想清楚,我想更多看本文的读者应该是处于学习阶段的,所以不要好高骛远。另外一本是《算法导论》,这个名气同样很大,对此我不做点评,因为我没看过,我不能对我没看过的东西做推荐。
2、Weiss教授的书
Weiss教授的书解决了我在早年学习数据结构时候的很多问题。我当时看的是清华出的C++版的影印版。中文版我作为比照参考最初也读过,后来也是因为翻译的不太理想就放弃了。现在不知道中文版的情况如何。Weiss教授的书还有Java版的。我主要看的是下面两本,强力推荐
3、计算机算法设计与分析,王晓东,电子工业出版社
我觉得这是中国人编写的非常好的教材,贪婪、分治、回溯、动态规划、概率算法等几大算法设计思想都有覆盖,并配合以许多典型问题的分析,还有关于P/NP问题的介绍。这本书可以作为研究算法的参考书来看。我自己看的是第2版,很老了,现在应该有更新版。
其实数据结构的书我看过很多很多,所以我这确实还有一个不推荐的名单,但是那些书的推荐理由就跟Knuth的神作完全不一样了。为了避免给大家带来困扰我就不列出这个不推荐的名单了,原因你懂的。
另外,推荐两部课外的业余读物(跟数据结构无关,但跟算法有关)
5、图灵的秘密,查尔斯·佩措尔德,人民邮电出版社
这是对图灵生平和他论文的解读。作者查尔斯·佩措尔德是大名鼎鼎的技术作家,他的另外一本神作是《Code:the hidden language behind the computer software and hardware》(中译本《编码:隐匿在计算机软硬件背后的语言》,译者不才正是在下》。图灵为了给出算法的精确定义(进而解决判定性问题)而石破天惊地构造了图灵机这种神器,这其实是现代计算机算法研究的一个重要开端。如果你连算法是什么都没定义好,那何谈算法研究呢?而要理解图灵当初提出的机器到底是啥,看这本书就对了。当然《图灵的秘密》这本书读起来其实有一定难度,如果你学过计算理论课程的话最好,或者你可以先读下面这本书,这会帮你更好地理解《图灵的秘密》。
6、计算理论导引,Michael Sipser
这是大学里计算理论课程的教材。但是我还是非常推荐你作为课外读物来读(如果你没学过相关课程的话)。如果说图灵的研究离我们很遥远,那么这本书其实拉近了图灵机和我们的距离。这本书会告诉你:我们讨论算法复杂度的大O表示法,本源就在于它是通过图灵机(方格的移动)来定义的。你在王晓东的书以及算法导论里会看到NP问题,而我更建议你看计算理论导引来了解P,NP,NP完全问题的本质。
附 <算法之美>介绍
本书围绕算法与数据结构这个话题,循序渐进、深入浅出地介绍了现代计算机技术中常用的四十余个经典算法,以及回溯法、分治法、贪婪法和动态规划等算法设计思想。在此过程中,本书也系统地讲解了链表(包括单向链表、单向循环链表和双向循环链表)、栈、队列(包括普通队列和优先级队列)、树(包括二叉树、哈夫曼树、堆、红黑树、AVL树和字典树)、图、集合(包括不相交集)与字典等常用数据结构。同时,通过对二十二个经典问题(包括约瑟夫环问题、汉诺塔问题、八皇后问题和骑士周游问题等)的讲解,逐步揭开隐匿在数据结构背后的算法原理,力图帮助读者夯实知识储备,激活思维技巧,并最终冲破阻碍编程能力提升的重重藩篱。
本书涉及的45个算法:
BF算法、MP算法、KMP算法、BM算法、BMH算法、Needleman-Wunsch算法、Smith-Waterman算法、N-gram算法、Soundex算法、Phonix算法、二分查找算法、欧几里得算法、二叉树遍历算法、哈夫曼算法、广度优先遍历算法、深度优先遍历算法、Dijkstra算法、Floyd算法、最短路径的动态规划算法、Kruskal算法、Prim算法、AVL树旋转算法、红黑色的操作算法、直接定址法、除留余数法、平方取中法、乘余取整法、折叠法、BKDR散列算法、RS散列算法、FNV散列算法、线性探查法、二次探查法、双重散列法、并查集的路径压缩算法、直接插入排序算法、二分插入排序算法、希尔排序算法、鸡尾酒排序算法、冒泡排序算法、快速排序算法、归并排序算法、堆排序算法、计数排序算法、排序算法。
以及22个经典问题:
Z字形编排问题、大整数乘法问题、九宫格问题、约瑟夫环问题、魔术师发牌问题、拉丁方阵问题、维吉尼亚加密问题、括号匹配问题、停车场模拟问题、舞伴问题、杨辉三角问题、迷宫问题、八皇后问题、骑士周游问题、传染病问题、汉诺塔问题、文字游戏问题、游程编码问题、旅游交通路线问题、道路修建问题、拼写检查问题、犯罪团伙问题。
本书附录中笔试面试题目的参考答案
常见C++笔试题目整理(含答案)7
常见C++笔试题目整理(含答案)8
常见C++笔试题目整理(含答案)9
常见C++笔试题目整理(含答案)10