(longyue521助教)
同学们,大家好:
首期算法训练营结束了,因个人原因未能参加线下结营仪式,深表遗憾!
我受陈老师之邀在这里与大家分享一下学习经验。
“经验”无外乎两种——“成功经验”和“失败经验”,网络上分享“成功经验”的文章较多,
所以本文我决定与大家分享一下“失败经验”
分享“失败经验”有个缺点——容易“损害”个人形象——“原来他也不过如此嘛!”
但我不怕,只要能帮到人,我就非常开心!
过度准备
消磨意志,浪费时间,过犹不及
经历描述
第一次学习《数据结构》时,我做了如下几件事:
- 搜索“如何学习数据结构?”,读完大部分搜到的文章
- 根据文章的提示开始找书、慕课,再到豆瓣、亚马逊看书评及慕课评价
- 下载电子书,是否中英文都有,看排版及是否高清,是否要买实体
- 下载课程,是否中英文都有,清晰度,可下载否
- .....
细心的你也许已经发现了,除了“学”其他的我都做了!
先别笑,也许在这件事上你与我不同,其他事呢?想想看,比如健身:
- 户外or健身房
- 办健身卡——次卡,月卡,年卡
- 衣服、护具——款式,搭配,防晒
- 课程、书籍——瑜伽,普拉提,动感单车
- 健身计划,营养餐
- ......
你是否除了“健身”,其他的也都做了?我们不一样?
后文不再做此种类比,请读者自行抽象、泛化思考
经验总结
- 这种“过度准备”不但消耗人的意志,还会给人制造一种想象中的困难感。
-
- “这事需要这么多准备,多难啊,哎我还是算了吧......”
- 先觉察,然后请停止这种“过分准备”!
- 你也许会问我“如何恰当准备”?很抱歉,我无法准确回答你!
-
- 因为别人的“恰当准备”也许是你的“不足/过分准备”。
- 这个度需要自己保持觉察,在学习、生活、工作中不断观察、锻炼、总结才能掌握!
- 如果一直把握不好也不要苛责自己,只要有一点进步也该给我自己鼓掌!
个人建议
我不想一开始就丢给你一本TAOCP/CLRS,让你崇拜、羡慕,然后......你就没有然后,直接放弃了!
我相信当年丢给我TAOCP/CLRS的人他们的出发点是好的,但这真不适合当时的我!
下面给出学习《数据结构》时的“恰当准备”:
- 语言基础
- 哈工大《C语言程序设计精髓》 + 配套教材 or 《C和指针》
- 清华《C++语言程序设计》 + 配套教材
- 数据结构
- 浙大《数据结构》C + 配套教材
- 清华《数据结构》Cpp + 配套教材
针对人群零基础小白下文均如此
别再问后续学什么?《XXX》《YYY》书要不要看呢?......
请将节省下的准备时间都投入到“学”上,立即开始学!
再给自己点时间看看会发生什么?要相信时间的力量!
同理,请放下手机、离开电脑/Pad,舒展一下身体吧!
练练深蹲、踢腿、仰卧起坐、俯卧撑等徒手健身项目。
如果你觉得上述运动不能满足你,再考虑健身房等后续事宜吧!
忽视现实
理想很丰满,现实很骨感
经历描述
第二次学习《数据结构》时,我做了如下几件事:
- 立即开始学!
- 制定学习目标、学习计划,打了鸡血似的,豪情万丈
- OJ要上榜,挺进CST
- 详尽学习笔记
- 要想邓公一样,能用用严密的逻辑推演、论证算法
- ......
这一次我有了进步——开始真正“学”了,但其他问题又出现了。
你认为照着上面的描述来学邓公的《数据结构》你能坚持多久?
我现在倒是能理解当初自己的状态,毕竟碰到好老师、好书不容易!
无论从写字、课件、讲课再到讨论区答疑,能够做到如此细致、精致、严谨的真不多!
难免会产生“我也想像向他一样”的想法!
问题就是问题,我不喜欢逃避,我选择面对!
有很多成语能够形容出现的问题,比如好高骛远、急于求成、急功近利......
但我觉得这都是表象,其本质是忽视现实!
我认真地回顾了一下,发现自己忽视了如下现实情况:
- 高质量学完哈工大《C语言程序设计精髓》,但那也仅是C的子集
- 邓公的《数据结构》用的是C++难免要用到其独有的语法特性
- 邓公的《数据结构》并非清华校内线下课程的低配版
- 从开课到现在选课的人有多少?进入CST的人又有多少?
- 时间是有限的,一天就24小时。
- 人不可能长时间保持高度集中精神的状态
- 二八原则
- ......
你也可照此分析一下你自己!
经验总结
- 忽视现实会引发很多问题,也许你并非有意但请保持觉察
- 在不带有批判、苛责的情况下,正确地认识、评估一下自己现阶段的水平
- 设定符合自己现阶段水平的学习目标,并允许意外情况出现
-
- 目标不应轻易就实现(走出舒适区),也不应过于高远(暂离恐慌区)
- 目标应该是那种需要努力锻炼锻炼,尽力跳才摸得到的!(走进学习区)
- 如果真的身体不舒服,可以休息,但请自律!
- 制定符合自己现阶段的学习计划,坚持下去相信时间的力量!
- 重新审视一下自己,看看在其他事上是否也有类似情况发生
个人建议
当我认清自己的实际情况后,我反倒轻松多了,学习效率也高了!
《数据结构》的学习并非一蹴而就的,更像是一个迭代的过程,整理如下:
- 第一次迭代,掌握课程中数据结构的常规接口,了解数据结构的固有特性
-
- 能够在纸上以画图的方式手动模拟,每次调用接口后,数据结构内部状态的变化
- 比如平衡二叉树的再平衡操作,终极目标在脑中进行上述模拟
- 总结、掌握据数据结构的固有特性及适用场景
- 此阶段可以不写代码,但要动笔、动脑,培养数据结构思维
- 第二次迭代,实现数据结构并能够使用复杂度对实现进行评价
-
- 第一次迭代做得好,你脑中对于要实现的数据结构所需要的东西都门清
- 实现更多地考验你的编程能力,你可以尝试多种编程来实现数据结构
- 上次迭代你记住了适用场景,这次要学会用复杂度分析从而推出、证明确实适用该场景
- 此阶段需动手敲代码,注意实现简洁、高效,要有意识训练自己运用复杂度指导实现
- 第三次迭代,能够根据需求、问题选用/自定义接口,使其能够满足需求/解决问题
-
- 这次迭代相当于综合运用测试,给定一个数据结构要求你在其上支持非常规接口
-
- 若你不能轻松应对,不要气馁,请回到上两次迭代
- 成功实现后,鼓掌庆祝之余要记得总结
-
- 这个阶段有一个隐藏的关卡
-
- 分析、理解、抽象、分解给定问题,将其映射到数据结构的常规接口
- 或自定义接口简洁、高效解决之
- 面对问题时没思路,可一旦给出提示用XXX结构解决,马上能实现并解决问题。
- 由此可见难点迁移到了分析、理解、抽象、分解给定问题上
- 若你出现上述状况,在多做题的同时,请有意识地训练自己
请根据上面的“经验总结”制定计划、目标及你自己的需求来选择进入哪次迭代。
完美主义
吾生也有涯,而知也无涯。以有涯随无涯,殆已!
经历描述
有了良好的《数据结构》基础后,确实加快了我学习《算法设计》的脚步。
学习《数据结构》的经验教训,也让我在学习《算法设计》时少走了弯路。
即便如此我仍在不知不觉中落入了“完美主义”陷阱中:
- 我想读懂书上的每一句话
- 我想看懂书上每一个巧妙推演
- 我想做完书上每一道题
- ......
这种无意识的“完美主义”困扰了我一段时间,由此产生的沮丧感、失落感差点导致我放弃!
深陷泥潭中甚至让我忘了学习《数据结构》时获得的经验。
好在读了一些心理读物,及时醒悟、吸取教训才回到正轨。
经验总结
- 每个人都有“完美主义”倾向,只是体现在不同的事上
- CS这个学科需要一些“完美主义”,但不能过头
- 我“完美主义”倾向源自我想成为像邓公及作者们一样的人,你的呢?
- 如果你也深受其扰,以至于影响了你的学习,不妨看看这个视频、读读这本书
个人建议
先给出学习《算法设计》的书籍列表:
- Algorithms
- Algorithms 4th
- Introduction to Algorithms:A Creative Approach
- Algorithm Design
- The Algorithm Design Manual, 2nd Edition
- Introduction to Algorithms, 3rd Edition
请注意:
- 不要一上来就买全部的书/下载全部电子书
- 结合下方的《算法设计》学习策略按照自身需求选取
- 不要完美主义!不要完美主义!不要完美主义!
-
- 纵向读——一本书接着一本书读,需要时间、毅力
- 横向读——以实践为主,学习某一设计策略,觉得A书讲得不理解,可以看看B书
事倍功半
Learning by doing 做中学
经历描述
在我初学编程时,因没有掌握计算机相关专业的学习方法,走了不少弯路。
我总是想先“打好基础”,再走下一步,但这需要时间、毅力与坚持。
我花了很大气力学习,但都事倍功半!
我想找到效率更高的学习方法,于是我开始浏览美国计算机四大名校的课程网站。
经过一番研究,自学几门课程后,我发现了他们的教学套路:
- 教授理论知识(一),小作业,用于巩固理论知识(一)
- 教授理论知识(二),小作业,用于巩固理论知识(二)
- 大作业,编程实践,需要用到理论知识(一)与(二)
- 教授理论知识(三),小作业,用于巩固理论知识(三)
- 教授理论知识(四),小作业,用于巩固理论知识(四)
- 大作业,编程实践,需要用到理论知识(三)与(四)
- 项目作业,编程实践,多人协作,需要用到理论知识(一)~(四)+ hits
- 重复上述过程,一般重复4~6次,中间穿插期中考试,最后期末考试
由此“套路”总结出另一种学习方法——“迭代学习”法:
- 理解待解决的问题
- 学习部分理论知识
- 动手实践尝试解决,无法解决,回到1或2
- 成功解决抓紧总结
即使现在回头看,我也不能说第一种学习方法有错,“迭代”学习法更好!
但这两种学习方法都是以同一个核心为基础的——动手做,做中学!
你可以都尝试一下,然后选取自己喜欢、又高效的学习方法!
当然也欢迎你分享你的学习方法!
经验总结
- 越早适应“迭代”学习法对你越有利
- 大多数时候你没有足够的时间来“学完再做”
- 若你在“迭代”学习过程产生的焦虑、沮丧、挫败感,请及时排解
- 排解后记得回来,坚持才能胜利!
个人建议
学习《算法设计》在借鉴学习《数据结构》的经验的同时,
需要做适当调整——在每次大迭代中应用“迭代”学习法:
- 第一次迭代,熟悉常用的算法设计策略,掌握策略的使用方法及适用的场景
-
- 其实学习《数据结构》时你已经学了不少经典算法
- 带着学到的算法设计策略回头总结、归纳经典算法
- 可以在纸上画画设计策略与经典算法的关系图,是一对一,一对多,还是多对多
- 这个阶段的重点,在脑中建立常用算法设计策略与经典算法的对应关系
- 如果个人能力不错,可考虑与《数据结构》第三次迭代同时进行
- 第二次迭代,灵活运用算法设计策略,解决实际问题
-
- 大量的解决问题,在此过程中总结出你个人解决问题的流程
- 可以针对某项设计策略进行专项训练,但要考虑实际需求——工作、面试、竞赛
- 此阶段的重点就是解决《数据结构》第三次迭代中的隐藏关卡,同时培养解决问题的感觉、自觉
- 别忘了“迭代”学习方法
- 大量训练、多与他人探讨、扩展自己的思路并及时总结
- 第三次迭代,对给定问题能运用数学证明你的算法设计策略是正确的、可行的、高效的
-
- 这个阶段要做的事本应该融入到前两次迭代中的,甚至更早比如在离散数学课上
- 之所以单抽出来是因为有太多的人因这个“拦路虎”而徘徊在“算法设计”的大门前迟迟不敢踏入半步,更有甚者转身离开了就再也没回来......
- 如果你不擅长数学,或不打算从事科研及对数学要求较高的工作,可以跳过
- 对于打算从事科研及对数学要求较高的工作的人来说,这也可以算迂回策略
- 可以先从教材对经典算法的证明学习,然后重走第二次迭代实践(这才是看CLRS的时机)
- 这个阶段的重点,有意识地运用数学来决定设计策略的选取
我可能给出了一个“馊主意”,这样做会引发一些问题:
- 你在学习《算法设计》的初期没能养成良好的推理、证明习惯,后期改正要费些功夫
- 信心/底气不足,有强大的数学理论作为支撑你敲代码、测试或和别人辩论也底气十足
尽管不完美但比起那些徘徊在门口、转身离开的人,你已进入“算法设计”的大门!
这难道不值得高兴吗?
感谢
- 感谢邓公及助教团队,课程内容非常精彩,让我收获满满!
- 感谢陈老师及学堂在线工作人员的辛勤付出!
- 感谢和我切磋的社区助教们,与你们切磋让我又成长了不少!
声明
欢迎转载、节选等,请保留如下字样:
———— 节选/转载自 学堂在线首期清华算法训练营 学员助教 longyue0521