SSH 的使用和配置
堆結構是一種陣列物件,是一棵完全二叉樹。
性質
若當前節點編號為i,父結點則為i/2,左孩子為2i,右孩子為2i+1。
堆的結點數\(\le\)陣列長度len
下圖為一個大根堆:每個結點均小於其父結點,樹根是堆中最大的結點,小根堆反之。
新增
往堆中新增一個元素。
重複n次新增操作,即可建立一個小根堆。
實現流程(以小根堆為例)
先在堆尾加入1個元素,並把這個結點置為當前結點。
比較當前結點和它的父結點的大小,
如果當前結點小於父結點,交換它們的值,把父結點置為當前結點。
重複以上過程。
如果當前結點大於等於父結點,結束。
取出堆頂
從堆中取出並刪除一個元素。
實現流程(以小根堆為例)
取出根結點的值。
把堆的最後一個結點(len)放到根的位置上,把根覆蓋掉。
把堆的長度減一。
把根結點置為當前結點。
如果當前節點無兒子(pa>len/2),結束。
否則,比較當前節點與其子節點的值,
如果當前節點的值小於等於其子節點,結束。
反之則交換這兩個結點的值,重複上述步驟,直至結束。
優先佇列
priority_queue<Type,Container,Functional>
Type是資料型別,Container是容器型別。
(Container必須是用陣列實現的容器,比如vector,deque等,但不能用list,STL裡預設用vector)
Functional是比較函式,當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大根堆。
標頭檔案
include
定義小根堆
priority_queue<int,vector
定義大根堆
priority_queue<int,vector
基本操作
empty()
如果佇列為空,則返回真。
pop()
刪除隊頭元素,即刪除第一個元素。
push()
加入一個元素。
size()
返回優先佇列中擁有的元素個數。
top()
返回優先佇列隊頭元素,即優先順序最高的元素。
在預設的優先佇列中,優先順序高的先出隊。
在預設的int型中先出隊的為較大的數。
堆排序
並非原創,僅是整理,請見諒