双端优先队列是什么,希望高人详细解释一下。

来源:百度知道 编辑:UC知道 时间:2024/06/06 11:49:09

双端优先队列是一个支持如下操作的数据结构:

Insert(S, x)x插入集合S
Extract-Min(S)删除最小关键字
Extract-Max(S)删除最大关键字
用小大根交替堆实现上述操作。小大根交替堆是满足如下条件的完全二元树:如树不空,那么其上每个元素有一称为关键字的域,且针对该关键字二元树按层次形成了小大根交替的形式,即对于任何一结点x,如x位于小根层次,那么x是以x为根节点的二元树中键值最小的结点,称该结点为一个小根结点。如果x位于大根层次,那么x是以x为根节点的最大结点,称该结点为一大根结点。交替堆中根结点位于小根层次。
假设要在上图的堆中插入键值为5的元素。小大根交替堆上的插入算法也要针对从新插入结点到根结点的路径进行处理。需要比较键值5和父结点键值(10)的大小关系,由于10位于小根层次且5<10,就决定5定比从新加结点到根结点路径上的所有大根结点都要小,即5无论放在那里都不影响大根层次的性质,插入5时需调整从新加结点到根结点路径上的小根结点就使整个堆满足性质。调整过程:5<10,所以10下移填新结点;接着,5和7比较,5<7,所以7填到原来10的位置;最后将5填入根结点。
考虑在上图中插入键值80的元素。10仍处于小根,80>10,有80大于从新加结点到根结点路径上的所有小根结点,决定插入80时只需调整从新加结点到根结点路径上的大根就能使整个堆满足性质。只有一满足条件的结点——键值40的结点。80>40,40将下移填入新加结点,80将填入原40结点所占位置。
如我们要删除堆中键值最小的元素,那么删除的是根结点,对于上图,就是7。删除7以后,堆中就剩下11个元素,拟用最后一个元素(键值12)重填。和普通的小根堆类似,重填将引起从根到叶的检查。
考虑实现元素item对根结点的重填,需分析两种情况:
如根没有儿子结点。
item直接填入根结点即可。
如根至少存在一个儿子结点。堆中键值最小的结点定出现在根结点儿子或孙子中,可以容易找到,标记为k。再分成几种进行考虑:
item.key <= heap[k].key。
item直接插入根结点,因为