數據結構與離散數學

我用自己的理解來嘗試講一講“數據結構”與“離散數學”為什麼這麼重要。

01

什麼是“數據結構”?

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

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

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

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

相信大家都吃過飯吧?

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

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

數據結構與離散數學


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

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

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

數據結構為什麼重要?

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

大家都聽過區塊鏈吧?

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

數據結構與離散數學


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

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

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

這麼牛逼的項目,和數據結構的關係大不大?如果大家沒學過鏈表,是不是看起來有點迷糊?

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

數據結構與離散數學


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

03

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

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

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

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

04

數據結構怎麼學?

其實我在之前的文章中已經和大家推薦過學習方法。

首先你一定要會寫代碼,我學習過C和C++的數據結構,我個人認為熟悉C/C++的數據結構後,可以更好地理解計算機系統。畢竟C和C++比較難,學好了與它們相關的數據結構後,其實其他編程語言的數據結構都是大同小異,可以無壓力切換。

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


分享到:


相關文章: