算法导论的C++实现——4.优先队列的原理与实现

本文详细介绍了如何使用C++实现优先队列,包括Maximum、ExtractMax、IncreaseKey和Insert四个核心操作的原理及实现,并通过源代码展示了具体过程。通过堆数据结构,每个操作的时间复杂度在O(lgn)级别,有效保证了优先队列的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、优先队列

优先队列是一种用来维护由一组元素构成的集合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;
		
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值