抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

導讀

為什麼要學習數據結構?

數據結構是關於如何組織(存儲)數據的!編程實踐中經常涉及到組織(存儲)數據,所以要學習數據結構。

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

那麼為啥還要學習抽象數據類型(Abstract Data Type,ADT)呢?

ADT描述了數據集、指明瞭在數據集上可能執行的操作。ADT是一種規範,它和具體的編程語言無關。儘管Java API提供多種數據結構,但是如果遇到不適用的情形,就需要針對這種情形定義ADT,然後使用Java實現它。況且如果不深入全面地掌握數據結構這方面的知識,就無法理解和合理的使用Java API提供的數據結構。

數據結構和ADT是什麼關係呢?

ADT是一個規範,用於一組值以及對這組值執行的操作。而數據結構是使用編程語言對ADT的實現。

那麼如何描述ADT呢?

我們僅描述數據和操作,不指明如何保存數據以及如何實現操作,會考慮一些實現的細節,但與具體編程語言無關。

我們藉助UML以及對他們的說明來描述ADT。還可以使用偽代碼,不過UML足以說明問題。

設計ADT的步驟是什麼呢?

確定行為,然後指定數據和操作,並且考慮特殊情況。

ADT Sorted List(有序表)簡介

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

舉一個生活中的線性表和有序表的例子,體會一下它們的區別。

假如,你在列出一天要做的事,你拿出一張紙,然後將事情一件一件地寫下來,從紙的頂部寫起,如果這一天要完成的事情比較多,會寫滿這張紙,有可能還不夠。如果你認為這些事情沒有輕重緩急,先做哪一件都行,那麼這個列表就是線性表,如果你認為這些事情有的是先做不可的,而且你寫的過程中,認為列在上面的事情比下面的事情重要,但是你不可能一下子就將它們按照從上到下的順序列好,所以,一邊寫,一邊調整位置,最終完成了這個列表,那麼這時表就是有序表。

ADT Sorted List(有序表)的規格說明

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List


ADT Sorted List(有序表)操作細節闡述

關於前置條件:給定對象不能為null

因為有序表要對其中的對象進行排序,而null無法排序,除非人為規定null的比較規則。

無根據位置的插入操作

比較列表與有序表,發現沒有提供根據位置插入對象的方法。這是為什麼呢?

因為,指定插入位置,而我們事先不知道該插入哪個位置才不會破壞表的原有的有序性,這樣就無法保證有序性。

不能替換對象

同樣地,線性表的replace方法也不能用於有序表,替換行為無法保證表的有序性。

關於前置條件:給定的位置沒有超出列表的範圍

上述方法還給出前置條件為給定的位置沒有超出列表的範圍,那麼客戶在使用的時候,如果遇到給定位置超出列表範圍怎麼辦呢?一般來講,我們會拋出異常,來提示用戶,而不需要客戶主動驗證給定的位置是否超出列表範圍,當然,在實際的編程中,常常先確保給定的位置不會超出列表範圍,也就是說,異常是一種保護機制,防止意外發生,而不應用異常代替一般的檢驗邏輯。

關於前置條件:列表不為空

上述方法中處理add方法外,對於空列表來說,都是沒有意義的,那麼如何處理在空表上執行這些操作呢?

如果不給這些方法加一個前置條件:表不能為空,那麼執行上述操作對程序沒有危害,但是等於涉及到的指令再做無用功。一般來講,我們對這種情況不加提示,也不拋異常。

ADT Sorted List(有序表)轉換為接口

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List

抽象數據類型、數據結構、算法與Java語言:ADT Sorted List


分享到:


相關文章: