做了幾年程序員,某天居然發現自己沒學過數據結構。。。

原創聲明

本文作者:黃小斜

轉載請務必在文章開頭註明出處和作者。

簡介

學習編程,數據結構是你必須要掌握的基礎知識,那麼數據結構到底是什麼呢?

根據百度百科的介紹,數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。

聽聽這是人話麼,我幫你們翻譯一下,其實數據結構就是用來描述計算機裏存儲數據的一種數學模型,因爲計算機裏要存儲很多亂七八糟的數據,所以也需要不同的數據結構來描述。

本文思維導圖

在這裏插入圖片描述

爲什麼要學數據結構

瞭解了基本概念之後,接下來我們再來看看,爲什麼我們要學習數據結構呢?

在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗表明,系統實現的困難程度和系統構造的質量都嚴重的依賴於是否選擇了最優的數據結構。

許多時候,確定了數據結構後,算法就容易得到了。有些時候事情也會反過來,我們根據特定算法來選擇數據結構與之適應。不論哪種情況,選擇合適的數據結構都是非常重要的。

選擇了數據結構,算法也隨之確定,是數據而不是算法是系統構造的關鍵因素。這種洞見導致了許多種軟件設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。

也就是說,選定數據結構往往是解決問題的核心,比如我們做一道算法題,往往就要先確定數據結構,再根據這個數據結構去思考怎麼解題。

如果沒有數據結構的基礎知識,也就沒有談算法的意義了,很多時候即使你會使用一些封裝好的編程api,但你卻不知道其背後的實現原理,比如hashmap,linkedlist這些Java裏的集合類,實際上都是JDK封裝好的基礎數據結構。

如何學習數據結構

第一次接觸

我第一次接觸數據結構這門課還是4年前,那這時候我在準備考研,專業課考的就是數據結構與算法,作爲一個非科班的小白,對這個東西可以說是一竅不通。

這個時候的我只有一點點c語言的基礎,基本上可以忽略不計,所以小白同學也可以按照這個思路進行學習。

數據結構基本上是考研的必考科目,所以我一開始使用的是考研的複習書籍,《天勤數據結構》和《王道數據結構》這兩個家的書都是專門爲計算機考研服務的,可以直接百度,這兩本書對於我這種小白來說居然都是可以看懂的,所以,用來入門也是ok的。

入門學習階段

最早的時候我並沒有直接看書,而是先打算先看視頻,因爲視頻更好理解呀,找視頻的辦法就是百度,於是當時找到的最好資源就是《郝斌的數據結構》這個視頻應該是很早之前錄製的了,但是對於小白來說是夠用的,特別基礎,講的很仔細。

從最開始的數組、線性表,再講到棧和隊列,以及後面更復雜的二叉樹、圖、哈希表,大概有幾十個視頻,那個時候正值暑假,我按照每天一個視頻的進度看完了,看的時候還得時不時地實踐一下,更有助於理解。

看完了這個系列的視頻之後,我又轉戰開始啃書了,視頻裏講的都是數據結構的基礎,而書上除了基礎之外,還有一些算法題目,比如你學完了線性表和鏈表之後,書上就會有相關的算法題,比如數組的元素置換,鏈表的逆置等等,這些在日後看來很容易的題目,當時把我難哭了。

好在大部分題目是有講解的,看完講解之後還能安撫一下我受傷的心靈。記住這本書,我在考研之前翻了至少有三四遍。

強化學習階段

完成了第一波視頻+書籍的學習之後,我們應該已經對數據結構有了初步的瞭解了,對一些簡單的數據結構算法也應該有所瞭解了,比如棧的入棧和出棧,隊列的進隊和出隊,二叉樹的先序遍歷和後續遍歷、層次遍歷,圖的最短路徑算法,深度優先遍歷等等。

有了一定的基礎之後,我們需要對哪方面進行強化學習呢?

那就要看你學習數據結構的目的是什麼了,比如你學習數據結構是爲了能做算法題,那麼接下來你應該重點去學習算法方面的知識,後續我們也將有一篇新的文章來講怎麼學習算法,敬請期待。

當然,我當時主要是複習考研,所以還是針對專業課的歷年真題來複習,像我們的卷子中就考察了很多關於哈希表、最短路徑算法、KMP算法、赫夫曼算法以及最短路徑算法的應用。

對於考卷上的一些知識點,我覺得掌握的並不是很好,於是又買了《王道數據結構》以及一些並沒有什麼卵用的書回來看,再次強化了基礎。

並且,由於我們的複試通常會考察一些比較經典的算法問題,所以我又花了很多時間去學習這些算法題,這些題目並非數據結構的基礎算法,所以在之前的書和視頻中可能找不到答案。

於是我又在網上搜到了另一個系列視頻《小甲魚的數據結構視頻》裏面除了講解數據結構之外,還講解了更多經典的算法題,比如八皇后問題,漢諾塔問題,馬踏棋盤,旅行商問題等,這些問題對於新手來說真的是很頭大的,使用視頻學習確實效果更佳。

實踐階段

紙上得來終覺淺,絕知此事要躬行。衆所周知,算法題和數學題一樣,需要多加練習,而且考研的時候必須要手寫算法,於是我就經常在紙上寫(抄)算法,你還別說,就算是抄,多抄幾次也有助於理解。

很多基礎的算法,比如層次遍歷,深度優先遍歷和廣度優先遍歷,多寫幾遍更有助理解,再比如稍微複雜一點的迪傑斯特拉算法,不多寫幾遍你可真記不住。

除了在紙上寫之外,更好的辦法自然是在電腦上敲了,寫Java的使用Java寫,寫C++ 的用C++ 寫,總之用自己擅長的語言實現就好,尷尬的是我當時只會c,所以就只好老老實實地用devc++寫簡單的c語言程序了。

至此,我們也算是學會了數據結構的基礎知識了,至少知道每個數據結構的特性,會寫常見的數據結構算法,甚至偶爾還能掏出一個八皇后出來。

推薦資源

書籍

《天勤數據結構》《王道數據結構》如果你要考研的話,這兩本書可不要錯過

嚴蔚敏《數據結構C語言版》這本書是大學本科計算機專業常用的教科書,年代久遠,可以看看,官方也有配套的教學視頻

《大話數據結構》官方教材大家都懂的,比較不接地氣,這本書對於很多新手來說是更適合入門的書籍。

《數據結構與算法Java版》如果你是學Java的,想有一本Java語言描述的數據結構書籍,可以試試這本,但是這本書顯然比較複雜,不適合入門使用。

視頻

《郝斌數據結構》這個視頻上文有提到過,年代比較久遠,但是入門足夠了。

《小甲魚數據結構與算法》這個視頻比較新,更加全面,有很多關於經典算法的教程,作者也入駐了B站,有興趣也可以到B站看他的視頻。

總結

關於數據結構的學習,我們就講到這裏了,如果還有什麼疑問也可以到我公衆號裏找我探討,雖然我們提到了算法,但是這裏只關注一些基礎的數據結構算法,後續會有關於“怎麼學算法“的文章推出,敬請期待。

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