20172324 2018-2019-1 《程序設計與數據結構》第八周學習總結
阿新 • • 發佈:2018-11-11
第八周 一個 插入元素 使用 說明 程序設計 插入 add fin
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; }
20172324 2018-2019-1 《程序設計與數據結構》第八周學習總結