c++中,大根堆和小根堆可以使用優先佇列實現。
#include priority_queuepq1 // 大根堆
priority_queue, greater> pq2 // 小根堆
該stl支援自定義比較函式,但與sort不同,不支援直接使用lambda函式。自定義的小根堆如下。
struct cmp }; // 自定義小根堆
priority_queue, cmp> pq;
更加複雜的自定義函式可以參照【leetcode-1792】最大平均通過率。
大小根堆的前備知識為堆排序,具體是使用堆排序中的節點上浮(swim)和下沉(sink)實現。整體的資料結構可以使用vector
。push
新的數值時,將其放在陣列最後,然後與對應位置的父節點比較,進行上浮操作;pop
堆頂數值時,將該節點與隊尾數字交換,然後移除隊尾數字,並對當前交換後的堆頂元素進行下沉操作。具體**如下。
vectorpq; // 首位填充乙個數值,方便找根節點與子節點
void insert(int num)
int poptop()
int peektop()
bool isprior(int i, int j)
void swim(int i)
}void sink(int i)
}
堆(大根堆 小根堆)
堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...
堆(Heap)大根堆 小根堆
具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...
堆(Heap)大根堆 小根堆
目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...