2017-2018-20172309 《程序设计与数据结构》第八周学习总结
2017-2018-20172309 《程序設計與數據結構》第八周學習總結
一、教材學習內容總結
相信其它很多同學都是以小頂堆來介紹這一章內容,所以我將以大頂堆來介紹這章內容。
1.1 堆的簡單介紹:
- 堆的定義:(大頂堆)
- 堆實際上是一棵完全二叉樹。
- 堆滿足兩個性質:
- 堆的每一個父節點都大于其子節點;
- 堆的每個左子樹和右子樹也是一個堆。
- 堆分為兩類:
- 最大堆(大頂堆):堆的每個父節點都大于其孩子節點;
- 最小堆(小頂堆):堆的每個父節點都小于其孩子節點;
- 堆的定義是二叉樹的拓展,因此他也繼承了二叉樹的所有操作。
- 操作列表(大頂堆為例):
| addElement() | 將給定元素添加到該堆中去 |
| removeMax() | 刪除堆中最大的元素 |
| findMax() | 返回一個指向堆中最大元素的引用 |
- addElement方法將給定的Comparable元素添加到堆中的恰當位置,且維持該堆的完全屬性和有序屬性。
- 因為堆是一棵完全二叉樹,因此對于新插入的節點而言,就只有一個正確的位置,要么是h層左邊的下一個空位置,要么是h+1層的第一個位置(此時h層已經裝滿了)。
- 如下圖:它有這兩個位置可插入:
- 通常在堆的實現中,我們會對二叉樹的最后一片葉子進行跟蹤記錄。
- 最大堆的插入:
- 對于大頂堆而言,刪除最大元素即刪除二叉樹的根結點,如果刪除根結點而要想維持堆的完全性,必須與最后一片葉子進行交換位置。
- 交換位置后,必須進行重排序、以維持堆的第二個屬性:排序。
- 用圖表示下過程:
findMax操作
findMax操作將返回一個指向該最大堆中最大元素的引用,也就是根結點的引用。所以實現這一操作只需返回儲存在根結點的元素即可。
1.2使用堆:優先級隊列。
- 我們先來舉個例子來感受下優先級隊列。
- 生活中,排隊時講究女士優先。
- 游戲中,抽獎人民幣玩家獲得好東西的概率更大!
- 好,我們現在來說什么是優先級隊列:
- 具有更高優先級的項目優先,比如女士、人民幣玩家。
- 具有相同優先級的項目使用先進先出的方法 確定其排序。
- 雖然最大堆根本就不是一個隊列,但是他提供了一個高效的優先級隊列實現。
關鍵代碼:
在我看來,這個比較的代碼是重中之重的。
1.3 用鏈表實現堆:
- 因為我們需要再插入元素后能夠向上遍歷樹,因此結點中需要一個指向雙親結點的指針。
我們還需要一個能夠跟蹤該堆最后一片葉子 的指針:
public HespNode lastNode;
- 最大堆的各種操作:
- addElement操作:
- addElement操作完成三個任務:
- 再恰當位置添加一個元素。
- 對堆進行重排序。
- 將lastNode指針重新指向新的最末結點。
- addElement操作的時間復雜度為:O(log n)
- addElement操作:
- removeMax操作:
- removeMax主要完成三個操作:
- 將最后一片葉子結點與根結點交換位置。
- 對堆進行重排序。
- 返回初始根元素。
- removeMax操作的時間復雜度為:O(log n)
1.4用數組實現堆:
- 堆的儲存一般都是用數組實現的。
- 堆是基于二叉樹實現的,在二叉樹的數組視線中,對于任一索引值為n的結點,其左結點在2n+1的位置,右結點在2n+2的位置。
- 用數組實現堆的操作與用鏈表實現堆的操作步驟一樣。但值得注意的是:鏈表實現和數組實現的addElement操作時間復雜度雖然都為O(log n),,但實際上鏈表更快點。
1.5 使用堆:堆排序。
排序方法有兩個部分構成:添加列表的每個元素、一次刪除一個元素。
堆排序的時間復雜度為O(log n).
- 進入實戰:還記得上次的一個實驗,給我們一個數組沒讓我們形成一個大頂堆,之后讓我們排序:現在讓我們整理一下思路:
- 首先給出我們一個數組:[45,36,18,53,72,30,48,93,15,35]
- 然后我們應該按照它們的索引形成一個二叉樹:
- 然后重排序,得到一個大頂堆:
- 每輪排序的結果可以這樣表達:
- 運行結果為:
二、教材學習中的問題和解決過程
問題1:如何理解這段話,該怎樣實現?
通常在堆的實現中,我們會對二叉樹的最后一片葉子進行跟蹤記錄。
問題1解決方案:
就是在對堆進行刪除操作的時候需要將根結點與最后一片葉子結點進行交換位置,所以每一次操作都得更新lastNode結點。
- 問題2:書上介紹了用數組實現的堆排序,那么鏈表實現的堆排序應該怎樣排序?
問題2解決方案:書上數組對對進行排序是寫了一個方法,當想要進行排序的時候直接調用這個方法就OK,而我們選在在測試類里面直接進行排序,使用最大堆,取出最大堆輸出,然后就可以直接輸出。
如圖:
問題三:在網上搜尋有關于書上的資料室,出現了這么一個尷尬場面:
之后我點進去看了一下:
原來是講解了有關:棧內存和堆內存。
講了這么個些東西,來潦草的總結下:
- ava把內存劃分成兩種:一種是棧內存,一種是堆內存
在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。 - 當在一段代碼塊定義一個變量時,Java就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。 - 堆內存用來存放由new創建的對象和數組。
- 在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
- 在堆中產生了一個數組或對象后,還可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。
- 引用變量就相當于是為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。
(大概就看懂了這么多)
代碼調試中的問題和解決過程
- 問題1:如何用堆構建一個隊列、棧?
問題1解決方案:
首先我們得知道我們必須運用優先級堆,并且每一次添加元素,優先級都加一(從0開始)。
- 然后我們根據隊列、棧的特點來輸出
- 隊列是一種先進先出的結構,所以我們只要使用最小堆中的removeMin方法即可輸出最先進去的元素。
- 棧是一種先進后出的結構,所以我們只要使用最大堆中的removeMax方法即可輸出最后面進去的元素,因為它的優先級高,所以他在前面輸出。
- 結果
- 問題二:符合把一個Object型數據轉化為char類型數據?
- 原問題是這樣的我需要把Object operator= +轉化為char型數據,但是如果直接轉,比如這樣(char)operator是會拋出CalssCastException錯誤的!
- 之后解決辦法是先轉化成String 然后再轉化成char類型。
代碼之家
- 小頂堆:
- 用數組實現的小頂堆
- 用鏈表實現的小頂堆
- 大頂堆:
- 用數組實現的大頂堆
- 用鏈表實現的大頂堆
- pp項目代碼地址:
- pp12.1_queue
- pp12.8_ArrayHeap
- pp12.8_ArrayHeapTree
- pp12.9_LinkedHeap
代碼托管
上周考試錯題總結
第十章錯題
錯題1及原因:
What type does "compareTo" return? A .int B .String C .boolean D .char錯誤原因:comparaTo方法返回的是 -1,0,1
而 return "a".comparaTo("b")>0 為false or ture第十一章錯題
無
第十二章錯題
Since a heap is a binary search tree, there is only one correct location for the insertion of a new node, and that is either the next open position from the left at level h or the first position on the left at level h+1 if level h is full. A .True B .Flase錯誤原因:堆是一棵完全二叉樹、不是一顆二叉搜索樹。自己瞎了眼!!!!
點評模板:
博客或代碼中值得學習的或問題:
- 內容很詳細,把堆介紹的很透徹, - 運用豐富的圖片表達思想、比如插入、刪除結點的介紹。 - 提出問題有點少。點評過的同學博客和代碼
- 本周結對學習情況
- 20172310
- 結對學習內容
- 第十二章內容:堆、優先級隊列
- 實驗二:樹的綜合運用
- 上周博客互評情況
- 20172302
- 20172308
- 20172310
其他(感悟、思考等,可選)
這一章比起前面相對比較簡單,但自己不能松懈.哎,比較難受的是這兩天的假期都要貢獻給博客了~~~~~o(╥﹏╥)o
學習進度條(上學期截止7200)
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 260/0 | 1/1 | 05/05 | |
| 第二周 | 300/560 | 1/2 | 13/18 | |
| 第三周 | 212/772 | 1/4 | 21/39 | |
| 第四周 | 330/1112 | 2/7 | 21/60 | |
| 第五周 | 1321/2433 | 1/8 | 30/90 | |
| 第六周 | 1024/3457 | 1/9 | 20/110 | |
| 第七周 | 1024/3457 | 1/9 | 20/130 | |
| 第八周 | 643/4100 | 2/11 | 30/170 |
參考資料
1.優先隊列
2.堆排序
3.java 各種數據類型之間的轉化
4.java中的棧與堆
轉載于:https://www.cnblogs.com/dky-wzw/p/9940410.html
總結
以上是生活随笔為你收集整理的2017-2018-20172309 《程序设计与数据结构》第八周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cetos 7 系统安装备注事项
- 下一篇: 【超详细】遍历Windows进程模块