<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
堆的歷史
堆的資料結構有很多種體現形式,包括;2-3堆、B堆、斐波那契堆,而在 Java API 中最常用的是用於實現優先佇列的二元堆積,它是由 JWJ Williams 在 1964 年引入的,作為堆排序演演算法的資料結構。另外在 Dijkstra 演演算法等幾種高效的圖演演算法中,堆也是非常重要的。
在電腦科學中,堆(heap) 的實現是一種基於樹的特殊的資料結構,它可以在陣列上構建出樹的結構體,並滿足堆的屬性;
最小堆:如果P 是C 的一個父級節點, 那麼P 的key(或value)應小於或等於C 的對應值。
最大堆:與最小堆的定義正好相反,最大堆(max heap) ,P 的key(或value)大於C 的對應值。
堆的實現在 Java API 中主要體現在延遲佇列的實現二元堆積上,這裡小傅哥單獨把這部分程式碼拆分出來,瞭解下關於小堆和大堆的實現。
從對堆的資料結構介紹上可以看到,小堆和大堆的唯一區別僅是對元素的排序方式不同。所以也就是說在存放和獲取元素的時候對元素的填充和摘除時,排序方式不同而已。
堆的在存放元素時,以遵循它的特點,會在存放過程中,通過隊尾元素向上比對遷移。
private void siftUpComparable(int k, E x) { logger.info("【入隊】元素:{} 當前佇列:{}", JSON.toJSONString(x), JSON.toJSONString(queue)); while (k > 0) { // 獲取父節點Idx,相當於除以2 int parent = (k - 1) >>> 1; logger.info("【入隊】尋找當前節點的父節點位置。k:{} parent:{}", k, parent); Object e = queue[parent]; // 如果當前位置元素,大於父節點元素,則退出迴圈 if (compareTo(x, (E) e) >= 0) { logger.info("【入隊】值比對,父節點:{} 目標節點:{}", JSON.toJSONString(e), JSON.toJSONString(x)); break; } // 相反父節點位置大於當前位置元素,則進行替換 logger.info("【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:{} 存放到位置:{}", JSON.toJSONString(e), k); queue[k] = e; k = parent; } queue[k] = x; logger.info("【入隊】完成 Idx:{} Val:{} rn當前佇列:{} rn", k, JSON.toJSONString(x), JSON.toJSONString(queue)); }
入堆的實現 add 方法最終會呼叫到 siftUpComparable 方法,進行排序的方式進行處理。而這個排序 compareTo 方法是由具體的 MinHeap、MaxHeap 來做實現。
以入堆元素2舉例,如圖所示入堆過程。
首先將元素2掛到佇列尾部,之後通過 (k - 1) >>> 1 計算父節點位置,與對應元素進行比對和判斷交換。
交換過程包括 2->6、2->5,以此交換結束後元素儲存完畢。
元素的出堆其實很簡單,只要把根元素直接刪除彈出即可。但剩餘接下里的步驟才是複雜的,因為需要在根元素遷移走後,尋找另外的最小元素遷移到對頭。這個過程與入堆正好相反,這是一個不斷向下遷移的過程。
private void siftDownComparable(int k, E x) { // 先找出中介軟體節點 int half = size >>> 1; while (k < half) { // 找到左子節點和右子節點,兩個節點進行比較,找出最大的值 int child = (k << 1) + 1; Object c = queue[child]; int right = child + 1; // 左子節點與右子節點比較,取最小的節點 if (right < size && compareTo((E) c, (E) queue[right]) > 0) { logger.info("【出隊】左右子節點比對,獲取最小值。left:{} right:{}", JSON.toJSONString(c), JSON.toJSONString(queue[right])); c = queue[child = right]; } // 目標值與c比較,當目標值小於c值,退出迴圈。說明此時目標值所在位置適合,遷移完成。 if (compareTo(x, (E) c) <= 0) { break; } // 目標值小於c值,位置替換,繼續比較 logger.info("【出隊】替換過程,節點的值比對。上節點:{} 下節點:{} 位置替換", JSON.toJSONString(queue[k]), JSON.toJSONString(c)); queue[k] = c; k = child; } // 把目標值放到對應位置 logger.info("【出隊】替換結果,最終更換位置。Idx:{} Val:{}", k, JSON.toJSONString(x)); queue[k] = x; }
不斷地向下遷移元素。這個過程會比對左右子節點的值,找到最小的。所以整個過程會比入堆麻煩一些。
這裡以彈出元素1舉例,之後將堆尾元素替換到相應的位置。整個過程分為6張圖表述。
小堆是一個正序比對
public class MinHeap extends Heap<Integer> { @Override public int compareTo(Integer firstElement, Integer secondElement) { return firstElement.compareTo(secondElement); } }
測試
@Test public void test_min_heap() { MinHeap heap = new MinHeap(); // 存入元素 heap.add(1); heap.add(3); heap.add(5); heap.add(11); heap.add(4); heap.add(6); heap.add(7); heap.add(12); heap.add(15); heap.add(10); heap.add(9); heap.add(8); // 彈出元素 while (heap.peek() != null){ logger.info("測試結果:{}", heap.poll()); } }
結果
17:21:30.053 [main] INFO queue.PriorityQueue - 【入隊】元素:3 當前佇列:[1,null,null,null,null,null,null,null,null,null,null]
17:21:30.055 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:1 parent:0
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:1 目標節點:3
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:1 Val:3
當前佇列:[1,3,null,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:5 當前佇列:[1,3,null,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:2 parent:0
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:1 目標節點:5
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:2 Val:5
當前佇列:[1,3,5,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:11 當前佇列:[1,3,5,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:3 parent:1
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:3 目標節點:11
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:3 Val:11
當前佇列:[1,3,5,11,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:4 當前佇列:[1,3,5,11,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:4 parent:1
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:3 目標節點:4
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:4 Val:4
當前佇列:[1,3,5,11,4,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:6 當前佇列:[1,3,5,11,4,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:5 parent:2
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:5 目標節點:6
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:5 Val:6
當前佇列:[1,3,5,11,4,6,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:7 當前佇列:[1,3,5,11,4,6,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:6 parent:2
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:5 目標節點:7
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:6 Val:7
當前佇列:[1,3,5,11,4,6,7,null,null,null,null] 17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:12 當前佇列:[1,3,5,11,4,6,7,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:7 parent:3
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:11 目標節點:12
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:7 Val:12
當前佇列:[1,3,5,11,4,6,7,12,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】元素:15 當前佇列:[1,3,5,11,4,6,7,12,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:8 parent:3
17:21:30.056 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:11 目標節點:15
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:8 Val:15
當前佇列:[1,3,5,11,4,6,7,12,15,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】元素:10 當前佇列:[1,3,5,11,4,6,7,12,15,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:9 parent:4
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:4 目標節點:10
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:9 Val:10
當前佇列:[1,3,5,11,4,6,7,12,15,10,null]
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】元素:9 當前佇列:[1,3,5,11,4,6,7,12,15,10,null]
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:10 parent:4
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:4 目標節點:9
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:10 Val:9
當前佇列:[1,3,5,11,4,6,7,12,15,10,9]
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】元素:8 當前佇列:[1,3,5,11,4,6,7,12,15,10,9,null,null,null,null,null,null,null,null,null,null,null,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:11 parent:5
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:6 目標節點:8
17:21:30.057 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:11 Val:8
當前佇列:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:1 下節點:3 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:11 right:4
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:3 下節點:4 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:10 right:9
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:4 Val:8
17:21:30.057 [main] INFO heap.__test__.HeapTest - 測試結果:1
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:3 下節點:4 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:11 right:8
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:4 下節點:8 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:4 Val:9
17:21:30.057 [main] INFO heap.__test__.HeapTest - 測試結果:3
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:8 right:5
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:4 下節點:5 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:5 下節點:6 位置替換
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:5 Val:10
17:21:30.057 [main] INFO heap.__test__.HeapTest - 測試結果:4
17:21:30.057 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:8 right:6
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:5 下節點:6 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:10 right:7
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:6 下節點:7 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:6 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:5
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:8 right:7
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:6 下節點:7 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:7 下節點:10 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:5 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:6
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:7 下節點:8 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:11 right:9
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:8 下節點:9 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:4 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:7
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:8 下節點:9 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:9 下節點:11 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:3 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:8
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:11 right:10
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:9 下節點:10 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:2 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:9
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:10 下節點:11 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:1 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:10
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:11 下節點:12 位置替換
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:1 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:11
17:21:30.058 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:0 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:12
17:21:30.058 [main] INFO heap.__test__.HeapTest - 測試結果:15
Process finished with exit code 0
小堆就是一個正序的輸出結果,從小到大的排序和輸出。
小堆空間:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]
小堆是一個反序比對
public class MaxHeap extends Heap<Integer> { @Override public int compareTo(Integer firstElement, Integer secondElement) { return secondElement.compareTo(firstElement); } }
測試
@Test public void test_max_heap() { MaxHeap heap = new MaxHeap(); // 存入元素 heap.add(1); heap.add(3); heap.add(5); heap.add(11); heap.add(4); heap.add(6); heap.add(7); heap.add(12); heap.add(15); heap.add(10); heap.add(9); heap.add(8); // 彈出元素 while (heap.peek() != null){ logger.info("測試結果:{}", heap.poll()); } }
結果
17:23:45.079 [main] INFO queue.PriorityQueue - 【入隊】元素:3 當前佇列:[1,null,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:1 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:1 存放到位置:1
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:0 Val:3
當前佇列:[3,1,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】元素:5 當前佇列:[3,1,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:2 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:3 存放到位置:2
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:0 Val:5
當前佇列:[5,1,3,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】元素:11 當前佇列:[5,1,3,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:3 parent:1
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:1 存放到位置:3
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:1 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:5 存放到位置:1
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:0 Val:11
當前佇列:[11,5,3,1,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue - 【入隊】元素:4 當前佇列:[11,5,3,1,null,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:4 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:5 目標節點:4
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:4 Val:4
當前佇列:[11,5,3,1,4,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】元素:6 當前佇列:[11,5,3,1,4,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:5 parent:2
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:3 存放到位置:5
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:2 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:11 目標節點:6
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:2 Val:6
當前佇列:[11,5,6,1,4,3,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】元素:7 當前佇列:[11,5,6,1,4,3,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:6 parent:2
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:6 存放到位置:6
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:2 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:11 目標節點:7
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:2 Val:7
當前佇列:[11,5,7,1,4,3,6,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】元素:12 當前佇列:[11,5,7,1,4,3,6,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:7 parent:3
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:1 存放到位置:7
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:3 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:5 存放到位置:3
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:1 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:11 存放到位置:1
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:0 Val:12
當前佇列:[12,11,7,5,4,3,6,1,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】元素:15 當前佇列:[12,11,7,5,4,3,6,1,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:8 parent:3
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:5 存放到位置:8
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:3 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:11 存放到位置:3
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:1 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:12 存放到位置:1
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:0 Val:15
當前佇列:[15,12,7,11,4,3,6,1,5,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】元素:10 當前佇列:[15,12,7,11,4,3,6,1,5,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:9 parent:4
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:4 存放到位置:9
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:4 parent:1
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:12 目標節點:10
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:4 Val:10
當前佇列:[15,12,7,11,10,3,6,1,5,4,null]
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】元素:9 當前佇列:[15,12,7,11,10,3,6,1,5,4,null]
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:10 parent:4
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:10 目標節點:9
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:10 Val:9
當前佇列:[15,12,7,11,10,3,6,1,5,4,9]
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】元素:8 當前佇列:[15,12,7,11,10,3,6,1,5,4,9,null,null,null,null,null,null,null,null,null,null,null,null,null]
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:11 parent:5
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:3 存放到位置:11
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:5 parent:2
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】替換過程,父子節點位置替換,繼續迴圈。父節點值:7 存放到位置:5
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】尋找當前節點的父節點位置。k:2 parent:0
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】值比對,父節點:15 目標節點:8
17:23:45.083 [main] INFO queue.PriorityQueue - 【入隊】完成 Idx:2 Val:8
當前佇列:[15,12,8,11,10,7,6,1,5,4,9,3,null,null,null,null,null,null,null,null,null,null,null,null]
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:15 下節點:12 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:12 下節點:11 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:1 right:5
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:11 下節點:5 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:8 Val:3
17:23:45.083 [main] INFO heap.__test__.HeapTest - 測試結果:15
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:12 下節點:11 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:5 right:10
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:11 下節點:10 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:4 Val:9
17:23:45.083 [main] INFO heap.__test__.HeapTest - 測試結果:12
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:11 下節點:10 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:5 right:9
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:10 下節點:9 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:4 Val:4
17:23:45.083 [main] INFO heap.__test__.HeapTest - 測試結果:11
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:10 下節點:9 位置替換
17:23:45.083 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:9 下節點:5 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:3 Val:3
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:10
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:5 right:8
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:9 下節點:8 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:8 下節點:7 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:5 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:9
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:5 right:7
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:8 下節點:7 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:2 Val:6
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:8
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】左右子節點比對,獲取最小值。left:5 right:6
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:7 下節點:6 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:2 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:7
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:6 下節點:5 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:1 Val:4
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:6
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:5 下節點:4 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:1 Val:3
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:5
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換過程,節點的值比對。上節點:4 下節點:3 位置替換
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:1 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:4
17:23:45.084 [main] INFO queue.PriorityQueue - 【出隊】替換結果,最終更換位置。Idx:0 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:3
17:23:45.084 [main] INFO heap.__test__.HeapTest - 測試結果:1
Process finished with exit code 0
大堆就是一個反序的輸出結果,從大到小的排序和輸出。
大堆空間:[15,12,8,11,10,7,6,1,5,4,9,3,null,null,null,null,null,null,null,null,null,null,null,null]
以上就是Java資料結構之最小堆和最大堆的原理及實現詳解的詳細內容,更多關於Java資料結構 堆的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45