本來打算貼上極客時間的目錄圖片,結果發現圖片太長了。影響到閱讀,何況我並不是為了宣傳極客時間的專欄。
- 作為一名軟件工程師,為什么要學習數據結構和算法?
看到這個標題,我打算先不看文章,先自己反思一下。自己寫程序多年,發現在做很多項目的時候被算法限制了自己的發揮,很多實現明明知道應該有更好的辦法,但是就是無法寫成代碼。還有很多時候,看別人的源碼也會一知半解,甚至要加上斷點調試才知道整個實現邏輯。所以,算法在前期可能看上去沒那么重要,因為有太多的框架,太多的基礎設施提供,而去實現一些中小型的系統,因為負載量一般都不高,很多無需考慮性能問題,就算性能有點問題,一般也會粗暴的增加硬件配置去解決,畢竟現在雲服務器、硬件成本越來越低。剛出道的時候,遇到過很多不堪入目的代碼,也見過很多有3年左右開發經驗的同學同事繞了一大圈寫了一堆莫名其妙的的邏輯去解決某個簡單問題,一般都是只要實現了業務需求即可,至於性能。呵呵!這種情況出現在asp.net比較多。我的第一家公司是深圳一家外包公司,進去沒多久,我們老大就看不下去我們寫的各種嵌套if,過去這么多年了,還是印象深刻,他教我們反向思維,在if里面提前return代碼,這樣就不用一個個的if嵌套下去了,達不到某個條件就直接return了,不用再寫個else。
接下來看看專欄作者,谷歌工程師的解釋。 - 通關大廠面試,這個對於我這種草根來說,進入大廠感覺是一個遙不可及的夢,哦,不對,做夢也沒有想過這個事。
- 業務工程師從CRUD boy崗位進階。基礎框架中糅合了很多基礎數據結構和算法的設計思想,掌握數據結構和算法對於閱讀框架源碼,理解其背后的設計思想,有非常大的幫助。
- 基礎架構研發工程師寫出達到開源水平的框架。這個還是崗位與技術的進階。對於自己來說,各種各樣的源碼拿來即用,很少去考慮過他們是怎么實現的,我是為了解決問題而解決問題,只考慮當下,以后遇到了又得查資料,這樣毫無積累,技術沒有任何長進。
- 對編程還有追求,不想被行業淘汰。確實現在競爭越來越激烈了,感覺現在遍地都是程序員了,這是一個最好的時代,也是一個最壞的時代。30歲越來越近,不知道何去何從。
- 最后掌握了數據結構和算法,你看待問題的深度,解決問題的角度就會完全不一樣。好吧,我拭目以待。
- 如何抓住重點,系統高效得學習數據結構和算法。
這正是我學習你這個專欄的原因。 - 數據結構指一組數據的存儲結構,算法是操作數據的方法。數據庫類似於圖書館,存的數據類似於書本,書本分門別類並按照一定規律編號,分類與編號就是書籍這種數據的存儲結構。我們去查找某一本書的方法就是算法。這個專欄主要講一些著名的數據結構和算法,比如隊列、堆、棧、二分查找、動態規划等。
- 數據結構和算法的關系。數據結構和算法是相輔相成的。數據結構是為算法服務的,算法要作用再特定的數據結構之上。就像你要去統計人數,如果人站得亂七八糟的東一個西一個,而且沒事還要走動一下,你就很難統計出准確的人數出來,如果讓人按照10人一隊站整齊,,就可以快速准確的統計出人數來。
- 學習重點,先掌握最重要概念:復雜度分析。數據結構和算法解決的是如何更省、更快地存儲和處理數據的問題,因此,我們需要一個考量效率和資源消耗的方法,這就是復雜度分析方法。20個最常用的、最基礎數據結構與算法:
- 10個數據結構:數組、鏈表、棧、隊列、散列表、二叉樹、堆、跳表、圖、Tried樹;
- 10個算法:遞歸、排序、二分查找、搜索、哈希算法、貪心算法、分治算法、回溯算法、動態規划、字符串匹配算法。
- 一些事半功倍的學習技巧
- 邊學邊練,適當刷題。https://leetcode.com/ 力扣,也有中文版。左耳朵耗子推薦的算法練習網站。
- 多問、多思考、多互動。剛好有個朋友做大數據的,算法這塊可以多找他請教~~
- 打怪升級學習法,給自己設定切實可行的目標。
- 知識需要沉淀,不要試圖一下子掌握所有。需要多復習。