03.31 學渣是如何自學數據結構的?

戳藍字“
CSDN雲計算”關注我們哦!

入门篇|学渣是如何自学数据结构的?

作者 | 小鹿

來源 | 一個不甘平凡的碼農

寫在前邊

-------------------------------------------

今天呢,我想簡單的分享一下半年來自學數據結構與算法學習方法和技巧。寫這篇文章主要目的還是重在讓剛剛接觸數據結構的讀者按照總結方法進行階段性學習。

目前在讀三流大學,之所以為學渣,在剛學編程初期,真的是比別人慢半拍,總是遇到各種迷茫和困惑,控制檯遇到各種錯誤總是希望有個人解決一下就好了,但是現實往往打你一個嘴巴子,睡一覺回過頭來還是自己硬著頭皮去解決,我相信大多數初學者都有這樣的疑惑。

但是到了後來,自己更注重於追求學習方法和學習效率,不過現在還是學渣,因為真正的大佬是無所畏懼的,我能做的只不過是幫助一些編程道路上的人解除困惑,提高一下學習效率。互聯網、編程技術更新換代太快了,如果不具備高效的學習方法和學習效率會被時代落下的,所以從今天開始重視學習方法和效率的,在未來的互聯網你會變的越來越有價值和存在感。

大學的三年時間基本在自學編程,老師的態度就是我也懶得講,課上能說廢話儘量說些廢話,期末給你們考試範圍就好了,以後就業面試和我一點關係都不掛鉤,無論你畢業不畢業對我沒有任何影響。在那時,我決定好好學習編程,大部分時間都是來自學,包括上課幹自己的事情。

同樣的一門技術,有沒有想過為什麼有人學的快,運用的快,後來發現並不是笨導致的,不要一直責怪自己不適合這不適合那,一開始我也是這麼想的,但是現在完全適合編程這種高強度的學習了。

今天主要分享一下學習數據結構正確的方式,我並不能保證適用於每一個人,但是我能保證比你盲目的去刷題,去隨便弄本書看效率高的多,那就從下邊這幾個方面入手吧,那就是動機、目標、實踐、反饋、提高標準

我的基礎

-----------------------------------

說起沒有學習數據結構之前的基礎,說起來有點丟人,只知道數組,而且是 C 語言中的數組,數組下標取值、遍歷等操作,可別笑話我菜,但是這半年來一步步摸索,終於知道數據結構在解決實際問題中的重要性了,分佈式、高併發系統的性能優化,都離不開數據結構,希望這篇文章不僅能分享給你學習數據結構的方法,也希望你能愛上數據結構。

我的學習動機

-----------------------------------

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

我的收穫

-----------------------------------

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

這些都是這半年來每天和數據結構打交道不斷的訓練出來的,這半年基本沒有一天放鬆過,就連除夕晚上都在做算法,研究數據結構。功夫不負有心人,即使基礎再不好,頭腦再笨,通過我總結的學習方法也能學好數據結構。

我的實踐

-----------------------------------

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

第一階段:認識數據結構

第一步:學習它就應該知道數組、鏈表、棧、隊列、散列表、跳錶、圖、樹、堆、字典樹10種數據結構用來幹什麼,為什麼,怎麼做 ,小鹿建議去看一些基礎的數據結構書籍或者藉助百度和谷歌簡單瞭解一下每種數據結構用來幹什麼,為什麼,怎麼做就可以了,然後可以簡單做一下筆記和博客。

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

第二階段:深入數據結構

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

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

第二步:在第一階段中我們瞭解到性能的衡量標準,那下一步就再回過頭來對 10 種最常用的幾種數據結構涉及到的操作進行性能分析。你可能會問,為什麼不邊寫代碼邊進行性能分析呢?

我覺得分階段的好處就是能集中解決問題,寫代碼就是要鍛鍊寫代碼的思維邏輯能力,性能分析就是要提高自己的分析能力,性能分析完成之後再看一下之前寫的代碼有哪些可以進行優化改進的。這期間你會遇到各種問題,遇到問題怎麼做,我通常會去百度或者谷歌藉助別人寫的文章進行總結記錄到筆記本上。

