我是如何自學資料結構的?

不甘平凡的小鹿發表於2019-03-10

【轉載請說明出處】:juejin.im/post/5c8464…

我是如何自學資料結構的?

寫在前邊

大家好,我叫小鹿,目前正在上大三。今天呢,我想簡單的分享一下半年來自學資料結構與演算法學習方法和技巧。寫這篇文章主要目的還是重在讓剛剛接觸資料結構的讀者按照總結步驟進行階段性學習。

小鹿上的一所普通的三本大學,大學的三年時間基本在自學程式設計,畢竟課上老師所授的課程很淺,老師講述一個知識點是要考慮到大部分不同理解能力學生的,所以對於我這種喜歡刨根問底的學生從大一開始不得不花費大量的時間來自學程式設計。自學呢,我更注重效率,效率在哪裡來?我相信很多自學程式設計的人最講究的就是方法和技巧,而小鹿的學習方法是不斷的幾個階段迴圈總結而出的,那就是動機、目標、實踐、反饋、提高標準

我的基礎

先說一下學習資料結構之前處於一個什麼的基礎,大二的時候學校就開設了資料結構的課程,但是當時對資料結構並沒有什麼興趣,一學期下來,如果別人問我知道陣列和連結串列嗎?我可能在大腦中有點結構印象,其他的資料結構比如:雜湊表、跳錶、樹等一點印象都沒有,甚至不知道是什麼。

我的學習動機

學習一門技術首先要有動機。那什麼是動機呢?我們經常看到減肥的人通常在房間裡放一張好身材的圖片,就是為了產生動機每天堅持減肥。學習也是一樣的,沒有動機就沒有的學習下去的動力。那我學習資料結構的最初動機是什麼呢?快實習了,想讓自己找一家好的公司實習,沒有資料結構與演算法的基礎不可能進入一家理想的公司的,所以我將進入一家理想的公司作為學習的動機。

我的目標

經過大三上半年對資料結構的自學,和以前那個自己相比有了質的飛躍,從最基礎的某一資料結構的由來、是什麼,特點以及優缺點到實際專案中應該如何運用,再到如何培養自己下意識的資料結構(遇到問題,根據問題的特性就能下意識的想到用哪個資料結構來解決)。到後來逐漸的學會了將多種資料結構聯絡起來進行解決問題,這樣做的目的就是能夠讓程式效能更加穩定,效率更加高效。

這些都是這半年來每天和資料結構打交道不斷的訓練出來的,這半年基本沒有一天放鬆過,我相信功夫不負有心人,即使基礎再不好,頭腦再笨,通過我總結的操作步驟也能學好資料結構。

我的實踐

因為我上的是一所三流大學,大多數時間考自學,總結了很多的提高學習效率的方法,那麼在學習資料結構上我是怎麼做的呢?我將資料結構的學習分為了三個階段。

第一階段:認識資料結構

第一步:學習它就應該知道它用來幹什麼,為什麼,怎麼做,小鹿建議去看一些基礎的資料結構書籍或者藉助百度和谷歌瞭解一下。

第二步:每種資料結構都有它的優缺點和效能的好壞,那我們以什麼標準來衡量資料結構與演算法的效能好快呢?那第二步就學習時間複雜度、空間複雜度相關的複雜度分析的內容,這部分內容至關重要,因為後邊要學到的資料結構與演算法都要有一個衡量效能標準的,為了能夠不同的問題解決選擇出效能最優的資料結構和演算法。

第三步:上邊我們瞭解到效能的衡量標準,那下一步就要開始學習最常用的幾種資料結構:陣列、連結串列、棧、佇列、雜湊表、跳錶、圖、樹、堆、字典樹10種資料結構。第一階段不要求我們瞭解這些資料結構,從以下幾個方面來學習。由來、特性、適用條件、有哪些操作、每種操作的時間複雜度分析以及能否進行優化,這期間你會遇到各種問題,遇到問題怎麼做,我通常會去百度或者谷歌藉助別人寫的文章進行總結記錄到筆記本上。

第二階段:深入資料結構

第一步:上邊最基本的十種資料結構相關特性和使用條件都記錄到本子上了,然後我們從頭開始對每種資料結構進入深入研究,首先資料結構涉及到的操作,比如增、刪、改、查等操作要自己實現一遍,在機器上執行一遍,寫程式碼的時候一定要注意以下幾點:邊界條件、指標、程式碼的規範。

