算法系列(十)堆实现优先队列
生活随笔
收集整理的這篇文章主要介紹了
算法系列(十)堆实现优先队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在算法系列(九)平衡二叉查找樹AVL樹中介紹了AVL樹。這篇文章主要講解優先隊列。
一般都使用二叉堆來實現優先隊列。暫時之說這種實現。
堆的定義和性質
堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非葉節點的關鍵字不大于或者不小于其左右孩子節點的關鍵字。
堆分為大頂堆和小頂堆,滿足Key[i]>=Key[2i+1]&&key>=key[2i+2]稱為大頂堆,
滿足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]稱為小頂堆。
由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。
堆的存儲
一般都用數組來表示堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。
堆的基本操作--插入刪除
插入的策略叫做上濾,刪除的策略叫做下濾。
堆排序
首先可以看到堆建好之后堆中第0個數據是堆中最小的數據。取出這個數據再執行下堆的刪除操作。這樣堆中第0個數據又是堆中最小的數據,重復上述步驟直至堆中只有一個數據時就直接取出這個數據。代碼實現
// 向堆中插入元素public static void insert(List heap, int value) {heap.add(value);// 開始上升操作heapUp2(heap, heap.size() - 1);// heapUp(heap, heap.size() - 1);} // 非遞歸實現public static void heapUp2(List heap, int index) {int parent = 0;for (; index > 1; index /= 2) {// 獲取index的父節點的下標parent = index / 2;// 獲得父節點的值int parentValue = (Integer) heap.get(parent);// 獲得index位置的值int indexValue = (Integer) heap.get(index);// 如果大于就交換if (parentValue > indexValue) {swap(heap, parent, index);}}} /*** 刪除堆中最小的值,也就是刪除位置是1的值,也就是根節點的值 操作原理是:當刪除根節點的數值時,原來的位置就會出現一個孔* 填充這個孔的方法就是,把最后的葉子的值賦給該孔,最后把該葉子刪除* * @param heap*/public static void deleteMin(List heap) {// 把最后的一個葉子的數值賦值給1個位置heap.set(1, heap.get(heap.size() - 1));// 下濾操作heapDown2(heap, 1);// heapDown(heap, 1);// 把最后一個位置的數字刪除heap.remove(heap.size() - 1);} // 非遞歸實現public static void heapDown2(List heap, int index) {int child = 0;// 存儲左兒子的位置int temp = (Integer) heap.get(index);int n = heap.size() - 2;// 如果有兒子的話for (; 2 * index <= n; index = child) {// 獲取左兒子的位置child = 2 * index;// 如果只有左兒子if (child == n) {child = 2 * index;} // 如果右兒子比左兒子的數值小else if ((Integer) heap.get(child) > (Integer) heap.get(child + 1)) {child++;}// 如果數值最小的兒子比temp的值小if ((Integer) heap.get(child) < temp) {// 交換堆中的child,和index位置的值swap(heap, child, index);} else {break;}}}
算法實現代碼github地址為https://github.com/robertjc/simplealgorithm
后續會不斷補充,有些地方寫的可能有問題,請多指教。
歡迎掃描二維碼,關注我的公眾賬號
總結
以上是生活随笔為你收集整理的算法系列(十)堆实现优先队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql left_mysql的lef
- 下一篇: opencv学习(六)之掩膜版