本週學習了二叉樹的另外一種有序擴展?是什麼呢?你猜對了!ヾ(◍°∇°◍)ノ゙就是堆。本章將講解堆的鏈表實現and數組實現,以及往堆中添加元素或從堆中刪除元素的算法;還將介紹對的一些用途,包括基本使用和優先隊列。 |
堆中的操做:
html
addElement方法將給定的Comparable元素添加到堆的恰當位置處,且維持該堆的徹底性屬性和有序屬性。java
- Little Tip:徹底樹你還記得嗎?徹底二叉樹就是全部葉子都位於h或者h-1層,其中h爲log2(n),且n爲樹中的元素數目,h層的全部葉子都位於該樹的左邊,那麼該樹被認爲是徹底的。
其次,具備相同優先級的項目使用先進先出方法來肯定其排序。node
public HeapNode lastNode;
總結:鏈表實現和數組實現的addElement方法和removeElement方法時間複雜度都是O(logn)。可是,數組的實現仍是更高效一些,由於在addElement操做中數組實現不用去肯定插入雙親的結點,在removeElement操做中數組實現不須要肯定新的最末一片葉子。git
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; }
這段代碼是返回將要插入結點的雙親結點的方法,當時我和仇夏討論的是有兩種狀況。由於咱們知道插入操做爲了保證樹的徹底性,因此要在h層的從左開始數的第一個空結點插入或者在h+1層的最左邊插入(若是樹是滿的話),可是在循環體中不知足咱們的要求。程序員
問題的重點是「下一個將要插入結點的雙親結點」,以前一直理解的是新插入結點的雙親結點,因此固然不對。在理解正確以後,畫出幾種插入的可能狀況,再跟着上述代碼理解幾遍,就慢慢清晰明朗了。
算法
int a = 3
; long b = 255L
;的形式來定義的,稱爲自動變量。值得注意的是,自動變量存的是字面值,不是類的實例,即不是類的引用,這裏並無類的存在。如int a = 3
; 這裏的a是一個指向int類型的引用,指向3這個字面值。這些字面值的數據,因爲大小可知,生存期可知(這些字面值固定定義在某個程序塊裏面,程序塊退出後,字段值就消失了),出於追求速度的緣由,就存在於棧中。首先,我先用鏈表實現的堆來實現隊列。經過在enqueue方法中調用addElement方法,就可以實現隊列的入隊,可是在入隊後進行了堆的插入中的排序?隊列是符合先進先出原則的,那麼我就修改了堆中的插入方法,將其中的排序刪掉。同理,當出隊時也不該該去考慮排序的問題。可是當我刪除掉刪除的排序後,再執行刪除隊列中前兩個元素,我卻發現刪除的並不必定是隊列的前兩個值,反而刪除掉了最開始跟的值和最末一個葉子,這是由堆的性質決定的。因此想要保持先進先出,咱們就要找到堆頂的左孩子而後刪除。因此咱們須要改變一下堆中的排序方法。鏈表的實現方法很麻煩,並且要改變刪除的排序算法須要考慮不少種狀況,在作了兩小時仍是不能完整正確的狀況下,讓咱們把目光投向數組。
spring
數組中只須要將刪除後的最末結點變成null就能夠達到效果。
數組
Crossing miles of frustrations and rivers a raging,picking up stones I found along the way.數據結構
怕不輕鬆,怕過輕鬆。
不再用以爲工做日長,由於天天好像都是工做日。想忙裏偷閒就忙裏偷閒,想抓緊作事就抓緊作事。ide
我將天天告訴本身:請對專業課程更加虔誠一點。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 0/0 | 1/1 | 8/8 |
第二週 | 621/621 | 1/2 | 12/20 |
第三週 | 678/1299 | 1/3 | 10/30 |
第四周 | 2734/4033 | 1/4 | 20/50 |
第五週 | 1100/5133 | 1/5 | 20/70 |
第六週 | 1574/6707 | 2/7 | 15/85 |
第七週 | 1803/8510 | 1/8 | 20/105 |
第八週 | 2855/11365 | 2/10 | 25/130 |