当按升序添加元素时,是否存在O(1)插入和删除的优先级队列?

时间:2014-10-10 03:17:19

标签: sorting data-structures queue priority-queue

无法建立O(1)插入和删除的优先级队列。毕竟,如果可能,那么可以在O(N)中对列表进行排序。但是,假设元素按升序添加 - 也就是说,在特定的使用实例中,添加的最后一个元素始终是要删除的第一个元素。那么,是否存在一个优先级队列,该队列将使用常量查找/删除进行该用途?

注意:我要求堆叠。我要求在这个特定的使用模式下退化为常量查找/删除的优先级队列 - 类似于对几乎排序的列表退化为O(N)最佳情况的排序算法。

2 个答案:

答案 0 :(得分:1)

使用按优先顺序降序排列的链接列表。

要删除元素,只需删除第一个元素即可。这总是O(1)。

添加元素:

  • 如果列表为空,只需插入元素。
  • 否则,请遍历列表,直到找到优先级较低的元素。在低优先级元素之前插入新元素。

在新元素具有最高优先级的情况下,这是O(1)。该算法将检查第一个元素,并且发现它不存在(在空列表的情况下)或者比新元素的优先级低。

答案 1 :(得分:0)

肯定没有什么能阻止你实施这样的野兽。

例如,当您向当前空集合中添加元素时,或者当项目仍以递增顺序进入时,您只需将该项目添加到堆栈。

但是,如果您在任何时候添加优先级 less 的项目,只需将所有堆栈条目移动到空队列(在下面的所有队列中,我的意思是优先级)在最终将新项目添加到该队列之前,在封面下排队。

清空队列后,您将再次恢复为默认堆栈。

所以,基本上,伪代码就是这样的。首先,实例变量:

class uberqueue:
    lastPrio = 0
    stack = []
    prioq = []

然后执行上述操作的put函数:

    def put (item):
        # Empty, use stack.

        if stack.size() == 0 and prioq.size() == 0:
            stack.push(item)
            lastPrio = item.prio
            return

        # Stacking and in order, add to stack.

        if stack.size() > 0 and item.prio >= lastPrio:
            stack.push(item)
            lastPrio = item.prio
            return

        # Stacking and out of order, transfer stack to queue.

        while stack.size() > 0:
            prioq.put(stock.pop())

        # Queueing, add to queue.

        prioq.put(item)

最后,get函数只从当前活动的底层结构(堆栈或队列)中获取一个项目:

    def get():
        # Just get from whatever underlying structure is in use.

        if stack.size() > 0:
            return stack.pop()

        return prioq.get()

并且,如果您遵循优先级排序指南,则可以使用它,这种数据结构可以提供O(1)插入/检索性能,但是会恢复为优先级队列性能。


事实上,如果堆栈和队列都提供了查看下一项优先级的能力,你甚至可以完全摆脱堆栈到队列的传输。

这样做的一种方法是在项目的优先级大于或等于顶部元素的优先级时将项目放入堆栈。这可确保堆栈中的所有项目都正确排序。所有无序项都直接进入优先级队列。

然后get功能必须稍微改变,偷看堆栈并排队以查看哪个具有最高优先级,并提取该优先级。

这有点棘手但在某些情况下可能会提供优势。