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

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

導讀

為什麼要學習數據結構?

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

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

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

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

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

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

那麼如何描述ADT呢?

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

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

設計ADT的步驟是什麼呢?

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

ADT Heap(堆)簡介

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

ADT Heap是什麼呢?Heap直譯成中文就是堆。我們長說,一堆人,一堆蘋果,還有就像圖中顯示的那樣,一堆石頭。

ADT Heap與生活中的這些物品不像,生活中這些東西大多都是雜亂無章的放在一起的,但ADT Heap不是,他有由結構的,而且可以說是刻意使之成為這樣。

ADT Heap是一棵特殊的樹,因為他是完全二叉樹,而且是一種特殊的完全二叉樹,為什麼這樣說呢?因為他具有下面的性質:

  • 每個節點不小於(或不大於)其後代節點。
  • 如果節點不小於其後代節點,那麼我們稱這種類型的堆為最大堆
  • 如果節點不大於其後代節點,那麼我們稱這種類型的堆為最小堆。
  • 最大堆的子樹仍然是最大堆,最小堆的子樹仍然是最小堆。

ADT Heap(堆)的規格說明

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

ADT Heap(堆)操作細節闡述

這裡不認為對象為null或者堆為空是前置條件,如果根據你的實際需要可以認為這是前置條件。

實現ADT Heap時,一般會區分最大堆和最小堆,並且分別實現他們。

+peekTop():T

如果堆是最大堆,那麼此方法獲得的是堆中最大的對象。如果堆是最小堆,那麼此方法獲得的是最小對象。

同樣地+remove():T獲得的是堆的根,那麼對於最大堆而言,將獲得堆中最大的對象,對最小堆而言則相反。

ADT Heap(堆)轉換為接口

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

內容少一點,概念比較抽象,讀個笑話放鬆一下(笑話來自於網絡,據說只有程序員能看懂):

據說有一位軟件工程師,一位硬件工程師和一位項目經理同坐車參加研討會。不幸在從盤山公路下山時車壞在半路上了。於是兩位工程師和一位經理就如何修車的問題展開了討論。

硬件工程師說:“我可以用隨身攜帶的瑞士軍刀把車壞的部分拆下來,找出原因,排除故障。”

項目經理說:“根據經營管理學,應該召開會議,根據問題現狀寫出需求報告,制訂計劃,編寫日程安排,逐步逼近,alpha測試,beta1測試和beta2測試解決問題。”

軟件工程說:“咱們還是應該把車推回山頂再開下來,看看問題是否重現。”


分享到:


相關文章: