標籤:java
抽象資料類型
抽象資料類型是描述資料結構的一種理論工具。在介紹抽象資料類型之前我們先介紹一
下資料類型的基本概念。
資料類型(data type)是一組性質相同的資料元素的集合以及加在這個集合上的一組操
作。例如Java 語言中就有許多不同的資料類型,包括數值型的資料類型、字串、布爾型
等資料類型。以Java 中的int 型為例,int 型的資料元素的集合是[-2147483648,2147483647]
間的整數,定義在其上的操作有加、減、乘、除四則運算,還有模運算等。
定義資料類型的作用一個是隱藏電腦硬體及其特性和差別,使硬體對於使用者而言是透
明的,即使用者可以不關心資料類型是怎麼實現的而可以使用它。定義資料類型的另一個作用
是,使用者能夠使用資料類型定義的操作,方便的實現問題的求解。例如,使用者可以使用Java
定義在int 型的加法操作完成兩個整數的加法運算,而不用關心兩個整數的加法在電腦中
到底是如何?的。這樣不但加快了使用者解決問題的速度,也使得使用者可以在更高的層面上
考慮問題。
與機器語言、組合語言相比,進階語言的出現大大地簡便了程式設計。但是要將解答問
題的步驟從非形式的自然語言表達到形式化的進階語言表達,仍然是一個複雜的過程,仍然
要做很多繁雜瑣碎的事情,因而仍然需要抽象。
對於一個明確的問題,要解答這個問題,總是先選用該問題的一個資料模型。接著,弄清
該問題所選用的資料模型在已知條件下的初始狀態和要求的結果狀態,以及隱含著的兩個狀
態之間的關係。然後探索從資料模型的已知初始狀態出發到達要求的結果狀態所必需的運算
步驟。
我們在探索運算步驟時,首先應該考慮頂層的運算步驟,然後再考慮底層的運算步驟。
所謂頂層的運算步驟是指定義在資料模型級上的運算步驟,或叫宏觀運算。它們組成解答問
題步驟的主幹部分。其中涉及的資料是資料模型中的一個變數,暫時不關心它的資料結構;
涉及的運算以資料模型中的資料變數作為運算對象,或作為運算結果,或二者兼而為之,簡
稱為定義在資料模型上的運算。由於暫時不關心變數的資料結構,這些運算都帶有抽象性質,
不含運算的細節。所謂底層的運算步驟是指頂層抽象的運算的具體實現。它們依賴於資料模
型的結構,依賴於資料模型結構的具體表示。因此,底層的運算步驟包括兩部分:一是資料
模型的具體表示;二是定義在該資料模型上的運算的具體實現。我們可以把它們理解為微觀
運算。於是,底層運算是頂層運算的細化,底層運算為頂層運算服務。為了將頂層演算法與底
層演算法隔開,使二者在設計時不會互相牽制、互相影響,必須對二者的介面進行一次抽象。
讓底層只通過這個介面為頂層服務,頂層也只通過這個介面調用底層的運算。這個介面就是
抽象資料類型。
抽象資料類型(abstract data type, 簡稱ADT)由一種資料模型和在該資料模型上的一
組操作組成。
抽象資料類型包括定義和實現兩個方面,其中定義是獨立於實現的。抽象資料類型的定
義僅取決於它的邏輯特性,而與其在電腦內部的實現無關,即無論它的內部結構如何變化,
只要它的邏輯特性不變,都不會影響到它的使用。其內部的變化(抽象資料類型實現的變化)
只是可能會對外部在使用它解決問題時的效率上產生影響,因此我們的一個重要任務就是如
何簡單、高效地實現抽象資料類型。很明顯,對於不同的運算組,為使組中所有運算的效率
都儘可能地高,其相應的資料模型具體表示的選擇將是不同的。在這個意義下,資料模型的
具體表示又依賴於資料模型上定義的那些運算。特別是,當不同運算的效率互相制約時,還
必須事先將所有的運算的相應使用頻度排序,讓所選擇的資料模型的具體表示優先保證使用
頻度較高的運算有較高的效率。
我們應該看到,抽象資料類型的概念並不是全新的概念。抽象資料類型和資料類型在實
質上是一個概念,只不過是對資料類型的進一步抽象,不僅限於各種不同的電腦處理器中
已經實現的資料類型,還包括為解決更為複雜的問題而由使用者自訂的複雜資料類型。例如
進階語言都有的“整數”類型就是一種抽象資料類型,只不過進階語言中的整型引進實現了,
並且實現的細節可能不同而已。我們沒有意識到抽象資料類型的概念已經孕育在基本資料類
型的概念之中,是因為我們已經習慣於在程式設計中使用基礎資料型別 (Elementary Data Type)和相關的運算,沒有
進一步深究而已。
抽象資料類型一方面使得使用它的人可以只關心它的邏輯特徵,不需要瞭解它的實現方
式。另一方面可以使我們更容易描述現實世界,使得我們可以在更高的層面上來考慮問題。
例如可以使用樹來描述行政區劃,使用圖來描述通訊網路。
根據抽象資料類型的概念,對抽象資料類型進行定義就是約定抽象資料類型的名字,同
時,約定在該類型上定義的一組運算的各個運算的名字,明確各個運算分別要 有多少個參
數,這些參數的含義和順序,以及運算的功能。一旦定義清楚,人們在使用時就可以像引用
基礎資料型別 (Elementary Data Type)那樣,十分簡便地引用抽象資料類型;同時,抽象資料類型的實現就有了設計
的依據和目標。抽象資料類型的使用和實現都與抽象資料類型的定義打交道,這樣使用與實
現沒有直接的聯絡。因此,只要嚴格按照定義,抽象資料類型的使用和實現就可以互相獨立,
互不影響,實現對它們的隔離,達到抽象的目的。
為此抽象資料類型可以使用一個三元組來表示:
ADT = (D, S, P)
其中D 是資料對象,S 是D 上的關係集,P 是加在D 上的一組操作。
在定義抽象資料類型時,我們使用以下格式:
ADT 抽象資料類型名{
資料對象:<資料對象的定義>
資料關係:<資料關係的定義>
基本操作:<基本操作的定義>
}
更多精彩內容請關註:http://bbs.superwu.cn
關注超人學院二維碼:650) this.width=650;" src="http://static.oschina.net/uploads/space/2015/0528/161340_vvPq_2273204.jpg" alt="161340_vvPq_2273204.jpg" />
關注超人學院java免費學習交流群:650) this.width=650;" src="http://static.oschina.net/uploads/space/2015/0528/161340_wCEy_2273204.png" alt="161340_wCEy_2273204.png" />
java抽象資料類型