數據結構與算法之美 - 02 | 如何抓住重點,系統高效地學習數據結構與算法?

這系列相關博客,參考 數據結構與算法之美

數據結構與算法之美 - 02 | 如何抓住重點,系統高效地學習數據結構與算法?

你是否曾跟我一樣,因爲看不懂數據結構和算法,而一度懷疑是自己太笨? 實際上,很多人在第一次接觸這門課時,都會有這種感覺,覺得數據結構和算法很抽象,晦澀難懂,宛如天書。正是這個原因,讓很多初學者對這門課望而卻步。

我個人覺得,其實真正的原因是你沒有找到好的學習方法,沒有抓住學習的重點。實際上,數據結構和算法的東西並不多,常用的、基礎的知識點更是屈指可數。只要掌握了正確的學習方法,學起來並沒有看上去那麼難,更不需要什麼高智商、厚底子。

還記得大學裏每次考前老師都要劃重點嗎?今天,我就給你劃劃我們這門課的重點,再告訴你一些我總結的學習小竅門。相信有了這些之後,你學起來就會有的放矢、事半功倍了。

什麼是數據結構? 什麼是算法?

大部分數據結構和算法教材,在開篇都會給這兩個概念下一個明確的定義。但是,這些定義都很抽象,對理解這兩個概念並沒有實質性的幫助,反倒會讓你陷入死摳定義的誤區。畢竟,我們現在學習,並不是爲了考試,所以,概念背得再牢孕不會用也就沒什麼用。

雖然我們說沒必要深挖嚴格的定義,但是這並不等於不需要理解概念。下面我就從廣義和狹義兩個層面,來幫你理解數據結構與算法這兩個概念。

從廣義上講,數據結構就是指一組數據的存儲結構。算法就是操作數據的一組方法。

圖書館儲藏書籍你肯定見過吧?爲了方便查找,圖書管理員一般會將書籍分門別類進行“存儲”。按照一定規律編號,就是書籍這種“數據”的存儲結構。

那我們如何來查找一本書呢?有很多種辦法,你當然可以一本一本地找,也可以先根據書籍類別的編號,是人文,還是科學、計算機,來定位書架,然後再依次查找。籠統地說,這些查找方法都是算法。

從狹義上講,也就是我們專欄要講的,是指某些著名的數據結構和算法,比如隊列、棧、堆、二分查找、動態規劃等。這些都是前人智慧的結晶,我們可以直接拿來用。我們要講的這些經典數據結構和算法,都是前人從很多實際操作場景中抽象出來的,經過非常多的求證和檢驗,可以高效地幫助我們解決很多實際的開發問題。

那**數據結構和算法有什麼關係呢?**爲什麼大部分書都把這兩個東西放到一塊兒來講呢?

這是因爲,數據結構和算法是相輔相成的。數據結構是爲算法服務的,算法要作用在特定的數據結構之上。因此,我們無法孤立數據結構來講算法,也無法孤立算法來講數據結構。

比如,因爲數組具有隨機訪問的特點,常用的二分查找算法需要用數組來存儲數據。但如果我們選擇鏈表這種數據結構,二分查找算法就無法工作了 ,因爲鏈表並不支持隨機訪問。

數據結構是靜態的,它只是組織數據的一種方式。如果不在它的基礎上操作、構建算法,孤立存在的數據結構就是沒用的。

現在你對數據結構與算法是不是有了比較清晰的理解了呢?有了這些儲備,下面我們來看看,究竟該怎麼學數據結構與算法。

學習這個專欄需要什麼基礎?

看到數據結構和算法裏的“算法”兩個字,很多人就會聯想到“數學”,覺得算法會涉及到很多深奧的數學知識。那我數學基礎不是很好,學起來會不會很吃力啊? 數據結構和算法課程確實會涉及一些數學方面的推理、證明,尤其是在分析某個算法的時間、空間複雜度的時候,但是這個你完全不需要擔心。

這個專欄不會像《算法導論》那樣,裏面有非常複雜的數學證明和推理。我會由淺入深,從概念到應用,—點一點給你解釋清楚。你只要有高中數學水平,就完全可以學習。