第三步:每種數據結構的性能分析完成之後,再進行對每種數據進行深入。第一階段我推薦的是看一些基礎的書籍,涉及到的知識層次不深。但是我們還是要至少手中有一本具有權威性深入解析的數據結構書籍才能對一些概念進行深入的理解。基礎書籍畢竟是讓你入門的嘛,我們可以通過這些權威性高、內容全面的對已學到的數據結構知識點進行查缺補漏。

第四步:單獨的深入學習真的很枯燥雜麼辦,那麼我們就實際生活中的例子去分析,比如猜數字遊戲、0/1揹包問題、走迷宮、八皇后問題以及滿減湊單問題等。如猜數字遊戲,我們可以想想怎麼才能在最短的時間內猜到正確的數字呢,可能你會想到使用二分查找。那好了,我們問一下自己二分查找存在的問題,這個過程中一定要多問自己為什麼,只有這樣你的知識層次才會得到擴展,比如二分查找如果數據中有重複數據怎麼解決?

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

第三階段:檢索數據結構

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

第二步:上述整理成體系之後完畢之後,然後去谷歌或者百度搜索一下有明確解決方案的實際問題拿來進行分析學習,你到這些實際項目中會發現,很多問題涉及到多個數據結構問題,我們前邊解決的還不過是針對單一的數據結構,那就嘗試著自己將數據結構之間建立聯繫。

比如數組和鏈表,每種數據結構都有優缺點,你在學習的過程中你會發現一個數據結構的優點正是另一數據結構的缺點,數組在內存空間是連續的,對CPU緩存友好,而鏈表在內存中是零碎內存空間,對CPU緩存不友好,但是鏈表可以動態擴容而數組不可以。

再比如為了提高程序的效率不得不用消耗更多的內存空間的數據結構去代替另一數據結構,如果內存緊張,對執行效率要求不高的話,我們又用省內存執行效率稍有不高的數據結構去代替佔內存大而執行快的數據結構。

第三步:學會將實際問題轉換成所學的數據結構 。怎麼轉化呢?如:假如你是一名工程師,要對鏈表實現緩存的算法進行優化你會怎麼解決?我們先將問題轉換成學過的數據結構,裡邊提到鏈表,好那我們知道有鏈表了,在分析用鏈表實現了那些操作?淘汰數據、查找數據、緩存數據,這三個操作裡邊都涉及到查找,我們不得不遍歷整個鏈表,時間複雜度為O(n)。

那我們就想能不能對查找進行優化呢?根據問題或者數據的特徵找適用的數據結構,緩存的三個操作涉及到快速的插入、刪除、查詢數據,我們在大腦中快速的檢索可以快速的實現插入、刪除、查詢的數據結構有哪些?平衡二叉樹、散列表、跳錶等,比如我們選擇散列表,最後分析一下時間複雜度是不是優化了很多,否則我們再換另一種數據結構進行性能分析。

我們不難發現,實際問題就會一步一步的分解成了我們學習到的數據結構的基本操作分析,然後利用我們學到的數據結構的優缺點和性能分析得出最優解絕方法,但是在企業中遇到實際問題中往往比我們拿一些做練習的實際問題複雜的要多。

後記

-----------------------------------

上述是我學習數據結構的三個階段,如果你完成了上述的三個階段,我還是建議將最基本的10個數據結構重新鞏固複習一遍,在鞏固和複習的三個階段中需要不斷的反饋和提高標準,我相信你會發現每一個知識點都會有新的收穫。

入门篇|学渣是如何自学数据结构的?

福利

掃描添加小編微信,備註“姓名+公司職位”,加入【雲計算學習交流群】,和志同道合的朋友們共同打卡學習!

入门篇|学渣是如何自学数据结构的?
  • 如何用30分鐘快速優化家中Wi-Fi?阿里工程師有絕招

  • 趣挨踢 | “菜鳥”程序員和“大神”程序員的差別竟然這麼大...

  • 雲漫圈 | 女生適合做程序員嗎?

  • Kubernetes 調度器實現初探

  • 李沐團隊新作Gluon,復現CV經典模型到BERT,簡單好用 | 強烈推薦

  • 日本樂天要求員工學編程,AI 進中小學課堂,全民編程時代來了!

  • 做了四年以太坊核心開發者, 以太坊升級了, 我也該離開了……

入门篇|学渣是如何自学数据结构的?

喜歡就點擊“在看”吧


分享到:


相關文章: