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

20172322 《程式設計與資料結構》第八週學習總結

20172322 《程式設計與資料結構》第八週學習總結

教材學習內容總結

本章的內容主要講堆的知識,而所謂堆就是一種具有一些特殊屬性的樹,就像二叉查詢樹一樣。而堆也有兩種分類,分別是

  • 最大堆

  • 最小堆

但是無論是最大堆還是最小堆的第一個特殊屬性均為:

  • 堆必須是一棵完全樹。

第二個特殊屬性是:

  • 對於每一個結點,它小於或等於/大於其左右孩子。

但本章的內容主要以最小堆為例,學會了最小堆可以類比退出最大堆的性質。

因為堆是一種含有特殊屬性的樹,所以在本章中堆繼承了以前二叉樹的所有性質,本章僅僅是在BinaryTreeADT基礎上添加了addElement

removeMinfindMin方法。

  • addElemnt方法:因為堆是一個完全樹,所以說所新增元素的位置必定為堆的最後一層或最後一層之後的左邊第一個位置。但在新增元素後還需要考慮整個堆的屬性是否保持完成,所以說需要考慮重新排序。
  • removeMin方法:刪除堆的根結點後重新排序。
  • findMin方法:簡單的返回根結點的操作。

與以往類似,本次分別利用連結串列和陣列實現堆。

  • 連結串列實現堆:建立HeapNode類繼承BinaryTreeNode類,但由於BinaryTreeNode無雙親結點的存在,所以在HeapNode中添加了一個雙親指標。(值得注意的是,新增雙親結點的原因是:在我們插入元素之後我們需要向上遍歷該樹,所以必須存在一個指向雙親的指標
    • addElement方法的複雜度是O(logn),與此方法同時存在的是getNextParentAddheapifyAdd方法,他們用於返回插入結點的雙親的引用和對新增元素後的堆進行重排序。
    • removeMin方法的複雜度同為O(logn),與此方法同時存在的是getNewLastNodeheapifyRemove方法,他們用於返回新插入的節點和對刪除元素後的堆進行重排序。
    • findMin方法:return root.element
  • 陣列實現堆:與二叉樹相同,對於任一結點n,n的左孩子將位於陣列的2n+1位置處,n的右孩子將位於陣列的2(n+1)
    處,而對於任一非根結點m,m的雙親結點位於 (n-1)/2處,這意味著我們利用陣列實現堆不需要建立一個HeapNode類。
    • 利用陣列實現堆的addElementremoveMinfindMin方法的解釋與利用連結串列實現堆類似,個人覺得無需過多言語。
  • 堆排序:這是一種全新的排序演算法。這種排序演算法完全是根據堆的性質而思考出來的排序演算法。以最小堆為例,每次將根結點與最後一個結點互換後,將最後一個結點提出樹,這樣就得到了一個最小的元素。在提出最小結點過後對樹重新排序,之後重複以上兩步操作直到排序完成。如圖所示:

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

本章的內容就是對之前內容的簡單拓展,實在是找不到什麼問題。如果真的要我找一個問題就是:

  • 問題一:在書P265中偏下部有一句話“n的右孩子將位於陣列的2(n+1)位置處當然,反過來......”,這句話一讀就有問題。
  • 問題一解決方案:這句話應該為“n的右孩子將位於陣列的2(n+1)位置處,當然反過來......”

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

  • 問題一:在完成PP12.1時,自己最初只是簡單的以為利用書上的優先佇列的程式碼就可以完成,但是這好像是我沒有認真讀題。
  • 問題一解決方案:在結對夥伴範雯琪提醒下,自己重寫了佇列,在書上優先佇列PriorityQueue的基礎上刪除了實現優先順序的程式碼,就實現啦。

程式碼託管“點這裡跳轉到碼雲”

上週考試錯題總結

  • 錯題1:A binary search tree is a binary tree with the added property that the left child is greater than the parent, which is less than or equal to the right child.
  • A.True
  • B.False
  • 錯題1解析:二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹,
    • 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
    • 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
    • 左、右子樹也分別為二叉排序樹;
    • 沒有鍵值相等的節點。
  • 錯題2:A binary search capitalizes on the fact that the list is not sorted.
  • A.True
  • B.False
  • 錯題2解析:二叉查詢樹正式利用列表是被排序過才能進行搜尋。
  • 錯題3:A binary search can only be performed if the search pool is sorted.
  • A.True
  • B.False
  • 錯題3解析:當查詢池被排序好了以後就只能利用二叉查詢樹來搜尋。

結對及互評(待修改)

  • 部落格中值得學習的或問題:
    • 範雯琪同學的部落格課本上的學習內容總結部分寫得十分詳細,值得學習。
    • 每次看到範雯琪同學的部落格自己都比較慚愧,實在是非常優秀,可想而知她在部落格這一方面所做出的努力,我也非常想想她學習。
  • 程式碼中值得學習的或問題:
    • commit提交的解釋清晰明瞭,我覺得我應該學習。
    • 有許多程式碼的問題都是我向她詢問,我很感謝她

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

  • 本週結對學習情況
    • 20172303

    • 結對學習內容
      • 她提醒了我的PP12.1有點問題,感謝。

其他

  • 感悟:這周的知識僅僅是之前知識的一點點拓展,不難,但是也需要認真對待。

課本單詞

(本部分用於收集本章節後的生詞)

  • heap:堆
  • minheap:最小堆
  • maxheap:最大堆
  • complete binary tree:完全二叉樹
  • priority tree:優先樹

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/5000 2/2 8/8 認真學習!積極向上
第二週 812/812 1/3 22/30
第三週 814/1626 1/4 20/50
第四周 1386/3012 2/6 20/70 愉快的國慶節就要結束了...
第五週 1222/3234 1/7 30/100
第六週 1327/4561 2/7 30/100 啦啦啦啦啦
第七週 1170/5631 1/8 33/133
第八週 1250/6881 2/10 30/163
  • 計劃學習時間:25小時

  • 實際學習時間:30小時

  • 改進情況:根據學姐的建議改進了commit。

參考資料