數據結構究竟是什麼?為什麼你一定要學好數據結構?

sefd

作者 l 二胖 

來源 l 大數據前沿(公眾號ID:bigdataqianyan)

轉載請關注公眾號後留言聯繫授權

每次別人問我:「你覺得計算機專業課中哪門課是最重要的?」

我每次都會回答:「

數據結構

」。

可是為什麼呢?

我又講不出來。

近期臨近開學,又收到了不少同學的私信::

「沒學離散數學能學數據結構嗎?」

「不學數據結構能學Python嗎?」

「。。。」

後來想了想,其實大學生在大一到大二的時候普遍會有這樣的困惑,想提前學習一些知識,又不知道學啥,然後就查資料,查啊查,一天天過去了,啥也沒學。

所以,我就講一講「數據結構」究竟是什麼?為什麼這麼重要。

01

什麼是「數據結構」?

這裡我就不說那些「官方的定義」,簡單談談自己的理解吧。

數據結構是一種抽象的封裝。

好像還是有點繞腦,不過沒關係,我們繼續往下看。

說簡單點就是,把一堆基本的數據,按照某種順序給揉成一坨。

相信大家都見過做飯吧?

做一道菜需要放各種調料,如鹽、味精,還有肉等,把它們混在一起就做成了一道菜。

這裡以我最喜歡的口水雞為例,來講一講什麼是數據結構。下圖是百度百科中口水雞的做法。

好,下面我就用程序來表示一下,我寫的是偽碼,大家能懂就好哈。

先來抽象一下「口水雞」:

struct

口水雞 {
   雞肉 = []
   蔥 = []
   姜 = []
   麻醬 = []
   鹽 = []
   花椒 = []
   植物油 = []
}

對,上述這個結構體就是一個自定義的數據結構,

將很多種不同的東西融合在一起

;而計算機中的數據結構,則是把一些基本的數據類型,如int、double等融合成一些複雜的數據結構,如map、隊列。

抽象完口水雞再來抽象「你」吧:

class

你{        

float

體重 =

80

kg;        

int

年齡 =

20

;
   。。。
   此處省略一萬字
   。。。        

bool

eat (口水雞){
       口水雞.雞肉 -=

50

克;
       體重+=

50

克;
   }
}

然後再來抽象一下「廚師」:

class

廚師{
   口水雞 做菜(調料){
       口水雞 小雞 =

new

口水雞();
       小雞.append(

300

克雞肉);
       把鍋燒熱;
       加入調料;                

return

小雞;
   }
}

這裡的抽象有點隨意,不過大家理解就好,

我們把一堆很基本的元素抽象成了3個數據結構,這三個元素就是所謂的數據結構

而平時我們說的鏈表無非就是把一些基本元素和指針做了融合,樹、圖也是把指針和一些基本元素融合後再外加一些流程,如函數

比如python的dict,dict的key,value就是兩種相同或者不同的數據類型;dict還提供了一些函數,譬如get(),set()。dict就是一個典型的被封裝的數據結構。

所以我說數據結構是一種抽象的封裝,當然,數據結構並沒有我們舉的例子那樣簡單,但是原理是一樣的。

我們平時寫程序都是直接去調用這些數據結構,而沒有去想它們的內部實現是怎樣的。

數據結構這門課就是要告訴我們常見的數據結構是如何實現的,比如Vector,map的實現。

我們常常聽到的譬如平衡二叉樹,紅黑樹,大頂堆等辭彙就是出自數據結構這門課。具體了解數據結構後,我們就可以知道隊列的內部實現是什麼樣,詞典的內部實現又是什麼樣。

學習了數據結構以後,我們還可以針對某一場景去選擇某種數據結構,

比如隨機讀寫時我們會選擇數組,而經常插入刪除時我們會選擇鏈表

。也可以自己創建一些適合項目情景的數據結構,比如口水雞。

02

數據結構為什麼重要?

我認為數據結構之所以重要,是因為它是程序的根基,不說別的,我就舉個最近很火的例子。

大家都聽過區塊鏈吧?

二胖給大家畫個簡單的區塊鏈示意圖:

大家可以把每個區塊簡單地理解為一個struct,就像口水雞那樣把很多基礎類型放在一個結構體裡面。

巧了,這區塊鏈怎麼看起來那麼像鏈表?

