【发布时间】:2011-10-31 23:14:38
【问题描述】:
在 this earlier question 中,OP 要求提供一个类似于堆栈的数据结构,每次在 O(1) 时间内支持以下操作:
- Push,在堆栈顶部添加一个新元素,
- Pop,从堆栈中移除顶部元素,
- Find-Max,返回(但不删除)堆栈的最大元素,并且
- Find-Min,返回(但不删除)堆栈的最小元素。
几分钟前,我发现 this related question 要求澄清一个类似的数据结构,它不允许查询最大值和最小值,而是允许堆栈的中间元素被查询。这两种数据结构似乎是支持以下操作的更通用数据结构的特例:
- Push,将元素压入栈顶,
- pop,弹出栈顶,和
- Find-Kth,对于在创建结构时确定的固定 k,返回堆栈的第 k 个最大元素。
可以通过存储一个堆栈和一个包含前 k 个元素的平衡二叉搜索树来支持所有这些操作,这将使所有这些操作在 O(log k) 时间内运行。我的问题是:是否有可能比这更快地实现上述数据结构?也就是说,我们可以得到所有三个操作的 O(1) 吗?或者也许 O(1) 用于推送和弹出,O(log k) 用于订单统计查找?
【问题讨论】:
-
问题的固定 k '泛化'不包含原始问题以找到中位数,因为这需要动态 k,其中 k = stacksize/2
-
这是一个非常好的观点!感谢您提出这个问题。
-
我不知道是什么问题,如果你能找到 O(1) 或优于 O(log n) 的答案,你可以使用此堆栈对项目列表进行排序,优于O(n log n),你调用 n 次得到第 K 个最大的数。对于 k=1...n
标签: algorithm data-structures stack