這樣會使你更加的對程式碼有顆敬畏之心,每次寫程式碼都要認真對待,如果機器上寫程式碼沒問題了,可以自己通過在筆記本上用筆手寫親自實現一遍,有利於你加深你的程式碼邏輯的理解。

第二步:你可能會問,第一階段每種資料結構特性基本瞭解了,看什麼書籍或者視訊才能深入瞭解呢,關於視訊資料我就不再這裡推薦了,推薦書籍吧,這並不是打廣告哈。要想深入我們要一本有權威的資料,想查什麼就會有個權威的解釋,《演算法導論》這本書雖然很厚,但是每次查詢都能找到我想找的,就當做一本詞典查了,擴充自己知識體系了。

第三步:單獨的深入學習真的很枯燥雜麼辦,那麼我們就實際生活中的例子去分析,比如猜數字遊戲,我們可以想想怎麼才能在最短的時間內猜到正確的數字呢,可能你會想到使用二分查詢。那好了,我們問一下自己二分查詢存在的問題,這個過程中一定要多問自己為什麼,只有這樣你的知識層次才會得到擴充套件,比如二分查詢如果資料中有重複資料怎麼解決?

我還是要強調一下,一定要多問自己為什麼,因為從心理學上來講,人的大腦符合最小阻力原則,就是思考的事情最不喜歡做,所以這裡我們要逆著來,才能進一步進行突破。如果你覺的上述兩個階段沒有問題了,我們就進行下面的第三個階段檢索資料結構。

第三階段:檢索資料結構

第一步: 這時你可能學的非常多的關於資料結構的內容,但是很難運用,那怎麼能夠在實際實際問題中運用起來呢?第一步先要做整理,將前邊零碎的知識點整理到筆記本上,怎麼整理呢?我們可以藉助思維導圖,對知識體系化整理,無論是複習鞏固都利於我們進一步加強。

第二步:上述整理完畢之後,你到實際專案中會發現,很多問題涉及到多個資料結構問題,我們淺表解決的還不過是針對單一的資料結構,那就嘗試著自己將資料結構之間建立聯絡,比如陣列和連結串列,每種資料結構都有優缺點,你在學習的過程中你會發現一個資料結構的優點正是另一資料結構的缺點,或者說這種資料結構可以解決的問題可以彌補另一種資料結構不能解決的問題,反覆思考之後整理下來,方便以後在此基礎上進行擴充套件。

第三步:將實際問題轉換成所學的資料結構,遇到問題,根據問題或者資料的特徵找到適用的資料結構,比如我們需要快速的插入、刪除、查詢資料,我們在大腦中快速的檢索可以快速的實現插入、刪除、查詢的資料結構有哪些?平衡二叉樹、雜湊表、跳錶等。然後根據問題另一條件或者特徵在這些資料結構中進行篩選。

第四步: 怎麼篩選呢?就用到我們前邊講到的效能分析,時間複雜度、空間複雜度,知道選出合理的方案。

上述是我學習資料結構的三個階段,如果你完成了上述的三個階段,認為是不是沒有任何問題了?不是的,因為我們會解決問題遇到很多情況,我們傑接下來怎麼做呢?

我的反饋

我們把每次解決問題或者每一遍去複習資料結構都要有所收穫,同樣的知識怎麼增加自己的收穫呢?那就是要不斷的反饋給自己資訊,比如,雜湊衝突當前的解決方法在實際專案中不適用,那我將這個資訊反饋給自己,問一下自己有沒有更好的解決辦法?反饋之後,接下來就是提高學習的標準了。

提高標準

學習資料結構總會遇到瓶頸的,當我們走出瓶頸之後就會很順利很多,那你會問接下來有沒有再提高的可能了?會有的,接下來你就講提高自身的標準,比如你解決生活中的實際問題讓自己有下意識解決問題的能力,不借助任何參考資料,這方面對自身的要求很高的,再比如提高工作的效率,看起來非常高標準的,我相信每個人只有不斷的通過努力的實踐、反饋總有一天會鍛煉出來這種能力的,相信你。


本公眾號專注於「前端」、「資料結構」網際網路技術領域,通俗簡單的文字和動漫配圖,讓你愛上程式設計。

一個不甘平凡的碼農

微信公眾號:一個不甘平凡的碼農

相關文章