其實它就是一個鏈表,只是在下一個鏈表中存入了上一個鏈表的hash值,如果上一個區塊有一點改變,它的hash值就會改變,就會和下一個鏈表中存入的hash值不匹配。那麼這個區塊就作假了,所以說區塊鏈具有不可篡改性和防偽性。

這麼牛逼的項目,和數據結構的關係大不大?

如果大家沒學過鏈表,是不是看起來有點迷糊?

再給大家舉一個例子,網路通信基礎協議:

IPv4協議。下圖是協議的報頭:

以前老聽別人說,協議、協議,報頭、報頭。其實學了數據結構你就會知道,所謂協議,就是通信雙方都需要安裝上圖所示的數據結構來收發數據。

數據結構說複雜也複雜,說簡單也簡單,反正不學是不行的。

03

沒學過離散數學能學數據結構嗎?

完全可以,其實只要會基本的代碼語法就可以學習數據結構,也沒有什麼必須遵循的學習次序

我相信大家之所以問這個問題,是因為大學的課程安排是離散數學先於數據結構。我上大學那會兒也是先學離散數學,再學數據結構,當時我也搞不明白它倆有什麼關係,不過我現在明白了。

其實離散數學和數據結構的關係並不是很大,但也不能說沒關係

。因為離散數學會講圖論、集合論,這些知識都是對數據結構的理論支持。但是兩者之間的關係遠未大到沒學離散數學就學不了數據結構的程度。順便多說一句,離散數學的數理邏輯、集合論、圖論等理論對演算法學習也很有幫助。

04

數據結構怎麼學?

首先你一定要會寫代碼,C/C++是目前計算機系學生必學的課程。在熟悉C/C++的數據結構後,大家可以更好地理解計算機系統。並且C和C++比較難,學好了與它們相關的數據結構後,其他編程語言的數據結構都是大同小異,可以無壓力切換。

當然,你要是不喜歡C/C++,那也沒必要非去學,畢竟搞懂它們要耗費的時間成本還比較大,其實直接學python的數據結構也不是不可以。

那麼,想學習數據結構有什麼好的課程推薦嗎?免費的?還是付費購買?

請大家相信,真正能讓你學到知識技能的精品課程,絕大部分是付費課程,但是這一次給大家推薦一個絕佳的學習福利。

七月在線【數據結構班】,原價99元,

限時0元免費報名

來自

BAT的

三大金牌講

』聯合授課,提供講師答疑、課程代碼和課件、還贈送免費書籍。

這是七月在線

最新的數據結構課程,將給學員詳細介紹數據結構原理,並配合

leetcode直播刷題

,讓你一舉窺探大牛講師的思考過程、coding過程,使學員對於各種牛逼的編程技巧一覽無餘。助力同學們打好基本功,在技術進階之路上走的更遠~

想學

【數據結構與演算法】

,請

掃碼關注公眾號

,回復:666,免費進群領取免單券。

本文來源:公眾號 @大數據前沿,作者二胖,一

個文章被知乎日報轉載n次,收藏量超過100k的原創作者。除了技術文章,公眾號還常常發表與職場、互聯網及生活有關的文章,歡迎關注。

今日學習推薦

【機器學習集訓營第六期】

三個月挑戰年薪四十萬

報名即送

《機器學習工程師 第八期》

《深度學習 第三期》

且組團還能優惠,

2人及2人以上組團報名

可各減500元

想組團者請加

微信客服:

julyedukefu_02

點擊「閱讀原文」

立即報名

看懂深度學習真的那麼難嗎?初中數學,就用10分鐘

面試常考:Python中的os模塊和sys模塊「文末送Python暢銷書」

一圖了解整個機器學習的核心知識體系(建議收藏)

kaggle大殺器之十大深度學習技巧,你了解多少?

深度學習難嗎?如果你連這25個概念都不知道,當然難!

45萬AI面經 |  面試offer拿不停,人稱「offer收割機」

【乾貨合集】關於支持向量機(SVM)的原理,你了解多少?(萬字長文 速收)

點擊「閱讀原文」,立即報名
推薦閱讀:

淺談數據監控&數據分析
今日數據行業日報(2016.10.17)
MATLAB 數據類型
如何成為一名合格的數據評估員
做方案時,設計師必用的大數據!

TAG:數據 | 數據結構 | 什麼 |