1. 程式人生 > >再也不怕資料結構和演算法之開篇

再也不怕資料結構和演算法之開篇

## 為什麼要學習演算法和資料結構 >演算法和資料結構是程式設計師的基本內功,基本內功修煉不好,以後修煉一些招式,如設計模式、架構,新的技術熱點如區塊鏈,新的技術語言go等,都會感覺非常吃力。 喜歡看武俠小說的知道,張無忌正是因為內功精純,再加乾坤大挪移加持,學習任何武功招式都如探囊取物,短時間內即可融匯貫通。程式設計師的內功-資料結構和演算法,乾坤大挪移-設計模式。 說實話,作為一個渣渣程式設計師,非CS專業出身,基礎本就比較薄弱。正好藉著寫文章的機會,把資料結構和演算法及設計模式都系統的學習一遍,並且把這些以比較容易理解的形式表達出來,授人以漁,同時自己也能理解的更透徹,何樂而不為。 扯的好像有點遠了,言歸正傳,為什麼要學習資料結構和演算法,我覺得有以下幾個主要原因: 1. 應對技術面試,面過廣大的程式設計師們,通過層層簡歷篩選,然後技術面試,大家的專案經歷各部相同,很難深入挖掘,那怎麼甄別候選人的技術能力呢?最簡單也是最直接有效的方式當然就是考考你資料結構和演算法咯。 2. 程式設計師成長之路的基石,如同高樓大廈的地基,在有了良好的資料結構和演算法的基礎之上,程式設計師的學習能力和成長潛力才更大,以後才能走的更高更遠。 3. 面對一些問題,根據已有的資料結構和演算法經驗,能夠設計出比較優雅及高效的解決方法。分析和解決問題的能力也會比資料結構和演算法薄弱的同學更強。隨著經驗的慢慢積累,可以不斷的設計、實現高效能系統,向著開原始碼作者和架構師之路邁進。 ## 資料結構和演算法真這麼重要嗎? >為什麼程式設計師被稱為碼農呢?大家都知道,越是大公司,分工越精細,每個人幾乎都是一顆可以隨時替代的螺絲釘。每天的工作也無非就是在原有的系統之上,做一些bug修復,一些小的功能點迭代。涉及到的編碼無非是一些curd操作,尤其是現在在一些優秀的框架之下,程式設計師的程式設計幾乎是傻瓜式的。 > **那怎麼才能體現你的價值?告別curd boy呢?** 連一些基本的資料結構和演算法都掌握不了,一些普通的演算法題解法都不會,你怎麼能在這近百萬的程式設計師之中脫穎而出呢?任何群體都如金字塔,處於塔尖的人很少,不能掌握好資料結構和演算法,那你就基本只能處於程式設計師金字塔的最底端。 任何公司,都會有一些技術討論吧!有時候技術leader拉你們一起討論一些問題,人家說這很簡單嘛,就是揹包問題,或者這個用dfs演算法不就ok了嘛,你如果連這些都聽不懂,那是不是覺得自己很low,根本無法同別人溝通交流。更別提在技術方面有一些自己的獨到見解了,也就無從談起去一些公開場合分享自己的觀點。 世界天天在變,技術熱點千變萬化,但是處於最基礎的資料結構和演算法確是處於基本不變的。學好了資料結構和演算法,你就能夠很雲淡風輕的笑傲不斷變化的新技術及新趨勢,額,這歸根到底不還說xx演算法麼,就是封裝了一下而已,在資料結構和演算法的基石之上,不斷提升自己的思維、邏輯分析、抽象總結能力,那你就是一個越來越逼格的程式設計師了。 ## 怎麼學習資料結構和演算法呢? >終於到了最重要的時刻,前面廢了半天話,無非是想打動你這顆如頑石般的心,讓你覺得學資料結構和演算法好像很有用哦,那我是應該好好學啊。如果你意識到這一點,並覺得有時候面試演算法對自己像是一種折磨和煎熬,又或者感覺好像自己從來就沒掌握過資料結構和演算法,那麼恭喜你,咱們接下來可以一起學習進步了。 怎麼學呢? 看到這篇文章的估計大部分已經是大學生或者已經參加工作了吧,相信你在這麼多年的不斷打怪升級中,總結了不少學習方法吧?在這裡,我分享一下我的學習經歷。 我基礎比較薄弱嘛,曾經好幾次發誓要學好資料結構和演算法,買了書,買了課程,每次都是看完陣列和連結串列,頂多到了遞迴,後面就堅持不下去了,覺得真是太難了,跟天書一般,這都是誰設計的啊。 我覺得可能90%的人都有跟我類似的經歷,人本身惰性比較強,遇到挫折容易找自我安慰,但是我們真的甘心墮落嗎?真的想一輩子當一個底層curd boy?從來沒想過多賺點錢,早點贏取白富美,走上人生巔峰? 咳咳咳,心裡想到白富美,是不是頓時感覺渾身充滿了動力,白富美捨我其誰啊,那就好好跟我一起邁過資料結構這道坎(偷偷告訴你,其實是大家一起邁,我也沒邁過去呢)。 1. 資料結構和演算法,先有資料結構,後有演算法,首先要知道有哪些資料結構,每種資料結構是幹啥的,怎麼用,各有什麼優缺點,分別適用於解決什麼問題的場景。 2. 多總結,多分析。任何事情,只要你不斷分析總結,付出努力,總會慢慢收穫的。一遍看不懂,那就看三遍,三遍不行,那就看五遍。今天看不懂,不代表以後看不懂,說不定某天就會豁然開朗。學習貴在堅持,總結,分析。 3. 多動手,多練習,多刷題。紙上得來終覺淺,絕知此事要躬行。LeetCode應該是程式設計師們刷題最多的網站了,但我們也要刷題有道,不要為了刷題而刷題。所謂題海無涯,而學有涯,要掌握題目的本質,解決問題的思路,而不是沉浸在大量的、枯燥的題海戰術上。 ## 資料結構和演算法的知識點 為了讓你對資料結構和演算法能有個全面的認識,這裡借用小爭哥的一張圖,裡面幾乎涵蓋了所有資料結構和演算法書籍中都會講到的知識點。 所謂按圖索驥,哪裡不懂學哪裡,直到某一天,你閉上眼睛,這一幅腦包圖可以完整的出現在你的腦子裡,並且可以清晰的回憶起每個知識點,分別對應LeetCode上哪些典型題目及經典解法,和有哪些坑點,能總結出什麼經驗來,平時在專案中可能會怎麼用到,那你就真的是學到了。 >作為一名典型普通程式設計師,我也跟你一樣,很懶。如果你覺得寫的有點道理,並且想和我一起好好邁過資料結構和演算法這道坎,記得點個