精通一個領域的三步走方式
- 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
-> branchfor
,while
loop -> iterationrecursion
遞歸(divide & conquer,backtrace)
五點高級算法: 先默識數據結構,先理解概念點,后面慢慢上手掌握,同時在學習細分知識的時候,不斷復習。(比如某一算法的時間復雜度、空間復雜度等)
- Search 搜索:DFS,BFS,A*
- Dynamic Programming 動態規划
- Binary Search 二分查找
- Greedy 貪心
- Math 數學,Geometry 幾何
注意:在頭腦中回憶上面每種算法思想和代碼模板
刻意練習
練習基本功:區別職業選手和業余選手的根本。
刷算法題的最大誤區:做一個算法題目的時候,只做一遍,這就是練習和切題的最大誤區。一遍是完全不夠的。就像是體育選手,一個動作不可能只做一遍就熟練,也沒法將其變成一個條件反射的動作。
- 基本功是區別業余和職業選手的根本
- 基礎動作的分解訓練和反復練習
- 過遍數:類似於背單詞,要多背幾遍。
- 五遍刷題法(五毒神掌) 練習自己的弱項,練習實力上缺陷的地方。走出舒適區。
Deliberate Practicing
- 刻意練習-過遍數(五毒神掌)
- 練習缺陷、弱點
- 不舒服、不爽、枯燥
- 例子:乒乓球、台球、游戲
拿CS游戲為例: 開黑很爽,專項練習更有助於提高。可以專門開地圖練習自己不熟悉的槍(如AK),越是不熟悉而且平時常用,越要多練習。
在學習動態規划的時候,主動刻意練習二十上百道題,逼自己練習,可以達到熟練的水平。
國家隊乒乓球練習:反復練習一個動作,先無球,后有球,每天堅持練習,將基本功練扎實。(不要煩leetcode上的題目過於重復,這有助於練習基本功)
職業台球選手,在練習時都是練習很工整的球陣型。就類似於在leetcode上反復不斷的練習典型的、同一個題目。不斷的過遍數。
內心不要浮躁,不要總想着用一些高大上的框架。先將基本功練好,后面在工程中coding才能事半功倍。職業選手的訓練方法如此,何況普通人。
反饋(feedback)
分為兩種:主動反饋和被動反饋
- 即時反饋
- 主動反饋
- 高手代碼(github、leetcode etc)
- 第一視角直播
- 被動反饋(高手指點)
- code review
- 教練看你打,給你反饋
刷題技巧
在寫任何一個題目、面試答一個題目之前,先養成四步系統化的思考題目的方式(切題四件套)
-
clarification(多看幾次題目,和面試官多溝通,確保理解題目准確)
-
Possible Solutions(非常重要!看到題目之后,想 所有可能的解法 來解題,先過一遍。
不要只用想到的第一種寫法去解題),比較不同的方法時間、空間復雜度的區別,從中找出最優解法- Compare(space/time)
- optimal(加強)
-
Coding 寫代碼。
-
Test cases 列舉測試樣例。
五毒神掌(五遍刷題法,任何題目都至少刷5遍)
-
第1遍:(適合初次練習)
- 5分鍾:讀題+思考(如果基礎薄弱,可以給自己10分鍾到15分鍾時間)。
如果在思考時間內沒有任何思路,不知道怎么做的話也很正常。 - 直接看解法
適用於上一點中沒有任何思路的情況下,有思路的話直接Coding就行了。
同時注意比較多解法,比較解法優劣。
算法的本身是要理解、運用的,而不是自己發明創造 - 背誦、默寫好的解法。
背誦和默寫很重要,在背誦和默寫的基礎上,可以慢慢做到理解。
- 5分鍾:讀題+思考(如果基礎薄弱,可以給自己10分鍾到15分鍾時間)。
-
第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
- 為什么在過去,似乎數據結構與算法不是很好的人,也可以找到很好的工作?
答:在過去,中國經濟發展比較快,程序員崗位大量空缺,而在大學里的知識又太水,很多人還沒准好,就已經上崗了。而現在中國經濟放緩,接下來將是存量程序員之間的競爭,基本功會越來越重要。 - 現在學的算法,在以后工作中用的到么?
答:絕對絕對能用的到。相信超哥,算法很重要。這種內功心法的鍛煉,是經久不衰的。從10年前,20年前,從谷歌到facebook、Amazon,再到國內的BAT、TMD,為什么都考這個?把這個練好了,代碼速度、代碼邏輯和其他方面都要比一般的程序員好。 - 年齡太大學習算法,晚不晚?
答:腦子的細胞是有大量冗余的,不同年齡只是體現在學習的速度上,而在邏輯思維上沒有損耗。短期記憶會慢,但是長期記憶沒有影響。可參見Growth mindset(谷歌搜索) - 35歲失業的原因:公司養你的成本高於你對公司的貢獻。
答:第一性原理可解釋(埃隆 馬斯克)
參考鏈接