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

时间:2016-01-10 17:35:30

标签: c++ algorithm stack time-complexity

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

添加示例以使其更清晰:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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