2018-2019-20172329 《Java軟件結構與數據結構》第八週學習總結
現在對於我而言,最珍貴的是時間,感覺自己在時間飛逝的時候真的挽留不住什麼,只能怒髮衝冠的讓自己瘋狂的學習啦,新的一週要加油!❤️
教材學習內容總結
《Java軟件結構與數據結構》第十二章-優先隊列與堆
一、概述
- 1、什麼是堆:
- 堆就是具有兩個附加屬性的一個二叉樹。
- 堆分爲小頂堆和大頂堆。
- 兩個附加屬性如下:
- (1)它是一顆完全樹。(完全樹:如果某樹是平衡的,且底層所有葉子都位於樹的左邊,則認爲該樹是完全的。
- (2)對每個結點,它(小於/大於)或等於其左孩子和右孩子。(ps:小於爲小頂堆,大於爲大頂堆)
- 小頂堆將其最小元素存儲在該二叉樹的根處,且其根的兩個孩子同樣也是小頂堆。
- 2、堆的操作簡歷:
操作 | 描述 |
---|---|
addElement | 將給定元素添加到該堆中 |
removeMin/removeMax | 刪除堆的最小元素/最大元素 |
findMin/findMax | 返回一個指向堆中的最小元素/最大元素的引用 |
- 3、堆的具體操作
- addElement操作:
- (1)該方法將給定的元素添加到堆中的恰當位置處,且維持該隊的完全性屬性和有序屬性。
- (2)因爲一個堆就是一顆完全樹,所以對於插入的新結點而言,只存在一個正確的位置,且要麼是h層左邊下層的下一個空位置,要麼是h+1層左邊的第1個位置(如果h層是滿的話)
如圖
- 插入的調整過程:
如圖
- removeMin操作:
- (1)該方法將刪除最小堆中的最小元素並返回它。
- (2)由於最小元素是存儲在最小堆的根處,所以我們需要返回存儲在根處的元素並用堆中的另一個元素替換它。
- (3)要維持該樹的完全性,那麼只有一個能替換根的合法元素,且它是存儲在樹中最末一片葉子上的元素。
如圖
- findMin操作
- (1)該方法將返回一個指向該最小堆中最小元素的引用。
- (2)由於該元素總是被存儲在該樹的根處,所以實現這一方法只需通過返回存儲在根處的元素即可。
- addElement操作:
- 4、優先隊列是什麼
- 優先隊列是允許至少下列兩種操作的數據結構
- (1)insert(插入),它的作用是顯而易見的;
- (2)deleteMin(刪除最小者),它的工作是找出、返回並刪除優先隊列中最小的元素。
- insert等價於enqueue(入隊),而deleteMin則是隊列運算中dequeue(出隊)在優先隊列中的等價操作。
如圖
- 1、優先隊列具有更高的優先級的項目在先。
- 2、具有相同優先級的項目使用先進先出來確定其排序。
- 3、雖然小頂堆根本不是一個隊列,但是它提供了一個高效的優先級隊列實現。
- 4、優先隊列沒有back()操作!!!!!
二、用鏈表實現堆
- 優先隊列是允許至少下列兩種操作的數據結構
- 1、addElement操作
- 過程:
- (1)在恰當的位置處添加一個新元素,對堆進行重排序以維持其排序屬性。
- (2)將lastnode指針重新設定爲指向新的最末結點。
- 過程:
- 2、removeMin操作
- 過程:
- (1)用存儲在最末結點處的元素替換存儲在根處的元素,對堆進行重排序,以及返回初始的根元素。
- (2)鏈表實現的removeMin方法必須刪除根元素,並用來自最末結點替換它。
- (3)該操作的最後的時間複雜度爲O(log n)
- 過程:
- 3、 findMin操作
- 過程:
- (1)該方法僅僅返回一個指向存儲在堆根元素的引用,因此複雜度爲O(1)。
- 過程:
三、用數組實現堆
- 1、概念點
- 注:在二叉樹的數組實現中,樹的根位於位置0處,對於每一結點n,n的左孩子將位於數組2n+1位置處,n的右孩子將位於數組的2(n+1)位置處。
- 2、addElement操作
- 注:鏈表實現和數組實現的addElement方法的時間複雜度同爲O(log n)
- 3、removeMin操作
- 注:鏈表實現和數組實現的removeMin方法的時間複雜度同爲O(log n)
- 4、 findMin操作
- 注:該方法僅僅返回一個指向存儲在堆根元素的引用,因此複雜度爲O(1)。
四、其他
- 1、heapSort方法的兩部分構成:
- (1)添加列表的每一個元素
- (2)一次刪除一個元素
- 2、堆排序的複雜度爲O(n log n)
教材學習中的問題和解決過程
問題1:在堆的刪除和插入操作後進行調整的時候,如何去判斷哪一個元素需要被交換
- 問題1解決方案:
- (1)現在的任務是將一個不符合大小頂堆的堆讓它變得符合標準。
- (2)我們要進行篩選操作:
- 1、調整過程中,總是將根結點(被調整結點)與左右孩子比較
- 2、不滿足堆條件時,將根結點與左右孩子中較大者交換
- 3、這個調整過程一直進行到所有子樹都是堆或者交換到葉子爲止
- 問題2:堆排序是如何進行的
- 問題2解決方案:
- 步驟:
- (1)將關鍵字序列排成完全二叉樹形式;
- (2)從無序序列的第n/2個元素開始(對應於完全二叉樹的最後一個非終端結點)進行篩選(篩選可以參考問題1解決方案)
圖示:
代碼調試中的問題和解決過程
問題1:在進行測試的時候,在輸出的時候會出現刪除以後多一個元素的現象
- 問題1解決方案:
(1)首先,我先測試了問題到底出現在哪裏,通過調用刪除方法,我發現總有一個現象就是會讓最後一個元素給替代第一個的位置,所以我就鎖定了一行代碼tree[0] = tree[count-1];
也大致確定了問題也應該源於此,所以需要修改。
(2)我運用之前用數組實現隊列的思想,用瞭如下的方法解決問題。
(3)同時這個問題也可以解決發生在pp12.1在寫隊列的出列的操作中所發生的問題。
for (int i =0;i<count-1;i++){
tree[i]=tree[i+1];
}
上週考試錯題總結
錯題1:
The Java Collections API provides two implementations of balanced binary search trees, TreeSet and TreeMap, both of which use a ___________tree implementation.
A .AVL
B .red/black
C .binary search
D .None of the above正確答案: B 我的答案: C
解析:當時我認爲既然接口是查找樹,則這兩個也應該是查找樹的方法。
錯題2:
A minheap stores its largest element at the root of the binary tree, and both children of the root of a minheap are also minheaps.
A .True
B .Flase正確答案: B 你的答案: A
解析:眼瞎看錯題目了,頂應該是最小
代碼託管
結對及互評
- 本週結對學習情況
- 博客中值得學習的或問題:
- 內容詳略得當;
- 代碼調試環節比較詳細;
- 基於評分標準,我給本博客打分:5分。得分情況如下:
- 正確使用Markdown語法(加1分):
- 模板中的要素齊全(加1分)
- 教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
- 博客中值得學習的或問題:
- 內容詳略得當;
- 代碼調試環節比較詳細;
- 基於評分標準,我給本博客打分:9分。得分情況如下:
- 正確使用Markdown語法(加1分):
- 模板中的要素齊全(加1分)
- 教材學習中的問題和解決過程, 一個問題加1分
- 代碼調試中的問題和解決過程, 一個問題加1分
感悟
本週覺得自己愈發忙碌了起來,感覺時間真的越來越不夠用了,和老師也聊了聊,的確上大學上成這個樣子可能也是haiok,老師說現在上大學累成夠=狗說明就對了,我覺得的確,像在大學這樣一個時間由自己支配的階段,我覺得只要自己有心,肯定就可以找到更多的事情自己去做,因爲正因爲有大學這個平臺,讓我們可以學習到更多有利於自己今後發展技能,讓自己將來可以在社會中有立足之地。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 0/0 | 1/1 | 6/6 |
第二週 | 1313/1313 | 1/2 | 20/26 |
第三週 | 901/2214 | 1/3 | 20/46 |
第四周 | 3635/5849 | 2/4 | 20/66 |
第五週 | 1525/7374 | 1/5 | 20/86 |
第六週 | 1542/8869 | 2/5 | 25/111 |
第七週 | 1391/10260 | 1/6 | 20/131 |
第八週 | 4379/14639 | 2/8 | 25/156 |