一、优先队列
优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。一个最大优先队列支持以下操作:
Insert(S, x):把元素x插入集合S中。
Maximum(S):返回S中具有最大键字的元素。
ExtractMax(S):去掉并返回S中的具有最大键字的元素。
IncreaseKey(S, x, k):将元素x的关键字值增加到k,这里假设k的值不小于x的原关键字值。
二、功能Maximum的实现
过程HeapMaximum可以在O(1)时间内实现Maximum操作:
int HeapMaximum(int* a)//返回优先队列a中具有的最大元素
{
return a[1];
}
三、功能ExtractMax的实现
过程HeaoExtractMax实现ExtractMax操作。它与堆排序中Heapsort()过程中for循环的部分非常相似:
int HeapExtractMax(int* a)//去掉并返回优先队列a中具有的最大元素
{
if (n > 1)
{
int maxa = a[1];
a[1] = a[n];
n--;
MaxHeapify(1);
return maxa;
}
else
return -inf;
}
时间复杂度为O(lgn)
四、功能IncreaseKey的实现
将a[o]改为key后,当前元素会不断与其父结点进行比较,如果当前元素的关键字比较大,则当前元素与其父结点进行交换。这一过程会不断重复,知道当前元素的关键字小于其父结点为止,因为此时已经重新符合了最大堆的性质。
函数HeapIncreaseKey()实现IncreaseKey,时间复杂度为O(lgn)
void HeapIncreaseKey(int* a, int o, int key)//将优先队列中a[o]增加到key
{
if (key >= a[o])
{
a[o] = key;
while (o > 1 && a[pr(o)] < a[o])
{
int res = a[o];
a[o] = a[pr(o)];
a[pr(o)] = res;
o = pr(o);
}
}
else
{
cout << -inf << endl;