双端优先队列 (DEPQ)


双端优先队列 (DEPQ) 或双端堆被定义为一种类似于数据结构优先队列,但允许根据存储在结构中的键或项目的某种排序有效地删除最大值和最小值。DEPQ 中的每个元素都与一个优先级或值相关联。在 DEPQ 中,可以按升序和降序消除或删除元素。

操作

双端优先队列包含以下操作

isEmpty()

此函数负责检查 DEPQ 是否为空,如果为空则返回 true。

size()

此函数负责返回 DEPQ 中存在的元素总数。

getMin(y)

此函数负责返回优先级最低的元素 y。

getMax(y)

此函数负责返回优先级最高的元素 y。

put(y)

此函数负责将元素 y 插入 DEPQ 中。

removeMin(y)

此函数负责删除优先级最低的元素 y 并返回此元素。

removeMax(y)

此函数负责删除优先级最高的元素 y 并返回此元素。

实现

双端优先队列可以从平衡二叉搜索树(其中最小和最大元素分别被视为最左和最右叶子)构建或形成,或者实现专门的数据结构,如最小-最大堆和配对堆。

从普通优先队列获得双端优先队列的通用方法是

双结构方法

根据此方法,设置或维护两个不同的优先队列以用于最小值和最大值。两个优先队列中的相同元素通过对应指针显示或展示。

这里,最小和最大元素分别表示为最小堆和最大堆的根节点中包含的值。

删除最小元素 - 对最小堆执行 removemin() 操作,并对最大堆执行 remove(节点值) 操作,其中节点值定义为最大堆中对应节点的值。

删除最大元素 - 对最大堆执行 removemax() 操作,并对最小堆执行 remove(节点值) 操作,其中节点值定义为最小堆中对应节点的值。

总对应

一半的元素在最小优先队列中,另一半在最大优先队列中。最小优先队列中的每个元素与最大优先队列中的一个元素一一对应。如果 DEPQ 中的元素数量指示奇数值,则其中一个元素保留在缓冲区中,即特定的存储区域。最小优先队列中每个元素的优先级都小于或等于最大优先队列中对应元素的优先级。

叶子对应

根据此方法,只有最小和最大优先队列的叶子元素形成对应的一一配对。非叶子元素不需要形成一一对应配对。

区间堆

除了上述对应方法外,DEPQ 可以通过完美实现区间堆来获得。区间堆就像一个嵌入的最小-最大堆,其中每个节点包含两个元素。它被定义为一个完全二叉树,其中 -

  • 左元素始终小于或等于右元素。
  • 这两个元素都定义或指定一个闭区间。
  • 除根节点外的任何节点表示的区间表示为父节点的子区间。
  • 左侧的元素定义或表示最小堆
  • 右侧的元素定义或表示最大堆

更新于: 2020年1月2日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告