當然,我希望你最好有些編程基礎,如果有項目經驗就更好了。這樣我給你講數據結構和算法如何提高效率、如何節省存儲空間,你就會有很直觀的感受。因爲,對於每個概念和實現過程,我都會從實際場景出發,不僅教你 “是什麼”,還會教你 “爲什麼”,並且告訴你遇到同類型問題應該 “怎麼做” 。

學習的重點在什麼地方?

提到數據結構和算法,很多人就很頭疼,因爲這裏面的內容實在是太多了。這裏,我就幫你梳理一下,應該先學什麼,後學什麼。你可以對照看看,你屬於哪個階段,然後有針對地進行學習。

想要學習數據結構與算法,首先要掌握一個數據結構與算法中最重要的概念——複雜度分析。

這個概念究竟有多重要呢?可以這麼說,它幾乎佔了數據結構和算法這門課的半壁江山,是數據結構和算法學習的精髓。

數據結構和算法解決的是如何更省、更快地存儲和處理數據的問題,因此,我們就需要一個考量效率和資源消耗的方法,這就是複雜度分析方法。所以,如果你只掌握了數據結構和算法的特點、用法,但是沒有學會複雜度分析,那就相當於只知道操作口訣,而沒掌握心法。只有把心法瞭然於胸,才能做到無招勝有招!

所以,複雜度分析這個內容,我會用很大篇幅給你講透。你也一定要花大力氣來啃,必須要拿下,並且要搞得非常熟練。否則,後面的數據結構和算法也很難學好。

搞定複雜度分析,下面就要進入數據結構與算法的正文內容了。

爲了讓你對數據結構和算法能有個全面的認識,我畫了一張圖,裏面幾乎涵蓋了所有數據結構和算法書籍中都會講到的知識點。
在這裏插入圖片描述
(圖譜內容較多,建議長按保存後瀏覽)

但是,作爲初學者,或者一個非算法工程師來說,你並不需要掌握圖裏面的所有知識點。很多高級的數據結構與算法,比如二分圖、最大流等,這些在我們平常的開發中很少會用到。所以,你暫時可以不用看。我還是那句話,咱們學習要學會找重點。如果不分重點地學習,眉毛鬍子一把抓,學起來肯定會比較吃力。

所以,結合我自己的學習心得,還有這些年的面試、開發經驗,我總結了 20個最常用的、最基礎數據結構與算法,不管是應付面試還是工作需要,只要集中精力逐一攻克這20個知識點就足夠了。

這裏面有10個數據結構:數組、鏈表、棧、隊列、散列表、二叉樹、堆、跳錶、圖、Trie樹;10個算法:遞歸、 排序、二分查找、搜索、哈希算法、貪心算法、分治算法、回溯算法、動態規劃、字符串匹配算法。

掌握了這些基礎的數據結構和算法,再學更加複雜的數據結構和算法就會非常容易、非常快。

在學習數據結構和算法的過程中,你也要注意,不要只是死記硬背,不要爲了學習而學習,而是要學習它的"來歷"、“自身的特點”、“適合解決的問題” 以及 “實際的應用場景” 。對於每一種數據結構或算法,我都會從這幾個方面進行詳細講解。只要你掌握了我每節課裏講的內容,就能在開發中靈活應用。

學習數據結構和算法的過程,是非常好的思維訓練的過程,所以,千萬不要被動地記憶,要多辯證地思考,多問爲什麼。如果你一直這麼堅持做,你會發現,等你學完之後,寫代碼的時候就會不由自主地考慮到很多性能方面的事情,時間複雜度、空間複雜度非常高的垃圾代碼出現的次數就會越來越少。你的編程內功就真正得到了修煉。

一些可以讓你事半功倍的學習技巧

前面我給你劃了學習的重點,也講了學習這門課需要具備的基礎。作爲一個過來人,現在我就給你分享一下,專欄學習的一些技巧。掌握了這些技巧,可以讓你化被動爲主動,學起來更加輕鬆,更加有動力!

1. 邊學邊練,適度刷題

