1. 程式人生 > >圖例為你講解抽象資料型別——我用心寫,您用心“品”

圖例為你講解抽象資料型別——我用心寫,您用心“品”

【二】、什麼是抽象資料型別

前言

在上一篇【什麼是資料結構】中我詳細介紹了我對資料結構的理解,其實描述資料結構,有一個很好的方法叫抽象資料型別。下面我會詳細介紹抽象資料型別。

抽象資料型別

抽象資料型別英文名叫(Abstract Data Type),這裡有兩個關鍵詞,一個叫“資料型別”,一個叫“抽象”,它們分別是什麼意思呢?首先說什麼是資料型別呢?

資料型別,它包含了兩個東西,一個是“資料物件集”,就是我們說的“是什麼東西”,第二個是“資料集合相關聯的操作集”,就上我在上一篇中說的,我們不能單純講怎麼去處理圖書,我們是要對這些圖書進行操作的,這兩件事情:圖書的擺放,對圖書的操作,是緊密結合在一起的。這兩個東西在C語言裡是獨立處理的,但是在一些面向物件的語言裡邊,比如C++、Java,你就會發現,它們很好的為資料型別專門設計了一種機制,就是一個“類”,把這個資料集跟它相關的操作集封裝在一個類裡面。

那再說什麼是抽象呢?

抽象,抽象的意思就是“不具體”,就是說,描述資料型別的方法是不依賴於具體的實現的,對一個數據型別的描述,它跟

  • 存放資料的機器無關
  • 跟資料儲存的物理結構無關
  • 實現操作的演算法和程式語言皆無關

總體來說,我們只描述資料物件集和相關的操作集"是什麼",我們不關心“它是怎麼做到的”這個問題。可能到現在一些沒有基礎的朋友看起來還是很抽象,沒關係,我再舉個例子,可能幫助你更好的理解抽象資料型別到底是個什麼東西,這個例子是關於“矩陣”的抽象資料型別的定義。


首先我們要給這個抽象資料型別一個名稱叫“矩陣”,然後我們要描述一下它的資料物件集,一個NM的矩陣,是由N

M個矩陣的元素構成的,我們把這個元素描述成一個三元組a,i,j,其中a是這個矩陣元素的值,同時我們還需要知道這個矩陣元素在矩陣裡面所處的位置,就是它的行號i和列號j,就這樣描述了一個數據的物件集,相關聯的操作集有很多很多(如下圖)

我們來看一下,為什麼這個就叫做“抽象”的表示呢?首先我們來看,在描述資料物件集的時候,說a是矩陣元素的值,那這個值是float?還是double?還是int?我們在這個抽象資料型別中描述是不關心的,相應地,當需要對它的元素值進行操作的時候,我們返回的也是ElementType,是一個通用的元素型別,我在實現這個矩陣相關的所有函式的時候,我在頭上寫一個define,你需要什麼,我就把它define(定義)成什麼樣子,這樣的話,你實現的這些函式是跟“你那個矩陣元素到底是哪種型別”是沒有關係的,哪種型別都是可以運算的。這就避免了你對int實現了一遍,下一次矩陣變成double型別的,結果你又對double……難道重新寫一遍嗎?當然你說我可以直接用一個replace(替換),我把所有的int替換成double,呃……這個你要注意,有些地方的int真的就是int,你不能換成double,所以可能會出錯,總的來說呢,就是如果你自己一個一個地去替換這個元素的型別的話,會很麻煩,而抽象一下就是有這個好處,這是一個好處。另外一個呢,像這個矩陣,我們只是說這是一個M*N的矩陣,至於在程式裡面它是怎樣一個存法?我們是用二維陣列去存它?還是一維陣列?還是用連結串列?這個我們在抽象資料型別定義的時候,都是不關心的。我不管它是怎麼實現的,我只是說:我要實現的是一個矩陣。再比如說上面圖片中的Add()函式,如果它們可以相加的話,我要返回它們的和,那我可沒說,在我算這個矩陣加法的時候,到底是先按行加呢?還是先按列加呢?我到底是用什麼語言去實現這個函式呢?統統不管,這就是所謂的抽象。

 

此篇完

到這抽象資料型別就說完了,其實這一篇就是對資料結構的另一種描述,我想看到這的話朋友們應該對資料結構有個清晰的認識了吧。提前做個預告,下篇就開始說演算法了,跟之前一樣,我會清清楚楚描述,明明白白表達,我相信我的認真配得上您的關注。

 【原創宣告】:本人原創:https://www.cnblogs.com/zyx