# 20172333 2018-2019-1 《程序設計與數據結構》第八周學習總結
阿新 • • 發佈:2018-11-11
eem win tab ise center java程序 mov 其他 內容
20172333 2018-2019-1 《程序設計與數據結構》第八周學習總結
教材學習內容總結
《Java軟件結構與數據結構》第十二章-優先隊列與棧
一、堆
- ①堆是一顆具有兩個附加屬性的完全二叉樹
- 附加屬性:1.堆是一顆完全樹。2.對於每個結點,它小於或等於其左孩子和右孩子。
- ②堆默認為最小堆,當然也有最大堆。
- 圖堆12
操作 | 說明 |
---|---|
addElement | 將給定元素添加到該堆中 |
removeMin | 刪除堆的最小元素 |
findMin | 返回一個指向堆中最小元素的引用 |
public interface HeapADT<T> extends BinaryTreeADT<T> { /** * Adds the specified object to this heap. * * @param obj the element to be added to the heap */ public void addElement(T obj); /** * Removes element with the lowest value from this heap. * * @return the element with the lowest value from the heap */ public T removeMin(); /** * Returns a reference to the element with the lowest value in * this heap. * * @return a reference to the element with the lowest value in the heap */ public T findMin(); }
- ③addeEement方法:
圖
- 該方法將Conparable元素添加到棧的恰當位置,維持該堆的完全性屬性與有序屬性。
- 插入的新節點只有一個正確的位置,即最後一層的左邊下一個位置,要麽是最後一層再加一層左邊的第1個位置。插入點一般是最後一片葉子的結點。
實現:
public void add(T newEntry) { lastIndex++; if(lastIndex >= heap.length) doubleArray(); int newIndex = lastIndex; int parentIndex = newIndex / 2; heap[0] = newEntry; while(newEntry.compareTo(heap[parentIndex]) > 0){ heap[newIndex] = heap[parentIndex]; newIndex = parentIndex; parentIndex = newIndex / 2; } heap[newIndex] = newEntry; }
- ④RemoveMin方法
- 在最小堆裏面,最小的元素是堆的根,我們需要刪除並且返回它的話,需要一個新的根,通常這個新根是最末的一個葉節點。
- 由於通常新根變為根節點後堆就不成立了,需要對其進行平衡。
- ⑤findMin方法
- 最小堆的根就是最小元素,直接返回根即可。
- 代碼實現
public T findMin() throws EmptyCollectionException { if (isEmpty()) throw new EmptyCollectionException("ArrayBinaryTree"); return tree[0]; }
二、用鏈表實現堆
- ①由於在插入元素後,要進行排序,所以堆中的結點需要擁有指向父輩的指針。
- ②實現過程中依舊是addElement、removeMin、findMin三種方法,且書上已經有了代碼就不多贅述。
- ③但是需要註意的是在addelement中使用了兩個私有方法,一個是getNextParentAdd的方法,它用於返回指向一個結點的引用,一般適用於每個結點指向父輩的。另外一個方法是heapifyAdd這個添加後的排序。
- ④相對的刪除過程中也有兩個私有方法,一個為追蹤最後一個葉子的方法,一個則是用於對刪除後的堆進行排序。
三、用數組實現堆
- ①數組的實現堆的方法比鏈表更加簡潔。因為鏈表需要隨時追蹤父輩結點和最後一個葉子結點,但是數組不同,數組的最後一位就一定會是葉子結點。
- ②雖然在addelemnt中沒有了追蹤父輩的方法,但是作為數組,它的容量是恒定的,一旦出現添加的情況,就需要考慮擴容,所以依舊是兩個方法,一個擴容,一個用來重排序。
- ③鏈表與數組的添加方法的復雜度相同,與此相對的是的刪除方法的復雜度也是相同的。
教材學習中的問題和解決過程
- 問題1:堆是否和紅黑樹一樣,一旦進行添加刪除就需要進行平衡?
- 回答1:堆添加刪除元素可能符合原本的堆的性質,可以不進行重排序就可以實現堆。
- 問題2:為什麽說最小堆實現了高效的優先級隊列?
- 回答2:由於隊列的性質既是先進先出,我們只需要對Conparable定義為先對於優先級進行比較即可實現優先級隊列。
代碼調試中的問題和解決過程
- 本次書上PP問題主要在書上已經是基本實現了的,所以這周的代碼問題主要是出現在本次實驗過程中。
- 第二次實驗博客
代碼托管
-圖代碼
上周考試錯題總結
- 無
結對及互評
基於評分標準,我給李楠的博客打分:7分。得分情況如下:
正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
代碼調試中的問題和解決過程, 無問題
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)
點評過的同學博客和代碼
- 本周結對學習情況
- 20172330李楠
- 結對照片
- 結對學習內容
- 堆
其他(感悟、思考等,可選)
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 0/0 | 1/2 | 10/20 | |
第三周 | 1500/1500 | 1/3 | 10/30 | |
第四周 | 2761/4261 | 2/5 | 25/55 | |
第五周 | 814/5075 | 1/6 | 15/70 | |
第六周 | 1091/6166 | 1/7 | 15/85 | |
第七周 | 1118/7284 | 1/8 | 15/100 | |
第八周 | 1235/8519 | 2/10 | 15/115 |
《Java程序設計與數據結構教程(第二版)》
- 《Java程序設計與數據結構教程(第二版)》學習指導
- 二叉樹及其三種遍歷
- 二叉查找樹圖示
- 史上最清晰的紅黑樹講解(上)
史上最清晰的紅黑樹講解(下)
# 20172333 2018-2019-1 《程序設計與數據結構》第八周學習總結