"邊學邊練"這一招非常有用。建議你每週花1~2個小時的時間,集中把這周的三節內容涉及的數據結構和算法,全都自己寫出來,用代碼實現一遍。這樣一定會比單純地看或者聽的效果要好很多!有面試需求的同學,可能會問了,那我還要不要去刷題呢?

我個人的觀點是可以"適度"刷題,但一定不要浪費太多時間在刷題上。我們學習的目的還是掌握,然後應用。 除非你要面試Google、Facebook這樣的公司,它們的算法題目非常非常難,必須大量刷題,才能在短期內提升應試正確率。如果是應對國內公司的技術面試,即便是BAT這樣的公司,你只要徹底掌握這個專欄的內容,就足以應對。

2. 多問、多思考、多互動

學習最好的方法是,找到幾個人一起學習,—塊兒討論切磋,有問題及時尋求老師答疑。但是,離開大學之後, 既沒有同學也沒有老師,這個條件就比較難具備了。

我也會力爭每節課都最大限度地給你講透,幫你掃除知識盲點,而你要做的就是,避免一知半解,要想盡一切辦法去搞懂我講的所有內容。

3.打怪升級學習法

學習的過程中,我們碰到最大的問題就是,堅持不下來。是的,很多基礎課程學起來都非常枯燥。爲此,我自己總結了一套"打怪升級學習法"。

遊戲你肯定玩過吧?爲什麼很多看起來非常簡單又沒有樂趣的遊戲,你會玩得不亦樂乎呢?這是因爲,當你努力打到一定級別之後,每天看着自己的經驗值、戰鬥力在慢慢提高,那種每天都在一點一點成長的成就感就不由自主地產生了。

所以,我們在枯燥的學習過程中,也可以給自己設立一個切實可行的目標,就像打怪升級一樣。

比如,針對這個專欄,你就可以設立這樣一個目標:每節課後的思考題都認真思考,並且回覆到留言區。當你看到很多人給你點贊之後,你就會爲了每次都能發一個漂亮的留言,而更加認真地學習。

當然,還有很多其他的目標,比如,每節課後都寫一篇學習筆記或者學習心得;或者你還可以每節課都找一下我講得不對、不合理的地方…諸如此類,你可以總結一個適合你的"打怪升級攻略"。

如果你能這樣學習一段時間,不僅能收穫到知識,你還會有意想不到的成就感。因爲,這其實幫你改掉了一點學習的壞習慣。這個習慣一旦改掉了 ,你的人生也會變得不一樣。

4.知識需要沉澱,不要想試圖一下子掌握所有

在學習的過程中,一定會碰到"攔路虎"。如果哪個知識點沒有怎麼學懂,不要着急,這是正常的。因爲,想聽一遍、看一遍就把所有知識掌握,這肯定是不可能的。學習知識的過程是反覆迭代、不斷沉澱的過程。

如果碰到"攔路虎",你可以盡情地在留言區問我,也可以先沉澱一下,過幾天再重新學一遍。所謂,書讀百遍其義自見,我覺得是很有道理的!

我講的這些學習方法,不僅僅針對咱們這一個課程的學習,其實完全適用任何知識的學習過程。你可以通過這個專欄的學習,實踐一下這些方法。如果效果不錯,再推廣到之後的學習過程中。

內容小結

今天,我帶你劃了劃數據結構和算法的學習重點,複雜度分析,以及10個數據結構和10個算法。

這些內容是我根據平時的學習和工作、面試經驗積累,精心篩選出來的。只要掌握這些內容,應付日常的面試、工作,基本不會有問題。

除此之外,我還給你分享了我總結的一些學習技巧,比如邊學邊練、多問、多思考,還有兩個比較通用的學習方法,打怪升級法和沉澱法。掌握了這些學習技巧,可以讓你學習過程中事半功倍。所以,你一定要好好實踐哦!

課後思考

今天的內容是一個準備課,從下節開始,我們就要正式開始學習精心篩選出的這20個數據結構和算法了。所以, 今天給你佈置一個任務,對照我上面講的"打怪升級學習法”,請思考一下你自己學習這個專欄的方法! 另外,你在之前學習數據結構和算法的過程中,遇到過什麼樣的困難或者疑惑嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章