zoukankan      html  css  js  c++  java
  • 覃超-算法训练营 学习方法分享

    精通一个领域的三步走方式

    • Chunk it up 切碎知识点
    • Deliberate Practicing 刻意练习
    • Feedback 反馈

    切碎知识点

    • 庖丁解牛的故事
    • 将算法数据结构分解成一块一块相对简单化、脉络化的知识脑图,脉络相连。

    任何一个知识体系都是一棵树,如果要掌握某个领域的关键知识,就需要将知识变成一颗树状结构.有最基本的根,然后分出主干、分出枝叶。最后每个知识点和你所熟悉的知识挂靠在一起,成为树状结构。
    人脑不适合记忆、理解孤立的知识,脑图有助于理解。 --- Elon Musk(引自reddit)

    如何达到职业顶尖玩家的水平
    如果只是停留在和寝室室友一盘盘打游戏的话,无法达到职业水平

    顶级玩家都要把每部分专门拿出来练习,不断反复练习、刻意练习,可以达到职业顶尖水平。

    对数据结构进行分类:

    • 一维
      • 基础:array 数组(string) linked list 链表
      • 高级:stack 栈,queue 队列,deque 双端队列,set 集合,map 映射
    • 二维
      • 基础:tree 树;graph 图
      • 高级:binary search tree 二叉搜索树,red-black tree,avl,堆 heap,disjoint set 并查集,trie 字典树,
    • 特殊
      • bitwise 位运算,BloomFilter布隆过滤
      • LRU cache

    对数据结构进行分类: 一维数据结构中,高级数据结构是面试的重点 二维数据结构可以看成从一维数据结构中泛化而来

    对算法进行分点:
    前三点类似于几何公理,是算法的基础,是所有算法、数据结构的基石。最朴素的运算操作。最后将算法化繁为简之后,可以发现它的根本就是找到它的重复单元,基于重复单元泛化成高级数据结构。所有的复杂算法,其实就是找它的重复单元是什么。

    • if-else,switch -> branch
    • for,while loop -> iteration
    • recursion 递归(divide & conquer,backtrace)

    五点高级算法: 先默识数据结构,先理解概念点,后面慢慢上手掌握,同时在学习细分知识的时候,不断复习。(比如某一算法的时间复杂度、空间复杂度等)

    • Search 搜索:DFS,BFS,A*
    • Dynamic Programming 动态规划
    • Binary Search 二分查找
    • Greedy 贪心
    • Math 数学,Geometry 几何

    注意:在头脑中回忆上面每种算法思想和代码模板

    刻意练习

    练习基本功:区别职业选手和业余选手的根本。

    刷算法题的最大误区:做一个算法题目的时候,只做一遍,这就是练习和切题的最大误区。一遍是完全不够的。就像是体育选手,一个动作不可能只做一遍就熟练,也没法将其变成一个条件反射的动作。

    • 基本功是区别业余和职业选手的根本
    • 基础动作的分解训练和反复练习
    1. 过遍数:类似于背单词,要多背几遍。
    2. 五遍刷题法(五毒神掌) 练习自己的弱项,练习实力上缺陷的地方。走出舒适区。

    Deliberate Practicing

    • 刻意练习-过遍数(五毒神掌)
    • 练习缺陷、弱点
    • 不舒服、不爽、枯燥
    • 例子:乒乓球、台球、游戏

    拿CS游戏为例: 开黑很爽,专项练习更有助于提高。可以专门开地图练习自己不熟悉的枪(如AK),越是不熟悉而且平时常用,越要多练习。

    在学习动态规划的时候,主动刻意练习二十上百道题,逼自己练习,可以达到熟练的水平。
    国家队乒乓球练习:反复练习一个动作,先无球,后有球,每天坚持练习,将基本功练扎实。(不要烦leetcode上的题目过于重复,这有助于练习基本功)
    职业台球选手,在练习时都是练习很工整的球阵型。就类似于在leetcode上反复不断的练习典型的同一个题目。不断的过遍数。
    内心不要浮躁,不要总想着用一些高大上的框架。先将基本功练好,后面在工程中coding才能事半功倍。职业选手的训练方法如此,何况普通人。

    反馈(feedback)

    分为两种:主动反馈和被动反馈

    • 即时反馈
    • 主动反馈
      • 高手代码(github、leetcode etc)
      • 第一视角直播
    • 被动反馈(高手指点)
      • code review
      • 教练看你打,给你反馈

    刷题技巧

    在写任何一个题目、面试答一个题目之前,先养成四步系统化的思考题目的方式(切题四件套

    1. clarification(多看几次题目,和面试官多沟通,确保理解题目准确)

    2. Possible Solutions(非常重要!看到题目之后,想 所有可能的解法 来解题,先过一遍。
      不要只用想到的第一种写法去解题),比较不同的方法时间、空间复杂度的区别,从中找出最优解法

      • Compare(space/time)
      • optimal(加强)
    3. Coding 写代码。

    4. Test cases 列举测试样例。

    五毒神掌(五遍刷题法,任何题目都至少刷5遍)

    • 第1遍:(适合初次练习)

      • 5分钟:读题+思考(如果基础薄弱,可以给自己10分钟到15分钟时间)。
        如果在思考时间内没有任何思路,不知道怎么做的话也很正常。
      • 直接看解法
        适用于上一点中没有任何思路的情况下,有思路的话直接Coding就行了。
        同时注意比较多解法,比较解法优劣。
        算法的本身是要理解、运用的,而不是自己发明创造
      • 背诵、默写好的解法。
        背诵和默写很重要,在背诵和默写的基础上,可以慢慢做到理解。
    • 第2遍:(在第1遍的基础之上,这时候没必要看他人的解法了)

      • 马上自己写 -- > leetcode上提交,不断Debug修改
      • 多种解法比较、体会-->优化。
        比较不同解法的时间、内存消耗。
      • 对于执行时间长的Code,多想优化策略。
      • 直到所有不同解法都是优的(领先90%以上,80%也不错)。
    • 第3遍:(在第2遍的基础之上,过了24小时之后,做前一天做过的题目)

      • 对于不同解法熟练程度不一样,针对性的对自己不是特别熟的题目进行专项练习。
    • 第4遍:(第3遍过了一周之后,反复回来练习相同的题目,同时对于不熟练的题目进行专项练习)

      • 完成了第4遍,基本上对于相关知识点掌握的比较牢固了
    • 第5遍 :(针对面试,面试前一个星期、两个星期进行恢复性训练。)

      • 将之前做过的题目再做一遍
      • 时间视面试准备程度而定,按照自己的时间计划安排

    预期达到的效果:看到一道算法题,马上就能产生肌肉式记忆,并马上能得到相关的系列解法(解法1、解法2、解法3…,同时清楚知道所有解法的优劣程度)

    经验-如何应对算法面试?

    • 不要死磕。不要对于写的又臭又长又充满bug的代码,不停的打补丁。就算最后花费大力气通过了,也没什么进步。因为这时候已经耗干了精力,没有力气再去看优秀的题解了。这样刷题的效率是最低。

    • 遇到自己搞不定的,直接放弃,去看优秀题解。

    • 提升英文打字速度,做职业的程序员。

    • 消遣和娱乐方式,不要去刷抖音,而是去刷easy的题目。

    语言基础的巩固

    • Java内存?全局、局部、栈变量、堆变量
    • 工具翻新(vscode/idea/google/iterm)
    • 打字练习 typing.io,speedcoder.net
    • 其他:cs-notes,labuladuo算法fucking-algorithm(谷歌搜索),cheatsheet(快捷键)
    • 科学做题、科学看资料

    高效学习

    • 分清优先级,时间是挤出来的
    • 费曼学习法:以教为学
    • 脑图+五毒神掌
    • 做能够带来长期复利的事。

    早日完成300题,拿下理想公司offer。

    每周四:模拟面试。

    挑选,考试和完成度很高的学员参加模拟面试。

    FAQ

    1. 为什么在过去,似乎数据结构与算法不是很好的人,也可以找到很好的工作?
      答:在过去,中国经济发展比较快,程序员岗位大量空缺,而在大学里的知识又太水,很多人还没准好,就已经上岗了。而现在中国经济放缓,接下来将是存量程序员之间的竞争,基本功会越来越重要。
    2. 现在学的算法,在以后工作中用的到么?
      答:绝对绝对能用的到。相信超哥,算法很重要。这种内功心法的锻炼,是经久不衰的。从10年前,20年前,从谷歌到facebook、Amazon,再到国内的BAT、TMD,为什么都考这个?把这个练好了,代码速度、代码逻辑和其他方面都要比一般的程序员好。
    3. 年龄太大学习算法,晚不晚?
      答:脑子的细胞是有大量冗余的,不同年龄只是体现在学习的速度上,而在逻辑思维上没有损耗。短期记忆会慢,但是长期记忆没有影响。可参见Growth mindset(谷歌搜索)
    4. 35岁失业的原因:公司养你的成本高于你对公司的贡献。
      答:第一性原理可解释(埃隆 马斯克)

    参考链接

  • 相关阅读:
    JQ分页练习
    Dom1
    JQ轮播图
    Dom操作
    DYR
    jQ点击事件
    [z]vc boost安装
    [z] .net与java建立WebService再互相调用
    [z]
    git常用命令二
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13439624.html
Copyright © 2011-2022 走看看