关于一个学习方式的请教
来源:12-8 基于AVL树的集合和映射
Screenly
2023-04-01
波波老师, 到本章结束, 之前的章节已经算是学完了(除了并查集)
学习情况:
- 在一开始学习的时候(一开始囫囵吞), 最近一个半月又重头学, 并且坚持学完之后, 在不看视频, 尽量不看笔记的情况下, "默写"出这些结构来, 边写边想思路, 现在能做到这个程度了
- "默写"的方式也只是想拥有"条件反射"般思路去实现结构和反馈出每种数据结构的一般使用场景(我比较笨)
我的问题是:
- 这样的学习方式是否太钻牛角尖, 因为过程中确实有些痛苦和费时间(陆续花了一个月+的时间)
- 然后算法题的课程也购买了,接下来是不是可以尝试去学算法题的内容, 听很多人说刷题是题海战术, 但是我感觉我自己是更注重思路(我理解的真正掌握), 不用去死记硬背算法题, 那么这门数据结构 学到能"默写"的程度, 对算法课程的学习和做算法题的思路是否辅助作用会大一些
- 比较 "怕"算法题, 但是又觉得 数据结构的重要性是大于算法的(先数据结构, 再算法)
请波波老师指教, 谢谢
1回答
-
1
这样的学习方式是否太钻牛角尖, 因为过程中确实有些痛苦和费时间(陆续花了一个月+的时间)?
你叙述的学习过程中,最关键的问题是,你说的“默写”到底是什么意思?如果是机械地背代码,那么不可取。但是因为你加了引号,所以我不很你肯定你的意思。我的建议是:你应该能做到,理解每一个算法和数据结构的,在理解这个算法和数据结构的每一个操作在做什么的基础上,根据自己理解的逻辑,写出相应的代码。这个代码写出来有 bug 也是正常的,你应该能够根据你理解的逻辑,把 bug 调试正确。能做到这一点,就完全达到学习要求了。
顺便一提,这个课程的所有数据结构,用一个月的时间学习,对于正常学习来说,不是过慢了,而是过快了。科班通常数据结构的内容,要学习一年的时间(两个学期的时间),当然通常涵盖的内容也会比这个课程涵盖的内容多一些(比如会包括图论,可以参考我的这个课程:https://coding.imooc.com/class/370.html )。
2
这门数据结构 学到能"默写"的程度, 对算法课程的学习和做算法题的思路是否辅助作用会大一些?
先说一个坏消息,让你有一个心理预期:
简单来说,绝大多数诸如 Leetcode 算法问题,和数据结构课程关系没有你想象的那么大。因为算法题大多是“使用”数据结构,而不太会考察数据结构内部的具体实现。
比如你想使用动态数组,直接调用 Java 中的 ArrayList,想使用红黑树,直接调用 Java 中的 TreeSet 或者 TreeMap 就好了,不需要你从底层去实现。
也正是因为这个原因,很多同学会觉得我的这个课程没有用,因为他们依然不会做题。
下面说好消息。
1.) 首先,从科班计算机的角度来说,《数据结构》这门课程,本身就是《算法设计》这门课程的基础,没有数据结构的底子,是不能学习算法设计的。相应的,近乎计算机专业的任何一个高级课程都不能学习。比如操作系统,比如编译原理,比如图形学,等等。所有这些具体领域,都离不开数据结构。
2.) 其次,学习数据结构的过程,让你了解了在计算机世界中,很多通用的处理问题的方式,对于大多数软件工程师来说,这是比能搞定一些 tricky 的算法问题重要的多的。对于 99% 的软件工程师来说,可能每天都要和动态数组,树结构和哈希表打交道,但是,除了面试以外,很有可能不会在工作中使用一次动态规划。
3.) 更重要的是,学习数据结构的过程中,如果你认认真真对这些数据结构的底层实现进行了实践,那么道理上,你的编程能力应该有了极大的提高。其实面试算法题本质就是在考查这件事情(编程能力),只不过如果单纯使用数据结构去考察,太有限了(这个世界上主流数据结构其实就这么几种),但是如果用“算法题”的形式去考察,就灵活多了。所以,如果你这门课程真的掌握好了,去向面试级别的算法问题进军,应该不会遇到太大的问题。
但是在这里,我要做一个提醒:因为算法问题可以无限难,所以,如果你遇到了问题,一定要仔细区分,这个问题到底是因为你根本就不会某些知识导致的,还是你知道这个知识,只是在具体编程的时候遇到了问题(问题理解有误,某类使用方式不熟悉,边界测试不全面,等等)。
如果是因为你不会某个知识导致的,一定要想一想,这个知识是不是面试真的会考察的。
在我看来,算法面试的知识点,和算法竞赛的知识点之间,是有非常大的差距的。但是由于很多同学准备算法面试的时候,总能遇到自己不会的问题,于是觉得非常气馁。可关键在于,很多问题属于竞赛级别的问题。在面试中根本不会出现,或者即便出现,也完全没有区分度。(你理解成这些问题就是为了检验那些在简历中说自己竞赛成绩的同学,具体的水平如何就好了,和没参加过竞赛的同学没关系。)
我个人认为,算法做到 Leetcode medium 难度能 60% 的做对,至少从软件工程师这个职业要求来说,对于大多数同学来说,算法这一块儿就算过关了。(以前我会说 Leetcode medium 90% 做对,但是近一年,我发现 Leetcode medium 的问题也越来越难,越来越 tricky 了...)
一定要记住,对于面试来说,算法不是全部;而对于软件工程师的职业生涯来说,对于很多软件工程师来说,很少自己设计算法。
3
比较 "怕"算法题, 但是又觉得 数据结构的重要性是大于算法的(先数据结构, 再算法)
“怕算法”非常正常。我不会说“不要怕”,我会说“相信我,所有的人都怕算法问题。但是记住:当你面对一个算法问题的时候,关键是要向面试官展示出你解决问题的思路和想法,而不是提供一个完美的解。算法面试不是考试。这一点至关重要。”
至于“数据结构的重要性是大于算法的”,我是同意的。更准确的说,是大于算法设计的。原因就是我说的,大多数软件工程师,在工作中是不会设计新的算法的。了解已有的算法和数据结构的局限性,应用场景,并能做恰当的应用,是更重要的。
继续加油!:)
012023-04-04
相似问题