前言
我第一次写这个答案是在2015年3月,然后在2016年1月和2018年3月进行了整体修改。只适合入门,有些问题请看评论里的。
文本
我认为开始学习算法和数据结构时应该包括三个部分:
1.选择合适的书
强烈推荐普林斯顿的这本橙皮书:《算法第四版》,我认为最适合入门。 橙皮书中淡化了算法分析和证明,强调实现和应用,并通过一些有趣的练习进行对比,展示优秀算法和数据结构的时间和空间效率。
橙皮书使用Java进行代码实现。 第一章的前两小章介绍了全书可能会用到的一些简单的Java语法,这样我们就不会在学习编程语言上花费太多的精力。
而普林斯顿也出版了两门相应的课程:Part I 和 Part2。 按顺序报到,等待上课,认真跟读上课内容(英语讲座有字幕,如果你熟悉书本内容并提前自己翻译过课件物理专业课程顺序表,即使你的英语听力很差也能听懂)不好),并独立完成(选择题)(编程作业)和作业(面试题)
这两门公开课在知乎上也很受欢迎,这里就不多说了。 不收取任何费用,也不提供电子证书。 这些课程每年开办几次,您可以随时参加。
2. 编程实现与应用
理解数据结构和对其全部功能进行编程是完全不同的挑战。 自己动手,为一些基本数据结构(例如排序、集合、图和字符串处理)实现简化的 API,可以极大地提高您对数据结构内部细节的理解。
编写API
我使用过的最愚蠢的方法之一是尝试记住书上的实现。 另一种更有成就感的方法是在OJ(Judge)上选择一些使用上述基本数据结构的简单题,自己实现需要使用的数据结构,而不是使用语言本身。 ,比如C++的STL或者Java的util。
可视化帮助
同时,除了底层之外,最好从顶层来观察一个数据结构的各种操作。 这里推荐一个动态可视化网站。 比如进入Heap(二叉堆),插入一个77,就可以看到整个堆的变化过程。 可以通过左下角的按钮减慢演示速度。 我刚刚在书上学习完二叉堆的原理,我可能已经自己编码并实现了该过程。 然后演示网站上元素的各种操作流程,会带来一些更直观的印象。
(二叉堆操作演示上)
尝试申请
以上做法都可以很快产生成就感。 学习算法和数据结构并不容易,最好能有一些及时的积极反馈。
3、反复学习
因为算法和数据结构涵盖了很多知识,一本书上的内容可能需要分几个阶段来学习,难免前面的内容会忘记。 我建议快速学习,并且尽可能快地学习。 如果某个知识点确实不懂,你可以有疑问,“不求完整解释”。 很多时候,经过后续的学习,之前的一些内容自然就会清晰起来。 然后一遍又一遍地学习。
除了基础复习之外,还需要其他书籍进行一些补充和升级。 推荐《算法导论》。 除了显着加强算法分析能力外,一些算法章节,如摊销分析、动态规划等,都是对《算法第四版》很好的补充。 其在线公开课程包括网易中文公开课和英文公开课:(无需证书即可免费参加)
总之,多做总结! 可以是Judge上的编程题、书末的反思题、手头的编程项目、或者面试题等。
补充:我第一次写这个答案的时候正在看《数据结构与算法分析——C语言描述》,所以我在第一版答案中就推荐了这本书。 不过作为介绍(个人观点)它没有橙皮书那么详细,但是它用C语言实现ADT(抽象数据类型)的方法值得借鉴。 重点回复1.问题是考研数据结构的学习。 答案是题外话!
真的。 因为时间过去了,我已经不记得原来的问题是什么了。 我之所以在这个问题下写这个答案,首先可能归因于一些被遗忘的历史原因。
2.如果你从未使用过Java/C/C++,你需要先学习编程语言
不需要。 大多数书籍都会使用特定的语言来进行代码实现,但它们只使用了编程语言最基本的语法。 任何有编程基础的人都不需要从头开始学习该语言。
3.我的英语不好,听不懂公开课。
可以先看中文书籍学习知识点,提前翻译在线课件物理专业课程顺序表,慢动作播放视频。 如果无法做到这一点,您可以暂停播放手动翻译的字幕。 一开始确实很难做到这一点,但随着时间的推移,就变得容易了,因为生词就这么多,一个接一个。
4.需要绕过防火墙吗? 电脑上打不开。
PC端无需翻墙访问。 可能是DNS污染的问题。 答案请参考知乎。
5.《算法第四版》课后题较多,没有参考答案。
书末习题讨论请参考知乎的解答。