前言
本文是個人基於覃超老師的《算法訓練營》的學習筆記,此筆記的內容都是學習後的個人記錄、個人總結、理解和思想。僅供參考學習。
很多同學在大學的時候會覺得數據結構與算法很枯燥,很多小夥伴都不願意聽這門課程。甚至以前還覺得能開發一個項目就能成爲一個合格的程序員。但是學會算法,或者接觸過數據結構與算法後,發現懂這門知識的程序員編寫出來的代碼相對有更高的質量。代碼的性能、寫法、底層邏輯和解決問題的能力都會高於不懂數據結構與算法的程序員。
到了如今,如果想成爲一個高級開發工程師或者進入大廠,不論崗位是前端、後端還是AI,算法都是重中之重。也無論我們需要進入的公司的崗位是否最後是做算法工程師,前提面試就需要考算法。所以小時不學算法,長大掉頭髮
。
這系列的《算法學習筆記》,與大家一起重溫或者學習數據結構與算法。
這裏也贈送大家一句話:
“
好記性不如爛筆頭,好記性更不如好筆記
”願大家在技術銀河中終身漂泊學習時,習慣編寫自己的筆記,以後這些筆記必定成爲我們最珍貴的寶藏!✨
如何系統化學習算法
深入到精通一門知識的我們都需要一個系統化的學習方法,如果這門知識越是有難度,前期就越是枯燥無味,或者甚至覺得很困難。所以學習算法也是一樣的:
- 枯燥無味
- 所以需要系統化學習;
- 小步快跑的方式進行學習;
- 不懂就找答案不要埋頭苦學;
- 不牢固
- 越是龐大的知識,越學就會越覺得之前學到的知識忘的差不多了;
- 其實就是缺乏知識的穩固性;
- 預習
- 學習任何一門知識,都要先了解和預習這門知識;
- 同理,在學習一門新的開發語言時,我們都會先來一個
hello world
;
- 堅持leetcode刷題
- 要學會算法,並且穩固這一門知識,不斷的刻意練習是重中之重;
系統化的效果
系統化學習和拿起一本書最終的效果是不一樣的。很多時候我們開始學習一門知識,我們都會看:《xxx深入淺出》、《xxx指南》和《從0到1學會xxx》,其實裏面的知識是很龐大的。只靠知識是無法支撐我們的實戰和經驗的,所以我們需要系統化的學習方法最終達到的目標也是不一樣的,例如:
- 提升到職業頂尖水平
- 通過一線互聯網大廠的面試
- 要有Leetcode 300+ 刷題量
推薦閱讀《Outliner》這本書中的學習方法
精通一個領域
前面說到,任何一個領域的知識都是很龐大的。而且只靠看書,看文章學習都是不夠的。所以一套好的學習方法,可以爲我們打開一扇大門。而且在打開這扇大門的同時不會因爲艱苦、困難、煎熬或者是枯燥而最後放棄。
- 切碎知識點 Chunk it up
- 庖丁解牛
- 脈絡相連 - 從根部開始學習,到分支,再到樹葉。讓每一個知識點都有關聯關係
- 刻意練習 Deliberate Practicing
- 反饋 Feedback
數據結構有什麼?
- 一維:
- 基礎: 數組 array (string),鏈表 linked list
- 高級:棧 stack,隊列 queue, 雙端隊列 duque,集合 set,映射 map (hash or map),等等
- 二維:
- 基礎:樹 tree, 圖 graph
- 高級:二叉搜索樹 binary search tree(紅黑樹 red-black tree, AVL),堆 heap,並查集 disjoint set,字典樹 Trie
- 特殊:
- 位運算 Bitwise,步隆過濾器 BloomFilter
- LRU Cache (緩存)
算法有什麼?
任何的高級算法與數據結構都會轉換成If Else,for循環,其實也是最樸素的計算機的知識,沒有什麼AI,人工智能的知識。高級算法重點是找到重複單元
。
- 跳轉語句 (Branch) :If-else,switch
- 循環 (Iteration) :for, which,while loop
- 遞歸 (Recursion) : Divide & Conquer, Backtrace
- 搜索 (Search) :深度優先搜索 Depth first search,廣度優先搜索 Breadth first search,啓發式搜索 A*
- 動態規劃 (Dynamic Programming)
- 二分查找 (Binary Search)
- 貪心 (Greedy)
- 數學 (Math),幾何 (Geometry)
刻意練習 - Deliberate practice
無論是科學家、國家運動員、技術專家還是遊戲職業選手,他們的優秀的背後都有一個共同點:刻意練習
。
什麼是刻意練習?
- 刻意練習 - 過遍數,持續多邊形的練習,用數遍達到質變!(五毒神掌);
- 練習不擅長的地方;
- 如果感到不舒服、不爽、枯燥的話,那證明我們正在爬坡,正在提升!
反饋 - Feedback
很多時候在學習中,特別是在自學的過程,我們永遠不知道自己的學習的成果是怎麼樣的。或者我們有時候會遇到難點但是無法突破,甚至有時候我們以爲自己很努力,或者已經很強了。但是其實還只是坐井觀天而已。所以我們在學習的時候需要反饋
。所謂的反饋有幾種:
- 即時反饋
- 學會使用一門語言;
- 能寫出能執行的代碼;
- 能寫出一個項目;
- 能實現一個功能;
- 主動型反饋
- 高手代碼(Github、LeetCode);
- 第一視角止步(看視頻,看高手寫的代碼,學習思路);
- 被動式反饋(高手指點)
- 代碼審查 code review;
- 例如:教練看你打,給你反饋;
切題四件套
我個人認爲也可以叫解題四大法則
:
- 理解題目(Clarification)
- 在LeetCode看題後,先思考,認真確認和理解題目;
- 避免忽略了一些條件或者是誤解題目;
- 面試的時候更加應該跟面試官確認清楚題目、條件、場景等;
- 多種解題方案(Possible solutions)
- 對比時間和空間複雜度 compare (time/spaace)
- 最優解 optimal (加強)
- 多編寫(Coding)
- 代碼反覆練習和編寫;
- 每一種解法都反覆練習和編寫;
- 多測試案例(Test cases)
- 在LeetCode上可以改變測試案例;
- 多測試幾種案例,確保自己的代碼可以適應各種特殊情況;
刷題方式(五毒神掌)
第一遍
- 5分鐘:讀題 + 思考;
- 5分鐘過後,沒有思路就直接看解法;
- 記錄多個解題方法,比較解題方法的優弊;
- 嘗試默寫代碼,訓練刻意手寫代碼;
第二遍
- 自己編寫,這時候就不要再看題解了;
- LeetCode提交代碼,確保能通過;
- 有Bug沒有關係,重複debug到通過爲止;
- 編寫出多種解題方法;
- 持續優化 - 重點是
執行時間
(可參考LeetCode中打敗了多少的人,也可以點擊比較優秀的人,學習更好的寫法);
第三遍
- 過了一天後,再重複做題;
- 根據自己不熟悉的題目與程度做專項練習;
- 專項練習就是針對自己不熟悉的種類的題,從而刻意練習哪一種題;
第四篇
- 過了一週後,再反覆練習;
第五遍
- 面試前,提前2-3周開始重複練習;
總結
這篇筆記中,我們記錄了一下關鍵知識重點點:
- 如何深入學習一門知識
- 通過系統化學習一門知識;
- 最高效和持續的學習算法就是通過系統化的學習;
- 這裏推薦大家,真的想學好一個技術,最好的方法就是找對老師,找對課程,找對人;
- 如何攻破龐大的知識體系變成編程職業高手
- 切碎知識點與建立脈絡
- 刻意練習
- 反饋
- 數據結構中有什麼? - 看腦圖
- 算法中有什麼?- 看腦圖
- 算法練習方法
- 切題四件套
- 五毒神掌
我是三鑽,一個在技術銀河中和你們一起來終身漂泊學習。
點贊是力量,關注是認可,評論是關愛!下期再見 👋!
推薦閱讀
-
📖《28關學會HTML與HTML5基礎》 — 一個系列的文章和大家一起闖關進攻前端全方位知識點。沒有闖過這些關卡的童鞋,無論前端能力如何,這個可以鍛鍊我們自己,也可以深入知道我們自己的前端水平和差距。想學習前端的童鞋可以從零開始學習,一起排除困難共同打開前端大門!
-
📖《44關深入淺出CSS基礎之第一篇》 — 這周我們一起闖過了22關,下一期我們會一起把剩餘的22關完成。學習是一種像爬山一樣的過程,要經歷過漫長的上坡路,一步一個腳印。“路漫漫其修遠兮,吾將上下而求索。”, 在追尋知識的道路上,前方的道路還很漫長,但我們將百折不撓,不遺餘力地,上天下地的去追求和探索。讓我們繼續堅持學習,終身學習成長。在大前端的時代爬到技術的巔峯,做一個有深度的技術人員。
-
🔥《前端必看的8個HTML+CSS技巧》 — CSS是一個很獨特的語言。看起來非常簡單,但是某種特殊效果看似簡單,實現起來就頗有難度。這篇文章主要是給在學習前端的童鞋分享一些新的CSS技巧,一些在前端教程和培訓課堂中不會講到的知識。第二就是讓還在前端開發這條道路上的童鞋們,重新燃起對前端排版和特效的熱愛和熱情!🔥