【发布时间】:2014-11-11 20:56:33
【问题描述】:
我最近被要求构建一个支持四种操作的数据结构,即,
- 推送:向 DS 添加一个元素。
- Pop:移除最后推送的元素。
- Find_max:从当前存储的元素中找出最大的元素。
- Pop_max:从 DS 中删除最大元素。
元素是整数。
这是我建议的解决方案:
- 拿一叠。
- 在其中存储一对元素。该对应该是 (element, max_so_far),其中 element 是该索引处的元素,max_so_far 是迄今为止看到的最大值元素。
- 在将元素压入堆栈时,检查最顶部堆栈元素的 max_so_far。如果当前数字大于该值,则将当前对的 max_so_far 值作为当前元素的值,否则存储前一个 max_so_far。这意味着推送只是一个
O(1)操作。 - 对于
pop,只需从堆栈中弹出一个元素。同样,这个操作是O(1)。 - 对于
Find_max,返回栈顶元素max_so_far的值。再次,O(1)。 - 在分配新的 max_so_far 值之后,弹出最大元素将涉及遍历堆栈并显式删除最大元素并将其顶部的元素推回。这将是线性的。
有人要求我改进它,但我做不到。
就时间复杂度而言,我猜如果所有操作都发生在O(logn) 中,整体时间可以得到改善。如何做到这一点,是我无法得到的。
【问题讨论】:
-
你写过代码吗?
-
编写代码非常简单。问题不在于代码,而在于算法。
-
当你得到一个实现编码和工作时,考虑把它发布到Code Review :) 他们会有关于代码以及算法的指针。
-
很大程度上取决于您希望拥有多少项目,以及每个操作的调用频率
-
@IanRingrose 是的!你说得对。但是由于我们被告知要构建一个数据结构,我们可以放心地假设每个方法将以相同的频率被调用。在这种情况下,我的解决方案将花费 O(n) 操作的二次时间,而接受的解决方案将花费 O(nlogn)。
标签: algorithm data-structures time-complexity