20172312 2018-2019-1 《程式設計與資料結構》第八週學習總結
20172312 2018-2019-1 《程式設計與資料結構》第八週學習總結
教材學習內容總結
第十二章
堆
1.堆:具有兩個附加屬性的一顆二叉樹,它是一顆完全二叉樹,對每一結點,它小於或等於其左右孩子(或大於等於其左右孩子)
2.最小堆:對每一結點,它小於或等於其左右孩子,將其最小元素儲存在二叉樹的根處,且其根的兩個孩子同樣也是最小堆
3.最大堆:對每一結點,它大於或等於其左右孩子,將其最大元素儲存在二叉樹的根處,且其根的兩個孩子同樣也是最大堆
操作 說明 addElement 往堆的合適位置新增一個元素 removeElement 從堆中刪除一個元素 removeAllOccurrences 從堆中刪除所指定元素的任何存在 removeMin 刪除堆中的最小元素並返回它 removeMax 刪除樹堆的最大元素並返回它 findMin 返回一個指向堆中最小元素的引用 findMax 返回一個指向堆中最大元素的引用
堆的使用:優先順序佇列
1.優先順序佇列就是遵循兩個排序規則的集合:具有更高優先順序的專案在;具有相同優先順序的專案使用先進先出方法來確定其排序
2.優先順序佇列具有多種應用(比如,作業系統中的任務排程,網路中的通訊排程,甚至是汽車維修處的作業排程)
3.可以使用某一佇列列表(其中每一佇列都表示了給定優先順序的專案)來實現一個優先順序佇列
4.按照優先順序對堆排序完成了第一次排序(高優先順序的專案在先)。但是,我們必須對具有相同優先順序專案的先進先出排序進行操縱:
解決方案是建立一個 PriorityQueueNode物件,它儲存的是將被放置在佇列中的元素,該元素的優先順序,以及元素放進佇列的順序
然後,我們只需為 PriorityNode類定義個 compareTo方法,以便先對優先順序進行比較,然後在優先順序一樣的時候再對階進行比較
堆的實現
1.列表實現堆:堆的連結串列實現要求在插入元素後能夠向上遍歷該樹,所以堆中的結點必須儲存指向其雙親的指標。
2.陣列實現堆:樹的根位於位置0,對於每一結點n,n的左孩子將位於陣列的2n+1位置處,n的右孩子將位於陣列的2(n+1)位置處(反過來同樣也是對的)
對於任何除了根之外的結點n,n的雙親位於(n-1)/2位置處,因為我們能夠計算雙親和孩子的位置,所以與連結串列實現不同的是,陣列實現不需要建立一個 Heap Node類
堆的使用:堆排序
1.使用堆來對某個數字列表進行排序:將列表的每一元素新增到堆中,然後次一個地將它們從根中刪除,在最小堆的情形下,排序結果將是該列表以升序排列;在最大堆的情形下,排序結果將是該列表以降序排列。
2.由於新增和刪除操作的複雜度都為O(log n),因此可以得出堆排序的複雜度也是O(log n),但是,這些操作的複雜度為O(log n)指的是在含有n個元素的列表中新增和刪除一個元素。
教材學習中的問題和解決過程
- 問題1:教材中有這樣一句話:“通常在堆的實現中,我們會對二叉樹的最後一片葉子進行跟蹤記錄。”那麼為何要對二叉樹的最後一片葉子進行追蹤記錄?
- 問題1解決方案:在對堆進行插入和刪除操作的時候需要將根結點與最後一片葉子結點進行交換位置。
程式碼除錯中的問題和解決過程
-
問題1:無
碼雲連結
結對及互評
部落格中值得學習的或問題:
- 部落格排版工整,介面很美觀,並且本週還對部落格排版、字型做了調整,很用心
- 問題總結做得很全面:對課本上不懂的程式碼會做透徹的分析,即便可以直接拿過來用而不用管他的含義
本週結對學習情況
- 20172315
- 20172318
結對學習內容
- p12.3
- 堆排序