📜  设计一个队列数据结构以在O(1)时间中获得最小值或最大值(1)

📅  最后修改于: 2023-12-03 15:12:08.505000             🧑  作者: Mango

使用双端队列实现O(1)时间获取最小值或最大值的数据结构

简介

在许多应用中,需要维护一个队列,并能快速地获取队列中的最小值或最大值。例如,在一个任务队列中,我们需要按照优先级顺序处理任务;在一个股票买卖系统中,我们需要按照股票价格排序买卖请求,等等。

本文将介绍一种基于双端队列的高效数据结构,可以在O(1)时间内获取队列的最小值或最大值。

双端队列

双端队列(Deque,全称为“double-ended queue”)是一种允许我们从队列的两端添加或删除元素的数据结构。双端队列可以看作是一种特殊的栈(stack)或队列(queue),它支持的操作如下:

  • push_front(x):在队头添加元素x
  • push_back(x):在队尾添加元素x
  • pop_front():弹出并返回队头元素
  • pop_back():弹出并返回队尾元素
  • front():返回队头元素
  • back():返回队尾元素
  • empty():判断队列是否为空

我们可以使用双端队列来实现一个O(1)时间获取最小值或最大值的队列数据结构。

设计思路

我们假设需要维护一个从小到大排序的队列。我们用一个双端队列来保存队列中的元素,用另一个双端队列来保存当前的最小值序列。

如果新加入的元素比当前最小值还要小,那么我们需要更新最小值序列;如果弹出的元素是最小值,我们也需要更新最小值序列。

具体来说,每次压入元素前,我们将新加入的元素和当前最小值序列的队尾比较,如果比队尾元素小,那么将队尾元素弹出,直到队尾元素比新元素小为止。这保证了最小值序列中的元素始终是递增的。

每次弹出元素时,我们判断队头元素是否和最小值队列的队头相同,如果是,那么最小值队列的队头也需要弹出。

这样做的好处是我们不需要在每次操作时都重新排序队列,因为我们已经保证了最小值队列的队头元素是当前最小的值。

同样,我们可以用一个双端队列来维护最大值序列,只需将“小”改为“大”即可。

代码实现

下面是一个Python实现的例子:

class MinMaxQueue:
    def __init__(self):
        self.minq = []  # 保存最小值序列
        self.maxq = []  # 保存最大值序列
        self.q = []     # 保存元素序列

    def push(self, x):
        while self.minq and x < self.minq[-1]:
            self.minq.pop()
        self.minq.append(x)
        while self.maxq and x > self.maxq[-1]:
            self.maxq.pop()
        self.maxq.append(x)
        self.q.append(x)

    def pop(self):
        if not self.q:
            raise IndexError("pop from empty queue")
        x = self.q.pop(0)
        if x == self.minq[0]:
            self.minq.pop(0)
        if x == self.maxq[0]:
            self.maxq.pop(0)
        return x

    def empty(self):
        return not self.q

    def get_min(self):
        if not self.q:
            raise IndexError("get_min from empty queue")
        return self.minq[0]

    def get_max(self):
        if not self.q:
            raise IndexError("get_max from empty queue")
        return self.maxq[0]
总结

本文介绍了一种使用双端队列实现O(1)时间获取最小值或最大值的队列数据结构。这个数据结构在实际应用中十分有用,例如在任务队列、股票买卖系统等场景中,它能快速地找到队列中最高/最低优先级的任务或最高/最低价值的股票。