算法训练营longyue助教的学习经验

(longyue521助教)

同学们,大家好:

首期算法训练营结束了,因个人原因未能参加线下结营仪式,深表遗憾!

我受陈老师之邀在这里与大家分享一下学习经验。

“经验”无外乎两种——“成功经验”和“失败经验”,网络上分享“成功经验”的文章较多,

所以本文我决定与大家分享一下“失败经验”

分享“失败经验”有个缺点——容易“损害”个人形象——“原来他也不过如此嘛!”

但我不怕,只要能帮到人,我就非常开心!


过度准备

消磨意志,浪费时间,过犹不及

经历描述

第一次学习《数据结构》时,我做了如下几件事:

  • 搜索“如何学习数据结构?”,读完大部分搜到的文章
  • 根据文章的提示开始找书、慕课,再到豆瓣、亚马逊看书评及慕课评价
  • 下载电子书,是否中英文都有,看排版及是否高清,是否要买实体
  • 下载课程,是否中英文都有,清晰度,可下载否
  • .....

细心的你也许已经发现了,除了“学”其他的我都做了!

先别笑,也许在这件事上你与我不同,其他事呢?想想看,比如健身:

  • 户外or健身房
  • 办健身卡——次卡,月卡,年卡
  • 衣服、护具——款式,搭配,防晒
  • 课程、书籍——瑜伽,普拉提,动感单车
  • 健身计划,营养餐
  • ......

你是否除了“健身”,其他的也都做了?我们不一样?

后文不再做此种类比,请读者自行抽象、泛化思考

经验总结

  • 这种“过度准备”不但消耗人的意志,还会给人制造一种想象中的困难感。
    • “这事需要这么多准备,多难啊,哎我还是算了吧......”
    • 先觉察,然后请停止这种“过分准备”!
  • 你也许会问我“如何恰当准备”?很抱歉,我无法准确回答你!
    • 因为别人的“恰当准备”也许是你的“不足/过分准备”。
    • 这个度需要自己保持觉察,在学习、生活、工作中不断观察、锻炼、总结才能掌握!
  • 如果一直把握不好也不要苛责自己,只要有一点进步也该给我自己鼓掌!

个人建议

我不想一开始就丢给你一本TAOCP/CLRS,让你崇拜、羡慕,然后......你就没有然后,直接放弃了!

我相信当年丢给我TAOCP/CLRS的人他们的出发点是好的,但这真不适合当时的我!

下面给出学习《数据结构》时的“恰当准备”:

  1. 语言基础
  • 哈工大《C语言程序设计精髓》 + 配套教材 or 《C和指针》
  • 清华《C++语言程序设计》 + 配套教材
  1. 数据结构
  • 浙大《数据结构》C + 配套教材
  • 清华《数据结构》Cpp + 配套教材

针对人群零基础小白下文均如此

别再问后续学什么?《XXX》《YYY》书要不要看呢?......

请将节省下的准备时间都投入到“学”上,立即开始学!

再给自己点时间看看会发生什么?要相信时间的力量!

同理,请放下手机、离开电脑/Pad,舒展一下身体吧!

练练深蹲、踢腿、仰卧起坐、俯卧撑等徒手健身项目。

如果你觉得上述运动不能满足你,再考虑健身房等后续事宜吧!


忽视现实

理想很丰满,现实很骨感

经历描述

第二次学习《数据结构》时,我做了如下几件事:

  • 立即开始学!
  • 制定学习目标、学习计划,打了鸡血似的,豪情万丈
  • OJ要上榜,挺进CST
  • 详尽学习笔记
  • 要想邓公一样,能用用严密的逻辑推演、论证算法
  • ......

这一次我有了进步——开始真正“学”了,但其他问题又出现了。

你认为照着上面的描述来学邓公的《数据结构》你能坚持多久?

我现在倒是能理解当初自己的状态,毕竟碰到好老师、好书不容易!

无论从写字、课件、讲课再到讨论区答疑,能够做到如此细致、精致、严谨的真不多!

难免会产生“我也想像向他一样”的想法!

问题就是问题,我不喜欢逃避,我选择面对!

有很多成语能够形容出现的问题,比如好高骛远、急于求成、急功近利......

但我觉得这都是表象,其本质是忽视现实!

我认真地回顾了一下,发现自己忽视了如下现实情况:

  • 高质量学完哈工大《C语言程序设计精髓》,但那也仅是C的子集
  • 邓公的《数据结构》用的是C++难免要用到其独有的语法特性
  • 邓公的《数据结构》并非清华校内线下课程的低配版
  • 从开课到现在选课的人有多少?进入CST的人又有多少?
  • 时间是有限的,一天就24小时。
  • 人不可能长时间保持高度集中精神的状态
  • 二八原则
  • ......

