addElement removeMin findMin
調整重排序,當創建起一個二叉樹後,若是須要將其轉化爲一個最小堆,那麼就要通過數個步驟。
1.調整過程當中,老是將根結點(被調整結點)與左右孩子比較;
2.不知足堆條件時,將根結點與左右孩子中較大者交換;
3.這個調整過程一直進行到全部子樹都是堆或者交換到葉子爲止。從哪一個結點開始呢?根據經驗,從第n/2個元素開始,若n爲奇數,擇不保留小數。依次遞減。例如,n爲8,則從第四個開始,而後從第三個,第二個依次與子結點比較。每通過一次比較,都能找出現有樹的一個最小值。html
順帶一提,在數據空間中一樣也有堆棧一說,但與咱們如今所學的數據結構的堆和棧有很大區別java
問題2理解:首先明確何爲優先級隊列。第一,具備更高優先級的項目在先。第二具備相同優先級項目使用先進先出方法來肯定其排序。顯然堆不是一個隊列。並且,他甚至不是線性結構,但正由於其非線性結構,使得在各方面都有方便之處。例如,一個普通的隊列,只能在兩端進行插入刪除操做。可是做爲非線性數據結構的堆(樹)便不受這種限制。根據優先度可隨意插入刪除元素,且有着高效的查找效率。所以,從多個角度來講,其都是一種高效的優先級隊列實現。node
問題解決方案:用堆實現隊列。隊列須要先進先出,用堆怎樣實現?和別的同窗交流一波並結合本身的理解,我有了這幾種思路。第一種,利用書上的優先級隊列進行實現。例如,我先輸入五個數,則第一個輸入的數的優先級爲5,依次類推。也就是說,利用優先級來表明那個最早出來。由於不存在同時兩個數進入數組,因此也就不會出現優先級相同的狀況。git
public void addElement(T object, int priority) { PrioritizedObject<T> obj = new PrioritizedObject<T>(object, priority); super.addElement(obj); } public T removeNext() { PrioritizedObject<T> obj = (PrioritizedObject<T>)super.removeMin(); return obj.getElement(); }
測試類是這樣的api
PriorityQueue pq= new PriorityQueue(); pq.addElement("a",1); pq.addElement("b",2); pq.addElement("c",3); pq.addElement("o",4); pq.addElement("g",5); pq.addElement("cyka bylat",6); System.out.println(pq.removeNext()); pq.addElement("edd mounted",5); System.out.println(pq.removeNext());
運行結果是這樣的數組
第二種思路呢,就是以已有的LinkedHeap爲基礎,加上一個變量,這個變量的意義就是肯定前後順序,畢竟,堆不能被限制只能在兩端操做,那麼咱們就以其前後順序爲其結點的比較值。詳細地說,我輸入一組數「55,23,78,66,12」那麼第一個輸入的數55的order爲1,依次類推。同時,不能忘記的是,咱們偏偏是使用小頂堆實現的,因此移除元素時,將小order的先出。將removeMin略加改造就好了。數據結構
public void addElement(T obj) { HeapNode<T> node = new HeapNode<T>(obj); node.setOrder(count); count++; if (root == null) root=node; else { HeapNode<T> nextParent = getNextParentAdd(); if (nextParent.getLeft() == null) nextParent.setLeft(node); else nextParent.setRight(node); node.setParent(nextParent); } lastNode = node; modCount++; if (size() > 1) heapifyAdd(); }
這裏就是關鍵代碼,刪除部分基本沒什麼變化。就不贅述了ide
這道題我真的不懂,待我問問學習
堆的學習還行,主要是利用了樹的性質,而後有了一些有趣的性質測試
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 3/3 | |
第二週 | 409/409 | 1/2 | 5/8 | |
第三週 | 1174/1583 | 1/3 | 10/18 | |
第四周 | 1843/3426 | 2/5 | 10/28 | |
第五週 | 539/3965 | 2/7 | 20/48 | |
第六週 | 965/4936 | 1/8 | 20/68 | |
第七週 | 766/5702 | 1/9 | 20/88 | |
第八週 | 1562/7264 | 2/11 | 20/108 |