使用2个堆栈在O(1)中执行extractMin操作

extractMin operation in O(1) using 2 stacks

本文关键字:执行 extractMin 操作 2个 堆栈 使用      更新时间:2023-10-16

给定一个连续的整数流和两个堆栈。我想实现extractMin操作,它在O(1)复杂度下运行。此操作从记录中弹出最小元素并返回。基本解决方案是使用2个堆栈将数据按反向排序。通过这种方式,我们可以简单地弹出包含数据的堆栈的顶部元素。但这样一来,每个整数的插入都是O(N)。我可以在插入中获得更好的复杂性吗,保持extractMin操作为O(1)。

添加示例使其更加清晰:

10,-20,2,-3,-5,10,20(任何时刻的整数流)。

extractMin() // returns -20
extractMin() // returns -5

使用堆栈无法获得更好的复杂性。即使你要求使用堆栈进行持续提取,这个问题的措辞似乎并没有明确禁止使用其他数据结构。

在我的回答的早期版本中,我建议使用min-heap,它在堆的构建过程中平均具有常量插入(在最坏的情况下,单个插入是对数的)。然而,堆不允许常量提取,而只允许对数提取。

要获得多个值的常量提取,需要对所有值进行排序。在比堆栈更复杂的情况下实现这一点的一种方法是建立一个二进制搜索树,同时跟踪最小的节点。使用平衡bst,可以实现对数插入。要获得恒定的单独提取,还需要在每个节点中存储一个父指针。但是,如果您只需要按顺序遍历所有值,那么就不需要指针。