你也可照此分析一下你自己!

经验总结

  • 忽视现实会引发很多问题,也许你并非有意但请保持觉察
  • 在不带有批判、苛责的情况下,正确地认识、评估一下自己现阶段的水平
  • 设定符合自己现阶段水平的学习目标,并允许意外情况出现
    • 目标不应轻易就实现(走出舒适区),也不应过于高远(暂离恐慌区)
    • 目标应该是那种需要努力锻炼锻炼,尽力跳才摸得到的!(走进学习区)
    • 如果真的身体不舒服,可以休息,但请自律!
  • 制定符合自己现阶段的学习计划,坚持下去相信时间的力量!
  • 重新审视一下自己,看看在其他事上是否也有类似情况发生

个人建议

当我认清自己的实际情况后,我反倒轻松多了,学习效率也高了!

《数据结构》的学习并非一蹴而就的,更像是一个迭代的过程,整理如下:

  • 第一次迭代,掌握课程中数据结构的常规接口,了解数据结构的固有特性
    • 能够在纸上以画图的方式手动模拟,每次调用接口后,数据结构内部状态的变化
    • 比如平衡二叉树的再平衡操作,终极目标在脑中进行上述模拟
    • 总结、掌握据数据结构的固有特性及适用场景
    • 此阶段可以不写代码,但要动笔、动脑,培养数据结构思维
  • 第二次迭代,实现数据结构并能够使用复杂度对实现进行评价
    • 第一次迭代做得好,你脑中对于要实现的数据结构所需要的东西都门清
    • 实现更多地考验你的编程能力,你可以尝试多种编程来实现数据结构
    • 上次迭代你记住了适用场景,这次要学会用复杂度分析从而推出、证明确实适用该场景
    • 此阶段需动手敲代码,注意实现简洁、高效,要有意识训练自己运用复杂度指导实现
  • 第三次迭代,能够根据需求、问题选用/自定义接口,使其能够满足需求/解决问题
    • 这次迭代相当于综合运用测试,给定一个数据结构要求你在其上支持非常规接口
      • 若你不能轻松应对,不要气馁,请回到上两次迭代
      • 成功实现后,鼓掌庆祝之余要记得总结
    • 这个阶段有一个隐藏的关卡
      • 分析、理解、抽象、分解给定问题,将其映射到数据结构的常规接口
      • 或自定义接口简洁、高效解决之
      • 面对问题时没思路,可一旦给出提示用XXX结构解决,马上能实现并解决问题。
      • 由此可见难点迁移到了分析、理解、抽象、分解给定问题上
      • 若你出现上述状况,在多做题的同时,请有意识地训练自己

请根据上面的“经验总结”制定计划、目标及你自己的需求来选择进入哪次迭代。


完美主义

吾生也有涯,而知也无涯。以有涯随无涯,殆已!

经历描述

有了良好的《数据结构》基础后,确实加快了我学习《算法设计》的脚步。

学习《数据结构》的经验教训,也让我在学习《算法设计》时少走了弯路。

即便如此我仍在不知不觉中落入了“完美主义”陷阱中:

  • 我想读懂书上的每一句话
  • 我想看懂书上每一个巧妙推演
  • 我想做完书上每一道题
  • ......

这种无意识的“完美主义”困扰了我一段时间,由此产生的沮丧感、失落感差点导致我放弃!

深陷泥潭中甚至让我忘了学习《数据结构》时获得的经验。

好在读了一些心理读物,及时醒悟、吸取教训才回到正轨。

经验总结

  • 每个人都有“完美主义”倾向,只是体现在不同的事上
  • CS这个学科需要一些“完美主义”,但不能过头
  • 我“完美主义”倾向源自我想成为像邓公及作者们一样的人,你的呢?
  • 如果你也深受其扰,以至于影响了你的学习,不妨看看这个视频、读读这本书

个人建议

先给出学习《算法设计》的书籍列表:

请注意:

  • 不要一上来就买全部的书/下载全部电子书
  • 结合下方的《算法设计》学习策略按照自身需求选取
  • 不要完美主义!不要完美主义!不要完美主义!
    • 纵向读——一本书接着一本书读,需要时间、毅力
    • 横向读——以实践为主,学习某一设计策略,觉得A书讲得不理解,可以看看B书

事倍功半

Learning by doing 做中学

经历描述

在我初学编程时,因没有掌握计算机相关专业的学习方法,走了不少弯路。

