1. 程式人生 > >資料結構究竟是什麼?為什麼你一定要學好資料結構?

資料結構究竟是什麼?為什麼你一定要學好資料結構?

640?wx_fmt=gif640?wx_fmt=png

sefd

640?wx_fmt=jpeg

作者 l 二胖 

來源 l 大資料前沿(公眾號ID:bigdataqianyan)

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

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

我每次都會回答:“資料結構”。

可是為什麼呢?

我又講不出來。

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

“沒學離散數學能學資料結構嗎?”

“不學資料結構能學Python嗎?”

“。。。”

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

所以,我就講一講“資料結構”究竟是什麼?為什麼這麼重要。

01

什麼是“資料結構”?

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

資料結構是一種抽象的封裝。

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

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

相信大家都見過做飯吧?

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

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

640?wx_fmt=jpeg

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

先來抽象一下“口水雞”:

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

對,上述這個結構體就是一個自定義的資料結構,將很多種不同的東西融合在一起

;而計算機中的資料結構,則是把一些基本的資料型別,如int、double等融合成一些複雜的資料結構,如map、佇列。

抽象完口水雞再來抽象“你”吧:

class 你{    
   float 體重 = 80kg;    
   int 年齡 = 20;    。。。    此處省略一萬字    。。。    
   bool eat (口水雞){        口水雞.雞肉 -=50克;        體重+=50克;    } }

然後再來抽象一下“廚師”:

class 廚師{    口水雞 做菜(調料){        口水雞 小雞 = new 口水雞();        小雞.append(300

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

這裡的抽象有點隨意,不過大家理解就好,我們把一堆很基本的元素抽象成了3個數據結構,這三個元素就是所謂的資料結構

而平時我們說的連結串列無非就是把一些基本元素和指標做了融合,樹、圖也是把指標和一些基本元素融合後再外加一些流程,如函式

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

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

我們平時寫程式都是直接去呼叫這些資料結構,而沒有去想它們的內部實現是怎樣的。資料結構這門課就是要告訴我們常見的資料結構是如何實現的,比如Vector,map的實現。我們常常聽到的譬如平衡二叉樹,紅黑樹,大頂堆等詞彙就是出自資料結構這門課。具體瞭解資料結構後,我們就可以知道佇列的內部實現是什麼樣,詞典的內部實現又是什麼樣。

學習了資料結構以後,我們還可以針對某一場景去選擇某種資料結構,比如隨機讀寫時我們會選擇陣列,而經常插入刪除時我們會選擇連結串列。也可以自己建立一些適合專案情景的資料結構,比如口水雞。

02

資料結構為什麼重要?

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

大家都聽過區塊鏈吧?

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

640?wx_fmt=jpeg

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

巧了,這區塊鏈怎麼看起來那麼像連結串列?

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

這麼牛逼的專案,和資料結構的關係大不大?如果大家沒學過連結串列,是不是看起來有點迷糊?

再給大家舉一個例子,網路通訊基礎協議:IPv4協議。下圖是協議的報頭:

640?wx_fmt=jpeg

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

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

03

沒學過離散數學能學資料結構嗎?

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

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

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

04

資料結構怎麼學?

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

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

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

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

七月線上【資料結構班】,原價99元,限時0元免費報名來自BAT的三大金牌講』聯合授課,提供講師答疑、課程程式碼和課件、還贈送免費書籍。

這是七月線上最新的資料結構課程,將給學員詳細介紹資料結構原理,並配合leetcode直播刷題,讓你一舉窺探大牛講師的思考過程、coding過程,使學員對於各種牛逼的程式設計技巧一覽無餘。助力同學們打好基本功,在技術進階之路上走的更遠~

想學【資料結構與演算法】,請掃碼關注公眾號,回覆:666,免費進群領取免單券。

640?wx_fmt=png

本文來源:公眾號 @大資料前沿,作者二胖,一個文章被知乎日報轉載n次,收藏量超過100k的原創作者。除了技術文章,公眾號還常常發表與職場、網際網路及生活有關的文章,歡迎關注。

今日學習推薦

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

三個月挑戰年薪四十萬

報名即送

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

且組團還能優惠,2人及2人以上組團報名

可各減500元

想組團者請加

微信客服:julyedukefu_02

點選“閱讀原文”立即報名

640?wx_fmt=gif

640?wx_fmt=gif點選“閱讀原文”,立即報名