小於或等於其左孩子和右孩子的是最小堆(minheap),結點大於或等於它的左右孩子是最大堆(maxheap), 其中的結點大於或等於它的左右孩子。關鍵概念html
最小堆將其最小元素存儲在該二叉樹的根處,且其根的兩個孩子一樣也是最小堆。
java
堆的接口:git
藍墨雲上作的一個練習就很清楚地顯示了這個過程。
算法
問題1:課本屢次說到完成一些操做例如:addElement和removeMin等操做,數組和鏈表實現的堆的複雜度是相同的,可是仍是說數組實現的效率更高,這是爲何?數組和鏈表實現堆的優缺點分別是什麼?數組
問題1解決方案:
用數組實現堆時,進行addElement操做不須要和鏈表同樣從新肯定新節點雙親,removemin操做不須要肯定新的最末結點。數據結構
簡單總結一下,用數組實現堆的好處有學習
優勢:和順序存儲同樣的
一、能夠很方便找到孩子、雙親和兄弟,以及祖先和子孫
二、只須要存儲數據元素,不須要另外存儲元素的邏輯關係
三、物理結構和邏輯結構一致測試
private HeapNode<T> getNextParentAdd() { HeapNode<T> result = lastNode; while ((result != root) && (result.getParent().getLeft() != result)) result = result.getParent(); if (result != root) if (result.getParent().getRight() == null) result = result.getParent(); else { result = (HeapNode<T>)result.getParent().getRight(); while (result.getLeft() != null) result = (HeapNode<T>)result.getLeft(); } else while (result.getLeft() != null) result = (HeapNode<T>)result.getLeft(); return result; }
而後就去問馨雨同窗,這些代碼的意思,結果討論討論着,馨雨馨雨就被我問蒙了,O(∩_∩)O,後來,發現是咱們理解錯了lastNode結點,「插入結點的雙親結點」,以前一直理解的是將要插入的結點的雙親結點,其實lastNode是最後一片葉子結點,狀況以下:
設計
ArrayHeap類的代碼書上是有給出的,而後本身寫了一個測試類,結果發現出現了這樣的問題3d
而後又仔細思考了一下代碼,在代碼中將最後一個元素賦值給了root結點,可是緣由是並無將葉結點刪除,因此接下來從新調平衡的時候,最後的那個位置並進行操做,因此出現了重複。
(statistics.sh腳本的運行結果截圖)
錯題1及緣由,理解狀況
What type does "compareTo" return?
A
.
int
B
.
String
C
.
boolean
D
.
char
解析:compareTo()方法確實是String類中的一個,可是compareTo()的返回值是int。
它先比較對應字符的ASCII碼,如字符串的某字符與參數的某字符不等,則結束比較,返回它們ASCII碼的差值。直至字符串的字符或參數的字符 有一方全比較完,此時比較字符串的長度差並返回。
這周又是Java課多到爆表的雙週,咱們又開始完成實驗二了,並且這周老師還讓咱們組了個隊,要完成一個Java項目的開發,ε=ε=ε=(#>д<)ノ,難。
這個學期愈來愈注重代碼的編寫能力,也接觸到了不少的新的算法和知識點,就像這個禮拜學的堆,但願本身接下來的課程要繼續努力。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | ||
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 10/10 | |
第二週 | 326/326 | 1/2 | 18/28 | |
第三週 | 784/1110 | 1/3 | 25/53 | |
第四周 | 2529/3638 | 2/5 | 37/90 | |
第五週 | 1254/4892 | 2/7 | 20/110 | |
第六週 | 1403/6295 | 2/9 | 32/142 | |
第七週 | 1361/7656 | 1/10 | 35/177 | |
第八週 | 2750/10406 | 2/12 | 32/209 |
計劃學習時間:30小時
實際學習時間:32小時
改進狀況:這周是雙週,Java課比較多,課程內容也比較多,保持了良好的學習進度和時間。