優先佇列(priority queue)可以在o(1)時間內獲取最大值,並且在0(logn)時間內取出最大值或插入任意值.
優先佇列常常用堆(heap)來實現,堆是乙個完全二叉樹,其每個節點的值總是大於等於或小於等於子節點的值.實際
實現堆時,通常用乙個陣列而不是指標建立一盒樹.這是因為堆是完全二叉樹,所以利用陣列表示時,
(1)若根節點的位置為0,則位置i的節點的父節點一定為(i-1)/2,而它的兩個字節點的位置一定為2i+1和2i+2.
(2)若根節點的位置為1,則位置i的節點的父節點一定為i/2,而它的兩個字節點的位置一定為2i和2i+1.
堆的實現方式為:
如果乙個節點有兩個子節點,總是交換最大的子節點.
(1)上浮
如果乙個節點比父節點大,那麼需要交換這兩個節點,交換後還可能比它新的父節點大,因此需要不斷地進行比較和交換
操作.(2)下浮
類似地,如果乙個節點比父節點小,也需要不斷地向下進行比較和交換操作.
make_heap函式預設最大堆,less(),利用vector實現最大堆
#include #include using namespace std;
//根節點初始下標為1
class maxheap
//插入任意值,把新的數字放在最後一位,然後上浮
void push(int k)
//刪除最大值,把最後乙個數字挪到開頭,然後下沉
void pop()
//列印
void print()
}private:
//上浮
void swim(int pos)
}private:
vectorheap;
};int main(int argc,char* ar**);
maxheap heap;
for(auto& n:nums)
heap.print();
cout
heap.print();
return 0;
}
最大堆實現,python
堆 heap class maxheap 索引0不用,所以陣列大小應該是 n 1 左節點2i 右節點2i 1,父節點 i 2 def init self self.data 堆陣列容量不知道 self.count len self.data def size self return self.cou...
C 最大堆實現
max heap.h pragma once include template class max heap node heap 最大堆 uint32 t max size 最大儲存數 uint32 t size 儲存數 擴容 void expansion 刪除指定下標節點 void del nod...
python實現最大堆
堆是利用的完全二叉樹的性質,並且利用陣列來實現的一種特殊資料結構 class myheap object max heap def init self self.heap def add self,item self.heapity len self.heap 1 def show self pri...