筆者作為一名非科班出身的程序員,想系統地補充“數據結構與算法”這一塊知識,入了極客時間的專欄《數據結構與算法之美》,希望能以筆記的形式總結、分享所學,更以督促學習。
本章內容源于對專欄以下章節的學習筆記:
經驗篇
作者開篇介紹了兩個和數據結構與算法有關的例子:
- 1.在作者的學生時代,為了幫他提高編程能力,師兄給了他一本《算法導論》,使他對算法開始著迷。通過對數據結構與算法的研究,編程能力有了質的飛躍。他認為那是他人生為數不多的轉折點之一。
- 2.一位在騰訊工作10年的T4大牛,跳槽去區塊鏈領域,用了不到半年時間,就把區塊鏈的整個技術脈絡摸清楚了。他曾經說,像區塊鏈、人工智能這些看似很新的技術,其實一點兒都不“新”。最初學編程的時候,他就把那些基礎的知識都學透了。當面臨行業變動、新技術更迭的時候,他不斷發現,那些所謂的新技術,核心和本質的東西其實就是當初學的那些知識。
基礎知識就像是一座大樓的地基,它決定了我們的技術高度。而要想快速做出點事情,前提條件一定是基礎能力過硬,“內功”要到位。
我們都知道基礎無外乎就是操作系統、計算機網絡、編譯原理等,當然還有數據結構和算法。
人生路上,我們會遇到很多的坎。跨過去,你就可以成長,跨不過去就是困難和停滯。而在后面很長的一段時間里,你都需要為這個困難買單。對于我們技術人來說,更是這樣。既然數據結構和算法這個坎,我們總歸是要跨過去,為什么不是現在呢?
目的篇
我們為什么要學習數據結構和算法?
1.通關大廠面試
- 就校招而言,沒有實際項目經驗,公司只能考察基礎知識是否牢固。
- 就社招而言,越是厲害的公司越重視考察數據結構與算法等基礎知識,相對短期能力,公司更看中你的長期潛力。
擺正心態:我們學任何知識都是為了“用”的,是為了解決實際工作問題。
2.避免只會業務操作
在基礎框架中,一般都柔和了很多基礎數據結構和算法的設計思想。掌握數據結構和算法,不管對于閱讀框架源碼,還是理解其背后的設計思想,都是非常有用的。
3.開源框架的目標
相同原理的框架,為什么有的人寫的就可以在GitHub上被很多人使用,甚至被官方收錄?歸根結底在于細節,比如算法的優化、數據存儲效率、內存的優化等等。
4.對編程的追求
不想只會寫湊合的代碼,對編程有所追求。性能好壞起碼是評判代碼非常重要的一個標準。
小結:學習數據結構和算法,并不是為了死記硬背幾個知識點。目的是建立時間復雜度、空間復雜度意識,寫出高質量的代碼,能夠設計基礎架構,提升編程技能,訓練邏輯思維,積攢人生經驗,以此獲得工作回報,實現你的價值,完善你的人生。掌握了數據結構與算法,你看待問題的深度,解決問題的角度就會完全不一樣。
方法篇
如何系統高效地學習數據結構與算法?
1.數據結構與算法的定義
從廣義上講,數據結構就是指一組數據的存儲結構。算法就是操作數據的一組方法。
2.數據結構與算法的關系
數據結構和算法是相輔相成的。數據結構是為算法服務的,算法要作用在特定的數據結構之上。
3.學習認知要求
搞清楚:是什么、為什么、怎么做?
4.學習重點
- 首先要掌握一個數據結構與算法中最重要的概念——復雜度分析;
- 10個數據結構:數組、鏈表、棧、隊列、散列表、二叉樹、堆、跳表、圖、Trie 樹;
- 10個算法:遞歸、排序、二分查找、搜索、哈希算法、貪心算法、分治算法、回溯算法、動態規劃、字符串匹配算法;
- 學習它們的來歷、自身的特點、適合解決的問題以及實際的應用場景。
5.學習技巧
- 邊學邊練,適度刷題
- 多問、多思考、多互動
- 打怪升級學習法:留言、筆記、心得、找錯
- 知識需要沉淀,不要想試圖一下子掌握所有:學習知識的過程是反復迭代、不斷沉淀的過程,書讀百遍其義自見