本文做者:黃小斜c++
轉載請務必在文章開頭註明出處和做者。算法
學習編程,數據結構是你必需要掌握的基礎知識,那麼數據結構究竟是什麼呢?編程
根據百度百科的介紹,數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。數據結構每每同高效的檢索算法和索引技術有關。
聽聽這是人話麼,我幫大家翻譯一下,其實數據結構就是用來描述計算機裏存儲數據的一種數學模型,由於計算機裏要存儲不少亂七八糟的數據,因此也須要不一樣的數據結構來描述。segmentfault
瞭解了基本概念以後,接下來咱們再來看看,爲何咱們要學習數據結構呢?api
在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗代表,系統實現的困難程度和系統構造的質量都嚴重的依賴因而否選擇了最優的數據結構。數組
許多時候,肯定了數據結構後,算法就容易獲得了。有些時候事情也會反過來,咱們根據特定算法來選擇數據結構與之適應。不論哪一種狀況,選擇合適的數據結構都是很是重要的。數據結構
選擇了數據結構,算法也隨之肯定,是數據而不是算法是系統構造的關鍵因素。這種洞見致使了許多種軟件設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。學習
也就是說,選定數據結構每每是解決問題的核心,好比咱們作一道算法題,每每就要先肯定數據結構,再根據這個數據結構去思考怎麼解題。spa
若是沒有數據結構的基礎知識,也就沒有談算法的意義了,不少時候即便你會使用一些封裝好的編程api,但你殊不知道其背後的實現原理,好比hashmap,linkedlist這些Java裏的集合類,實際上都是JDK封裝好的基礎數據結構。翻譯
我第一次接觸數據結構這門課仍是4年前,那這時候我在準備考研,專業課考的就是數據結構與算法,做爲一個非科班的小白,對這個東西能夠說是一竅不通。
這個時候的我只有一點點c語言的基礎,基本上能夠忽略不計,因此小白同窗也能夠按照這個思路進行學習。
數據結構基本上是考研的必考科目,因此我一開始使用的是考研的複習書籍,《天勤數據結構》和《王道數據結構》這兩個家的書都是專門爲計算機考研服務的,能夠直接百度,這兩本書對於我這種小白來講竟然都是能夠看懂的,因此,用來入門也是ok的。
最先的時候我並無直接看書,而是先打算先看視頻,由於視頻更好理解呀,找視頻的辦法就是百度,因而當時找到的最好資源就是《郝斌的數據結構》這個視頻應該是很早以前錄製的了,可是對於小白來講是夠用的,特別基礎,講的很仔細。
從最開始的數組、線性表,再講到棧和隊列,以及後面更復雜的二叉樹、圖、哈希表,大概有幾十個視頻,那個時候正值暑假,我按照天天一個視頻的進度看完了,看的時候還得時不時地實踐一下,更有助於理解。
看完了這個系列的視頻以後,我又轉戰開始啃書了,視頻裏講的都是數據結構的基礎,而書上除了基礎以外,還有一些算法題目,好比你學完了線性表和鏈表以後,書上就會有相關的算法題,好比數組的元素置換,鏈表的逆置等等,這些在往後看來很容易的題目,當時把我難哭了。
好在大部分題目是有講解的,看完講解以後還能安撫一下我受傷的心靈。
記住這本書,我在考研以前翻了至少有三四遍。
完成了第一波視頻+書籍的學習以後,咱們應該已經對數據結構有了初步的瞭解了,對一些簡單的數據結構算法也應該有所瞭解了,好比棧的入棧和出棧,隊列的進隊和出隊,二叉樹的先序遍歷和後續遍歷、層次遍歷,圖的最短路徑算法,深度優先遍歷等等。
有了必定的基礎以後,咱們須要對哪方面進行強化學習呢?
那就要看你學習數據結構的目的是什麼了,好比你學習數據結構是爲了能作算法題,那麼接下來你應該重點去學習算法方面的知識,後續咱們也將有一篇新的文章來說怎麼學習算法,敬請期待。
固然,我當時主要是複習考研,因此仍是針對專業課的歷年真題來複習,像咱們的卷子中就考察了不少關於哈希表、最短路徑算法、KMP算法、赫夫曼算法以及最短路徑算法的應用。
對於考卷上的一些知識點,我以爲掌握的並非很好,因而又買了《王道數據結構》以及一些並無什麼卵用的書回來看,再次強化了基礎。
而且,因爲咱們的複試一般會考察一些比較經典的算法問題,因此我又花了不少時間去學習這些算法題,這些題目並不是數據結構的基礎算法,因此在以前的書和視頻中可能找不到答案。
因而我又在網上搜到了另外一個系列視頻《小甲魚的數據結構視頻》裏面除了講解數據結構以外,還講解了更多經典的算法題,好比八皇后問題,漢諾塔問題,馬踏棋盤,旅行商問題等,這些問題對於新手來講真的是很頭大的,使用視頻學習確實效果更佳。
紙上得來終覺淺,絕知此事要躬行。
衆所周知,算法題和數學題同樣,須要多加練習,並且考研的時候必需要手寫算法,因而我就常常在紙上寫(抄)算法,你還別說,就算是抄,多抄幾回也有助於理解。
不少基礎的算法,好比層次遍歷,深度優先遍歷和廣度優先遍歷,多寫幾遍更有助理解,再好比稍微複雜一點的迪傑斯特拉算法,很少寫幾遍你可真記不住。
除了在紙上寫以外,更好的辦法天然是在電腦上敲了,寫Java的使用Java寫,寫C++ 的用C++ 寫,總之用本身擅長的語言實現就好,尷尬的是我當時只會c,因此就只好老老實實地用devc++寫簡單的c語言程序了。
至此,咱們也算是學會了數據結構的基礎知識了,至少知道每一個數據結構的特性,會寫常見的數據結構算法,甚至偶爾還能掏出一個八皇后出來。
《天勤數據結構》
《王道數據結構》
若是你要考研的話,這兩本書可不要錯過
嚴蔚敏《數據結構C語言版》
這本書是大學本科計算機專業經常使用的教科書,年代久遠,能夠看看,官方也有配套的教學視頻
《大話數據結構》
官方教材你們都懂的,比較不接地氣,這本書對於不少新手來講是更適合入門的書籍。
《數據結構與算法Java版》
若是你是學Java的,想有一本Java語言描述的數據結構書籍,能夠試試這本,可是這本書顯然比較複雜,不適合入門使用。
《郝斌數據結構》
這個視頻上文有提到過,年代比較久遠,可是入門足夠了。
《小甲魚數據結構與算法》
這個視頻比較新,更加全面,有不少關於經典算法的教程,做者也入駐了B站,有興趣也能夠到B站看他的視頻。
關於數據結構的學習,咱們就講到這裏了,若是還有什麼疑問也能夠到我公衆號裏找我探討,雖然咱們提到了算法,可是這裏只關注一些基礎的數據結構算法,後續會有關於「怎麼學算法「的文章推出,敬請期待。