優先佇列(堆)基礎知識

2021-09-20 18:45:24 字數 2230 閱讀 3701

優先佇列是一種抽象資料型別,最重要的操作就是刪除最大元素(delmax())和插入元素(insert())。

二叉堆 能夠很好的實現優先佇列的基本操作

定義 當一顆二叉樹的每個結點都大於等於它的兩個子結點時,它被稱為堆有序。

在堆有序的二叉樹中,每個結點都小於等於它的父結點。從任意結點向上,我們都能得到一列非遞減的元素;從任意結點向下,我們都能得到一列非遞增的元素。

根結點是堆有序的二叉樹中的最大結點

二叉堆是一組能夠用堆有序的完全二叉樹排序的元素,並在陣列中按照層級儲存(不使用陣列的第乙個元素)

在乙個堆中,位置k的結點的父結點的位置為[k/2],而它的兩個子結點的位置分別為2k和2k+1。

用長度為n+1的私有陣列pq來表示乙個大小為n的堆(pq[0]不用)

輔助方法:

/**

* 比較元素的大小

* @param i

* @param j

* @return

*/private boolean less(int i,int j)

/**

* 交換兩個元素

* @param i

* @param j

*/private void exch(int i,int j)

由下至上的堆有序化(上浮)
/**

* 如果堆有序的狀態因為某個結點變得比它的父結點更大而被打破,

* 我們需要通過交換它和它的父結點來修復

* 位置為k的結點,它的父結點的位置為[k/2]

由上至下的堆有序化(下沉)

/**

* 如果堆有序的狀態因為某個結點變得比它的兩個子結點或是其中之一更小了而被打破,

* 我們可以通過將它和它的兩個子結點中的較大者來恢復堆

* 交換可能會繼續打破堆有序的狀態,需要不斷的用相同的方式將其修復

** 位置為k的結點,它的子結點的位置為[2k]或[2k+1]

插入元素insert()將新元素加到陣列末尾,增加堆的大小並讓這個新元素上浮到合適的位置。

刪除最大元素delmax()

從陣列頂端刪去最大的元素並將陣列最後乙個元素放到頂端,減小堆的大小並讓這個元素下沉到合適的位置

基於堆的優先佇列

優先佇列由乙個基於堆的完全二叉樹表示,儲存於陣列pq[1..n]中,pq[0]沒有使用。

insert()中,將n加1並把新元素新增在陣列最後,然後用swim()恢復堆的秩序。

delmax()中,從pq[1] 中得到需要返回的元素,然後將pq[n]移到pq[1],將n減1並用sink()恢復堆的秩序。同時我們還將不再使用的pq[n+1]設為null,以便系統**它所占用的空間。

優先佇列的基礎知識

優先佇列概念 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高所以我們無論按照什麼順序push一堆數,...

知識 優先佇列(堆)

標頭檔案 include queue 大根堆定義 priority queue int pq大根堆另一種定義 priority queue,less q 大根堆 小根堆定義 priority queue int vector int greater int pq 注意最後兩個 符號不要連在一起,否則...

優先佇列基礎知識 四 二項佇列

本文主要分析二項佇列。這個優先佇列結構也是為了處理對數時間合併兩個優先佇列而提出來的。它可是保證平均插入時間為常數。同時合併,刪除最小元操作的最壞時間為o logn 這比左式堆更優,左式堆和斜堆是沒辦法實現平均插入時間是常數時間的。二項佇列是通過樹結構來實現的,我們在乙個樹節點中儲存關鍵字,它的右兄...