利用堆實現優先順序佇列博文

2021-06-08 22:26:31 字數 1891 閱讀 5142

演算法研究(四)

用堆實現優先順序佇列

首先宣告:本人只是乙個菜鳥而已。。。。。。。

由於以後很多地方都會用到優先順序佇列的知識,所以在這裡先給大家講解一下。只是簡單的說明一下而已,並沒有深入的研究。

其實優先順序佇列的應用非常廣泛,比如說最大優先順序佇列就用在一台分時計算機進行作業排程。這種佇列對要執行的各種作業以及他們之間的相對優先順序關係加以記錄。當乙個作業做完或是被中斷時,用extract_max操作從所有等待的作業中,選擇出具有最高優先順序的作業。在任何時候乙個新的作業都可以用insert加入到佇列中去。

而最小優先順序佇列可被用在基於事件驅動的模擬器中。在這種應用中,佇列中的各項是要模擬事件,每乙個都有乙個發生時間作為關鍵字。事件模擬要按照各事件發生時間的順序進行,因為模擬某一事件可能導致稍後對其他事件的模擬。模擬程式的每一步都使用extrac_min來選擇下乙個模擬的事件。當乙個新事件產生時,使用insert將其放入佇列中。

所以大家也可以看出優先順序佇列確實很重要,不僅如此,大家以後在看我的博文還會不止一次的遇到什麼赫夫曼樹,b樹,二項堆。。。。。。廢話說了不少,直接入主題。

堆用heap[n]表示

1、     求maximum

說了利用堆實現,最大優先順序佇列對應的利用大頂堆實現。既然是大頂堆,我們知道堆頂的元素就是最大元素,所以我們可以直接返回堆頂元素:

return heap[1];

2、     取出最大元素

上面的操作只是返回最大元素,沒有真正從堆中取出最大元素,就像在赫夫曼樹中一樣,每次必須從樹中取出兩個頻度最小的結點,在樹中就沒有這兩個結點了。這裡也是一樣。我們需要注意的就是取出操作會破壞大頂堆的性質,我們要做的就是對堆進行變化使其可以再次符合大頂堆的性質。看過利用大頂堆的同學肯定已經想到了,對,就是利用max_heapify這個函式去實現對性質的穩定。分析過後,我們給出**:

heap_extract_max(int *heap)

int max =heap[1];

heap[1] =heap[heap_size];

heap_size--;

max_heapify(heap,1);

return max; }

3、     增大某個元素的值

和取出最大元素的情況類似,我們同樣可能會因為增大某個元素的值而導致我們的操作破壞了大頂堆的性質。操作也很類似,我們在取出最大元素時,是從結點1開始破壞的,所以我們必須從1開始重新穩定大頂堆。在這裡我們破壞了某個元素的大小,所以可以聯想我們也是從這個元素開始穩定,但是這裡相對就簡單多了,因為我們只要和該結點的雙親比較即可,因為原先它比雙親小,現在增大以後可能大於雙親了,但是其兄弟並沒有變化,所以每次只要不斷上傳並與其雙親交換,直到它比雙親結點小即可。

//增大指定元素的大小

void heap_increase_key(int *heap, int pos, int key)

heap[pos] =key;

while(pos> 1 && heap[parent(pos)] < heap[pos])//當雙親大於孩子時結束

} 4、     插入操作

插入操作的**並不難,也容易記住,但是值得我們注意的是它的思想,這個很值得我們去好好思考思考。我們想要在大頂堆插入乙個元素,常規的我們可能會想像二叉查詢樹那樣,但是那樣未免太麻煩了。這裡我們有了更好的做法,並且時間複雜度也很好。我們現在大頂堆的末尾插入乙個最小的元素,這從開始插入就符合大頂堆的性質(與之對應的是在最小優先順序佇列中,插入的是最大元素)所以在以後再改變這個元素的值,這樣就可以通過我們上面的那個增大元素值的函式,**也同樣無需重寫,大家感覺這是不是一種比較好的思想呢?反正我是感覺這樣挺好的。。

說完了直接給出**:

void max_heap_insert(int *heap, int key)

利用堆實現優先順序佇列就到這裡,很簡短,但是卻很重要,希望大家可以好好消化一下。

優先順序佇列(堆實現)

一 優先順序佇列定義 二 方法實現 獲得最大元素方法 去掉最大元素方法 修改優先順序方法 新增節點 三 實現 用堆實現乙個優先順序佇列 主要是新增 修改 刪除節點 節點具有唯一性 author hhf 2014年11月28日 public class priorityqueue 返回優先佇列中優先順...

優先順序佇列(堆實現)

優先順序佇列 概念 一般來說我們會根據事情的重要程度優先處理某事,比如完成學習任務和刷微博,我們會認為完成學習任務比較重要,因此會先執行它,因此在這種情況下,資料結構就應提供兩個基本的操作,一是返回最高優先順序物件,二是新增新的物件,這種資料結構就叫做優先順序佇列。二叉樹的順序儲存 儲存方式 使用陣...

堆(優先順序佇列)

c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...