抽象數(shù)據(jù)類型確實(shí)有點(diǎn)抽象
本文轉(zhuǎn)載自微信公眾號(hào)「見賢思編程」,作者泰斗賢若如 。轉(zhuǎn)載本文請(qǐng)聯(lián)系見賢思編程公眾號(hào)。
抽象數(shù)據(jù)類型
抽象數(shù)據(jù)類型英文名叫( Abstract Data Type ),這里有兩個(gè)關(guān)鍵詞,一個(gè)叫“數(shù)據(jù)類型”,一個(gè)叫“抽象”,它們分別是什么意思呢?首先說什么是數(shù)據(jù)類型呢?
數(shù)據(jù)類型,它包含了兩個(gè)東西,一個(gè)是“數(shù)據(jù)對(duì)象集”,就是我們說的“是什么東西”,第二個(gè)是“數(shù)據(jù)集合相關(guān)聯(lián)的操作集”,就上我在上一篇中說的,我們不能單純講怎么去處理圖書,我們是要對(duì)這些圖書進(jìn)行操作的。
這兩件事情:圖書的擺放,對(duì)圖書的操作,是緊密結(jié)合在一起的。
這兩個(gè)東西在C語言里是獨(dú)立處理的,但是在一些面向?qū)ο蟮恼Z言里邊,比如C++、Java,你就會(huì)發(fā)現(xiàn),它們很好的為數(shù)據(jù)類型專門設(shè)計(jì)了一種機(jī)制,就是一個(gè)“類”,把這個(gè)數(shù)據(jù)集跟它相關(guān)的操作集封裝在一個(gè)類里面。
那再說什么是抽象呢?
抽象,抽象的意思就是“不具體”,就是說,描述數(shù)據(jù)類型的方法是不依賴于具體的實(shí)現(xiàn)的,對(duì)一個(gè)數(shù)據(jù)類型的描述,它跟
- 存放數(shù)據(jù)的機(jī)器無關(guān)
- 跟數(shù)據(jù)存儲(chǔ)的物理結(jié)構(gòu)無關(guān)
- 實(shí)現(xiàn)操作的算法和編程語言皆無關(guān)
總體來說,我們只描述數(shù)據(jù)對(duì)象集和相關(guān)的操作集"是什么",我們不關(guān)心“它是怎么做到的”這個(gè)問題。
可能到現(xiàn)在一些沒有基礎(chǔ)的朋友看起來還是很抽象,沒關(guān)系,我再舉個(gè)例子,可能幫助你更好的理解抽象數(shù)據(jù)類型到底是個(gè)什么東西,這個(gè)例子是關(guān)于“矩陣”的抽象數(shù)據(jù)類型的定義。
圖片首先我們要給這個(gè)抽象數(shù)據(jù)類型一個(gè)名稱叫“矩陣”,然后我們要描述一下它的數(shù)據(jù)對(duì)象集,一個(gè) NM 的矩陣,是由 NM 個(gè)矩陣的元素構(gòu)成的,我們把這個(gè)元素描述成一個(gè)三元組 a , i , j ,其中 a 是這個(gè)矩陣元素的值,同時(shí)我們還需要知道這個(gè)矩陣元素在矩陣?yán)锩嫠幍奈恢?,就是它的行?hào) i 和列號(hào) j ,就這樣描述了一個(gè)數(shù)據(jù)的對(duì)象集,相關(guān)聯(lián)的操作集有很多很多(如下圖)
我們來看一下,為什么這個(gè)就叫做“抽象”的表示呢?
首先我們來看,在描述數(shù)據(jù)對(duì)象集的時(shí)候,說a是矩陣元素的值,那這個(gè)值是float?還是double?還是int?我們?cè)谶@個(gè)抽象數(shù)據(jù)類型中描述是不關(guān)心的。
相應(yīng)地,當(dāng)需要對(duì)它的元素值進(jìn)行操作的時(shí)候,我們返回的也是ElementType,是一個(gè)通用的元素類型,我在實(shí)現(xiàn)這個(gè)矩陣相關(guān)的所有函數(shù)的時(shí)候,我在頭上寫一個(gè)define,你需要什么,我就把它define(定義)成什么樣子。
這樣的話,你實(shí)現(xiàn)的這些函數(shù)是跟“你那個(gè)矩陣元素到底是哪種類型”是沒有關(guān)系的,哪種類型都是可以運(yùn)算的。
這就避免了你對(duì)int實(shí)現(xiàn)了一遍,下一次矩陣變成 double 類型的,結(jié)果你又對(duì) double ……難道重新寫一遍嗎?當(dāng)然你說我可以直接用一個(gè) replace (替換),我把所有的int替換成 double 。
呃……這個(gè)你要注意,有些地方的int真的就是 int ,你不能換成 double ,所以可能會(huì)出錯(cuò),總的來說呢,就是如果你自己一個(gè)一個(gè)地去替換這個(gè)元素的類型的話,會(huì)很麻煩,而抽象一下就是有這個(gè)好處,這是一個(gè)好處。
另外一個(gè)呢,像這個(gè)矩陣,我們只是說這是一個(gè) M*N 的矩陣,至于在程序里面它是怎樣一個(gè)存法?我們是用二維數(shù)組去存它 ?還是一維數(shù)組 ?還是用鏈表 ?這個(gè)我們?cè)诔橄髷?shù)據(jù)類型定義的時(shí)候,都是不關(guān)心的。
我不管它是怎么實(shí)現(xiàn)的,我只是說:我要實(shí)現(xiàn)的是一個(gè)矩陣 。再比如說上面圖片中的 Add() 函數(shù) ,如果它們可以相加的話,我要返回它們的和,那我可沒說,在我算這個(gè)矩陣加法的時(shí)候,到底是先按行加呢 ?還是先按列加呢 ?我到底是用什么語言去實(shí)現(xiàn)這個(gè)函數(shù)呢 ?統(tǒng)統(tǒng)不管,這就是所謂的抽象。
此篇完
到這抽象數(shù)據(jù)類型就說完了,其實(shí)這一篇就是對(duì)數(shù)據(jù)結(jié)構(gòu)的另一種描述,我想看到這的話朋友們應(yīng)該對(duì)數(shù)據(jù)結(jié)構(gòu)有個(gè)清晰的認(rèn)識(shí)了吧。




























