1. 程式人生 > >20172324 2018-2019-1 《程式設計與資料結構》第八週學習總結

20172324 2018-2019-1 《程式設計與資料結構》第八週學習總結

20172324 2018-2019-1 《程式設計與資料結構》第八週學習總結

教材學習內容總結

  • 具有兩個附加屬性的二叉樹:
    1. 是一顆完全樹
    2. 對每一結點,它小於或等於其左孩子和右孩子(最小堆)
    3. 最大堆的結點大於或等於它的左右孩子
    4. 最小堆將其最小元素儲存在該二叉樹的根處,其根的兩個孩子同樣也是最小堆
操作 說明
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;
  }