20172324 2018-2019-1 《程式設計與資料結構》第八週學習總結
阿新 • • 發佈:2018-11-10
20172324 2018-2019-1 《程式設計與資料結構》第八週學習總結
教材學習內容總結
堆
- 具有兩個附加屬性的二叉樹:
- 是一顆完全樹
- 對每一結點,它小於或等於其左孩子和右孩子(最小堆)
- 最大堆的結點大於或等於它的左右孩子
- 最小堆將其最小元素儲存在該二叉樹的根處,其根的兩個孩子同樣也是最小堆
操作 | 說明 |
---|---|
addElement | 將給定元素新增到該堆中 |
removeMin | 刪除堆的最小元素 |
findMin | 返回一個指向堆中的最小元素的引用 |
- addElement操作
- 要求插入元素是可比較的
- 維持該堆的完全性屬性和有序屬性,插入的元素位置只存在一個正確的位置,要不然在h層左邊的下一個空位置,要不然在h+1層左邊的第一個位置。
- 新增之後進行排序(過程名叫篩選)
- 在堆實現中,會對最末一片葉子進行跟蹤記錄。
- removeMin操作
- 對於最小堆來說,Min就是根的位置的元素
- 維持該堆的完全性,能替換根的合法元素只有一個就是最末一片葉子上儲存的元素。
- 刪除之後進行排序(過程名叫篩選)
- findMin操作:
- 最小堆中的最小元素儲存在根中,所以只需要返回儲存在根中的元素。
使用堆:優先順序佇列
- 兩個規則:
- 具有更高優先順序的項排在前面。(不是FIFO)
- 具有相同優先順序的項按先進先出的規則排列。(FIFO)
- 解決方案:
- 使用佇列列表
- 使用最小堆。
//要先解決對相同優先順序的進行先進先出的排序 //建立一個PriorityQueueNode物件,儲存將被放置在佇列中的元素,該元素的優先順序,以及元素放進佇列的順序 public PrioritizedObject(T element, int priority) { this.element = element;//元素 this.priority = priority;//優先順序 arrivalOrder = nextOrder;//放入佇列的順序 nextOrder++; } //再解決優先順序相同時的比較 //為PriorityQueueNode類定義一個CompareTo方法,來完成優先順序相同時的比較 public int compareTo(PrioritizedObject obj) { int result; if (priority > obj.getPriority()) result = 1; else if (priority < obj.getPriority()) result = -1; else if (arrivalOrder > obj.getArrivalOrder()) result = 1; else result = -1; return result; }