優先佇列(堆)

2021-08-10 07:37:25 字數 2031 閱讀 9268

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,在隊頭刪除。在優先佇列中,元素被賦予優先順序,當訪問元素時,具有最高優先順序的元素最先刪除。

優先佇列允許至少下列兩種操作的資料結構:insert(插入)、deletemin(刪除最小者),它的工作是找出、返回和刪除優先佇列中最小的元素。insert相當於入隊,而deletemin相當於出隊。

優先佇列可以應用於外部排序、貪婪演算法中實現優先佇列通過反覆求出最小元進行計算等。

堆的結構

堆是一棵被全完填滿的二叉樹。一棵高為h的二叉樹有 2^h 到 2^(h+1)-1 個節點。下圖是乙個完全二叉樹:

圖1   一棵完全二叉樹

完全二叉樹的的高是[logn],顯然它是o(logn).

完全二叉樹的規律性,因此它可以用乙個陣列表示。對於陣列中任一位置i上的元素,其左兒子在位置2i上,右兒子在左兒子後的單元(2i+1)上,它的父親則在i/2上。

圖2   完全二叉樹的陣列實現

堆資料結構組成:乙個陣列、乙個代表最大值的整數、當前的堆大小

主要操作

insert(插入)

為將乙個元素x插入到堆中,我們在下乙個空閒位置建立乙個空穴,否則該堆將不是完全樹。如果x可以放在該空穴中而不破壞堆的序,那麼插入完成。否則,我們把空穴的父節點上的元素移入該穴中,這樣,空穴就朝著根的方向上行一步。繼續該過程直到x能被放入空穴中為止。這種一般的策略叫做上濾,新元素在堆中上濾直到找出正確的位置。

如果欲插入的元素是新的最小元從而一直上濾到根處,插入的時間複雜度為o(logn)。

deletemin(刪除)

刪除乙個最小元,在根節點處產生了乙個空穴。由於現在堆少了乙個元素,因此堆中最後乙個元素x必須移動到該堆的某個地方。如果x可以被放到空穴中,那麼deletemin完成。不過這一般不太可能,因此我們將空穴的兩個兒子中較小者移入空穴,這樣就把空穴向下推了一層。重複該步驟知道x可以被放入空穴中。因此,我們的作法是將x置入沿著從根開始包含最小兒子的一條路徑上的乙個正確的位置。

該演算法的最壞情形執行時間為o(logn)。平均而言,被放到根處的元素幾乎下濾到堆的底層,因此平均執行時間為o(logn)。

buildheap(構建堆)

buildheap(h)操作把n個關鍵字作為輸入並把它們放入空堆中。這可以使用n個相繼的insert操作來完成。由於每個insert將花費o(1)平均時間以及o(logn)的最壞情形時間,因此該演算法總的執行時間則是o(n)平均時間而不是o(nlogn)最壞情形時間。

一般的演算法是將n個關鍵字以任意順序放入樹中,保持結構特性。此時,如果percolatedown(i)從節點i下濾,那麼將建立一棵具有堆序的樹:

for( i =n/2; i>0; i--)

percolatedown(i);

例程

#includestatic int minsize = 100;   //堆大小

typedef struct heapstruct heapstruct;

int isfull(heapstruct*);

int isempty(heapstruct*);

void error(char *message)

heapstruct* initialize(int maxelements) //初始化乙個堆

void insert(int x, heapstruct *h) //堆的插入操作

int deletemin(heapstruct *h) //堆的刪除操作

h->value[i] = last;

return min;

}

優先佇列《堆》

1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...

優先佇列 堆

印表機列印作業一般是放在佇列中的。如果按照先來先列印的順序,有乙個100頁的列印任務,那麼會讓後面短小的任務等待很長時間。更合理的做法也許是最後處理最耗時的列印任務,不管它是不是最後提交上來的。在多使用者作業系統中,作業系統讓哪個程式使用cpu,是需要決定從佇列裡面選擇的。一般做法是從隊頭獲得程式,...

優先佇列 堆

優先佇列 佇列是乙個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插入相當於入隊,刪除最小相當於出隊。鍊錶,二叉...