20172322 《程序設計與數據結構》第八週學習總結

20172322 《程序設計與數據結構》第八週學習總結

教材學習內容總結

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

  • 最大堆
    java

  • 最小堆
    git

可是不管是最大堆仍是最小堆的第一個特殊屬性均爲:算法

  • 堆必須是一棵徹底樹。

第二個特殊屬性是:api

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

但本章的內容主要以最小堆爲例,學會了最小堆能夠類比退出最大堆的性質。數組

由於堆是一種含有特殊屬性的樹,因此在本章中堆繼承了之前二叉樹的全部性質,本章僅僅是在BinaryTreeADT基礎上添加了addElementremoveMinfindMin方法。數據結構

  • addElemnt方法:由於堆是一個徹底樹,因此說所添加元素的位置一定爲堆的最後一層或最後一層以後的左邊第一個位置。但在添加元素後還須要考慮整個堆的屬性是否保持完成,因此說須要考慮從新排序。
  • removeMin方法:刪除堆的根結點後從新排序。
  • findMin方法:簡單的返回根結點的操做。

與以往相似,本次分別利用鏈表和數組實現堆。less

  • 鏈表實現堆:建立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。

參考資料

相關文章
相關標籤/搜索