優先佇列和二叉堆

2022-02-28 19:28:33 字數 1545 閱讀 5091

優先佇列是一種常用的adt,其中的元素有序排列,入隊的元素會插入到正確的位置,隊首元素始終為最小(大)值,隊首出隊後優先佇列仍然保持原來的性質。

這裡我們規定優先佇列以公升序排列。

優先佇列提供的介面包括:

二叉堆是優先佇列一種常用的實現,二叉堆是一種完全二叉樹,完全二叉樹除最低一層外其它層均被填滿,最低一層的節點全部集中在左側。完全二叉樹的性質決定它可以很容易地由二叉陣列來實現。

二叉堆滿足堆序性,即任意乙個節點x的父節點不大於x(最小堆)。由堆序性可知,二叉堆的根節點一定為最小值或最大值,根節點為最小值的堆稱為最小堆,根節點為最大值的堆稱為最大堆。

最小堆類的宣告:

templateclass minheap ;

~minheap() = default;

};

插入元素採用上濾的方法:

(1)在陣列超出末端(size位置)建立乙個空穴

(2)比較新元素與空穴父節點的大小,若新元素較大則將原父節點填入空穴,原父節點的位置變為空穴

(3)直至新元素不大於空穴父節點時停止空穴上溯

templatevoid minheap::insert(val_t val) 

vec[i] = val;

}

在實現過程中,我們只是用i標記了空穴的位置,並沒有交換空穴與父節點的位置。

刪除元素採用恰好相反的下濾策略:

(1) 移除根節點後在根節點處產生了乙個空穴

(2) 比較空穴的左右子節點,較大的乙個與空穴交換位置,直至空穴到達最下層

(3) 將原來最後乙個元素填入空穴的位置

templatevoid minheap::rmmin() 

min = vec[1];

last = vec[size--];

for (i = 1; i * 2 <= size; i = next)

//if (last > vec[next])

else

}vec[i] = last;

}

#include //#include using namespace std;

templateclass minheap ;

~minheap() = default;

};templateminheap::minheap()

templatebool minheap::empty()

else

}templatevoid minheap::insert(val_t val)

vec[i] = val;

}templatevoid minheap::rmmin()

min = vec[1];

last = vec[size--];

for (i = 1; i * 2 <= size; i = next)

//if (last > vec[next])

else

}vec[i] = last;

}

優先佇列和二叉堆

優先佇列 我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於 先進 某種定義賦予它們不同的優先順序,優先順序更高的先出列。本文涉及的優先佇列優先順序定義是 數值越小,優先順序越高。也就是說,每次取出的元素都是當前...

二叉堆和優先佇列

優先佇列是一種用來維護由一組元素構成的集合s的資料結構,其中的每乙個元素都有乙個相關的值,稱為關鍵字。優先佇列有最大優先佇列和最小優先佇列。優先佇列和一般的fifo佇列不一樣,從優先佇列獲取出來的值是喲優先順序的。例如,用來處理傳送給計算機部門印表機的職位 部門主管發來的職位應該首先被列印,依次是經...

優先佇列 二叉堆

優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...