抽象數據類型:簡單來講就是 數據元素(不僅限於一般的數據元素)+對其的操作(不太嚴謹但有助於理解)
抽象數據類型是描述數據結構的一種理論工具。在介紹抽象數據類型之前我們先介紹一下數據類型的基本概念。
數據類型(data type)是一組性質相同的數據元素的集合以及加在這個集合上的一組操作。例如Java 語言中就有許多不同的數據類型,包括數值型的數據類型、字符串、布爾型
等數據類型。以Java 中的int 型為例,int 型的數據元素的集合是[-2147483648,2147483647]間的整數,定義在其上的操作有加、減、乘、除四則運算,還有模運算等。
定義數據類型的作用一個是隱藏計算機硬件及其特性和差別,使硬件對於用戶而言是透明的,即用戶可以不關心數據類型是怎么實現的而可以使用它。定義數據類型的另一個作用
是,用戶能夠使用數據類型定義的操作,方便的實現問題的求解。例如,用戶可以使用Java定義在int 型的加法操作完成兩個整數的加法運算,而不用關心兩個整數的加法在計算機中到底是如何實現的。這樣不但加快了用戶解決問題的速度,也使得用戶可以在更高的層面上考慮問題。
對於一個明確的問題,要解答這個問題,總是先選用該問題的一個數據模型。接着,弄清該問題所選用的數據模型在已知條件下的初始狀態和要求的結果狀態,以及隱含着的兩個狀態之間的關系。然后探索從數據模型的已知初始狀態出發到達要求的結果狀態所必需的運算步驟。我們在探索運算步驟時,首先應該考慮頂層的運算步驟,然后再考慮底層的運算步驟。所謂頂層的運算步驟是指定義在數據模型級上的運算步驟,或叫宏觀運算。它們組成解答問題步驟的主干部分。其中涉及的數據是數據模型中的一個變量,暫時不關心它的數據結構;涉及的運算以數據模型中的數據變量作為運算對象,或作為運算結果,或二者兼而為之,簡稱為定義在數據模型上的運算。由於暫時不關心變量的數據結構,這些運算都帶有抽象性質,不含運算的細節。所謂底層的運算步驟是指頂層抽象的運算的具體實現。它們依賴於數據模型的結構,依賴於數據模型結構的具體表示。因此,底層的運算步驟包括兩部分:一是數據模型的具體表示;二是定義在該數據模型上的運算的具體實現。我們可以把它們理解為微觀運算。於是,底層運算是頂層運算的細化,底層運算為頂層運算服務。為了將頂層算法與底層算法隔開,使二者在設計時不會互相牽制、互相影響,必須對二者的接口進行一次抽象。讓底層只通過這個接口為頂層服務,頂層也只通過這個接口調用底層的運算。這個接口就是抽象數據類型。
抽象數據類型(abstract data type, 簡稱ADT)由一種數據模型和在該數據模型上的一組操作組成。
抽象數據類型包括定義和實現兩個方面,其中定義是獨立於實現的。抽象數據類型的定義僅取決於它的邏輯特性,而與其在計算機內部的實現無關,即無論它的內部結構如何變化,只要它的邏輯特性不變,都不會影響到它的使用。其內部的變化(抽象數據類型實現的變化)只是可能會對外部在使用它解決問題時的效率上產生影響,因此我們的一個重要任務就是如何簡單、高效地實現抽象數據類型。很明顯,對於不同的運算組,為使組中所有運算的效率都盡可能地高,其相應的數據模型具體表示的選擇將是不同的。在這個意義下,數據模型的具體表示又依賴於數據模型上定義的那些運算。特別是,當不同運算的效率互相制約時,還必須事先將所有的運算的相應使用頻度排序,讓所選擇的數據模型的具體表示優先保證使用頻度較高的運算有較高的效率。
我們應該看到,抽象數據類型的概念並不是全新的概念。抽象數據類型和數據類型在實質上是一個概念,只不過是對數據類型的進一步抽象,不僅限於各種不同的計算機處理器中
已經實現的數據類型,還包括為解決更為復雜的問題而由用戶自定義的復雜數據類型。例如高級語言都有的"整數"類型就是一種抽象數據類型,只不過高級語言中的整型引進實現了,並且實現的細節可能不同而已。我們沒有意識到抽象數據類型的概念已經孕育在基本數據類型的概念之中,是因為我們已經習慣於在程序設計中使用基本數據類型和相關的運算,沒有進一步深究而已。
抽象數據類型一方面使得使用它的人可以只關心它的邏輯特征,不需要了解它的實現方式。另一方面可以使我們更容易描述現實世界,使得我們可以在更高的層面上來考慮問題。
例如可以使用樹來描述行政區划,使用圖來描述通信網絡。根據抽象數據類型的概念,對抽象數據類型進行定義就是約定抽象數據類型的名字,同時,約定在該類型上定義的一組運算的各個運算的名字,明確各個運算分別要有多少個參數,這些參數的含義和順序,以及運算的功能。一旦定義清楚,人們在使用時就可以像引用基本數據類型那樣,十分簡便地引用抽象數據類型;同時,抽象數據類型的實現就有了設計的依據和目標。抽象數據類型的使用和實現都與抽象數據類型的定義打交道,這樣使用與實現沒有直接的聯系。因此,只要嚴格按照定義,抽象數據類型的使用和實現就可以互相獨立,互不影響,實現對它們的隔離,達到抽象的目的。
為此抽象數據類型可以使用一個三元組來表示:
ADT = (D, S, P)
其中D 是數據對象,S 是D 上的關系集,P 是加在D 上的一組操作。
在定義抽象數據類型時,我們使用以下格式:
ADT 抽象數據類型名{
數據對象:<數據對象的定義>
數據關系:<數據關系的定義>
基本操作:<基本操作的定義>
}