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

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

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

教材學習內容總結

  • 堆是一棵完全二叉樹,其中的每一結點都小於或等於它的兩個孩子。
  • 一個堆也可以是最大堆(maxheap),其中的結點大於或等於它的左右孩子。
  • 最小堆將其最小元素儲存在該二又樹的根處,且其根的兩個孩子同樣也是最小堆。
  • addElement方法將給定的Comparable元素新增到堆中的恰當位置處,且維持該堆的完全性屬性和有序屬性。
  • 因為一個堆就是一棵完全樹,所以對於插入的新結點而言,只存在一個正確的位置,且它要麼是h層左邊的下一個空位置,要麼是h+1層左邊的第1個位置(如果h層是滿的話)。
  • 通常,在堆實現中,我們會對樹中的最末一個結點,或更為準確是,最末一片葉子進行跟蹤記錄。
  • 要維持該樹的完全性,那麼只有一個能替換根的合法元素,且它是儲存在樹中最末一片葉子上的元素。
  • 雖然最小堆根本就不是一個佇列,但是它卻提供了一個高效的優先順序佇列實現。
  • 因為我們要求在插入元素後能夠向上遍歷該樹,所以堆中結點必須儲存指向其雙親的指標。
  • 在二又樹的陣列實現中,樹的根位於位置0處,對於每一結點n,n的左孩子將位於陣列的2n+l位置處,n的右孩子將位於陣列的2(n+l)位置處。
  • 連結串列實現和陣列實現的addElement操作的時間複雜度同為O(logn)。
  • 連結串列實現和陣列實現的removeMin操作的複雜度同為0(logn)。
  • heapSort方法的兩部分構成:新增列表的每個元素,然後一次刪除一個元素。
  • 堆排序的複雜度為O(nlogn)。

    教材學習中的問題和解決過程

  • 問題1:為什麼要維持該樹的完全性,那麼只有一個能替換根的合法元素,且它是儲存在樹中最末一片葉子上的元素
  • 問題1解決方案:由於堆是佇列結構,只能從堆中刪除堆頂元素。移除堆頂元素之後,用堆的最後一個節點填補取走的堆頂元素,並將堆的實際元素個數減1。但用最後一個元素取代堆頂元素之後有可能破壞堆,因此需要將對自頂向下調整,使其滿足最大或最小堆。

程式碼除錯中的問題和解決過程

  • 問題1:對於pp12.1說的堆中的比較操作必須依照進入該佇列的順序來進行是什麼意思
  • 問題1解決方案:優先順序佇列把優先順序改為一樣即可解決

程式碼託管

(statistics.sh指令碼的執行結果截圖)

上週考試錯題總結

  • 錯題1及原因,理解情況
    Insertion sort is an algorithm that sorts a list of values by repetitively putting a particular value into its final, sorted, position.

A . true
B . false
正確答案: B
你的答案: A
insertion sort:插入排序一種排序演算法,通過反覆地把某個元素插入到之前已排序的子列表中,實現元素的排序。

結對及互評

點評模板:

  • 部落格中值得學習的或問題:
    • 對於教材內容解析到位
    • 對於問題探討不夠
  • 程式碼中值得學習的或問題:
    • 程式碼簡潔,一目瞭然
    • 程式碼註釋過少

點評過的同學部落格和程式碼

  • 本週結對學習情況
  • 上週部落格互評情況

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 0/0 0/0
第二週 800/800 2/2 18/18
第三週 600/1400 3/5 22/40
第四周 700/1300 3/8 22/62
第五週 400/1700 3/11 22/84
第六週 200/1900 2/13 20/94
第七週 400/2300 2/15 20/114
第八週 600/2900 2/17 20/134

參考資料