我总是想先“打好基础”,再走下一步,但这需要时间、毅力与坚持。

我花了很大气力学习,但都事倍功半!

我想找到效率更高的学习方法,于是我开始浏览美国计算机四大名校的课程网站。

经过一番研究,自学几门课程后,我发现了他们的教学套路:

  1. 教授理论知识(一),小作业,用于巩固理论知识(一)
  2. 教授理论知识(二),小作业,用于巩固理论知识(二)
  3. 大作业,编程实践,需要用到理论知识(一)与(二)
  4. 教授理论知识(三),小作业,用于巩固理论知识(三)
  5. 教授理论知识(四),小作业,用于巩固理论知识(四)
  6. 大作业,编程实践,需要用到理论知识(三)与(四)
  7. 项目作业,编程实践,多人协作,需要用到理论知识(一)~(四)+ hits
  8. 重复上述过程,一般重复4~6次,中间穿插期中考试,最后期末考试

由此“套路”总结出另一种学习方法——“迭代学习”法:

  1. 理解待解决的问题
  2. 学习部分理论知识
  3. 动手实践尝试解决,无法解决,回到1或2
  4. 成功解决抓紧总结

即使现在回头看,我也不能说第一种学习方法有错,“迭代”学习法更好!

但这两种学习方法都是以同一个核心为基础的——动手做,做中学!

你可以都尝试一下,然后选取自己喜欢、又高效的学习方法!

当然也欢迎你分享你的学习方法!

经验总结

  • 越早适应“迭代”学习法对你越有利
  • 大多数时候你没有足够的时间来“学完再做”
  • 若你在“迭代”学习过程产生的焦虑、沮丧、挫败感,请及时排解
  • 排解后记得回来,坚持才能胜利!

个人建议

学习《算法设计》在借鉴学习《数据结构》的经验的同时,

需要做适当调整——在每次大迭代中应用“迭代”学习法:

  • 第一次迭代,熟悉常用的算法设计策略,掌握策略的使用方法及适用的场景
    • 其实学习《数据结构》时你已经学了不少经典算法
    • 带着学到的算法设计策略回头总结、归纳经典算法
    • 可以在纸上画画设计策略与经典算法的关系图,是一对一,一对多,还是多对多
    • 这个阶段的重点,在脑中建立常用算法设计策略与经典算法的对应关系
    • 如果个人能力不错,可考虑与《数据结构》第三次迭代同时进行
  • 第二次迭代,灵活运用算法设计策略,解决实际问题
    • 大量的解决问题,在此过程中总结出你个人解决问题的流程
    • 可以针对某项设计策略进行专项训练,但要考虑实际需求——工作、面试、竞赛
    • 此阶段的重点就是解决《数据结构》第三次迭代中的隐藏关卡,同时培养解决问题的感觉、自觉
    • 别忘了“迭代”学习方法
    • 大量训练、多与他人探讨、扩展自己的思路并及时总结
  • 第三次迭代,对给定问题能运用数学证明你的算法设计策略是正确的、可行的、高效的
    • 这个阶段要做的事本应该融入到前两次迭代中的,甚至更早比如在离散数学课上
    • 之所以单抽出来是因为有太多的人因这个“拦路虎”而徘徊在“算法设计”的大门前迟迟不敢踏入半步,更有甚者转身离开了就再也没回来......
    • 如果你不擅长数学,或不打算从事科研及对数学要求较高的工作,可以跳过
    • 对于打算从事科研及对数学要求较高的工作的人来说,这也可以算迂回策略
    • 可以先从教材对经典算法的证明学习,然后重走第二次迭代实践(这才是看CLRS的时机)
    • 这个阶段的重点,有意识地运用数学来决定设计策略的选取

我可能给出了一个“馊主意”,这样做会引发一些问题:

  • 你在学习《算法设计》的初期没能养成良好的推理、证明习惯,后期改正要费些功夫
  • 信心/底气不足,有强大的数学理论作为支撑你敲代码、测试或和别人辩论也底气十足

尽管不完美但比起那些徘徊在门口、转身离开的人,你已进入“算法设计”的大门!

这难道不值得高兴吗?


感谢

  • 感谢邓公及助教团队,课程内容非常精彩,让我收获满满!
  • 感谢陈老师及学堂在线工作人员的辛勤付出!
  • 感谢和我切磋的社区助教们,与你们切磋让我又成长了不少!

声明

欢迎转载、节选等,请保留如下字样:

———— 节选/转载自 学堂在线首期清华算法训练营 学员助教 longyue0521

猜你喜欢

转载自www.cnblogs.com/mbath/p/10151884.html