一个带有min函数的栈

来源:互联网 发布:金山软件2017校园招聘 编辑:程序博客网 时间:2024/05/22 16:48

题目:定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素。要求函数 minpush 以及 pop 的时间复杂度都是 O(1)。


一个经典的利用空间换取时间的算法。对于栈来说,push和pop的复杂度都为O(1)。但是对于min来说,如果需要O(1)的复杂度,一定是从特定的数据结构中获得的min,而不是通过算法而来。在这个问题中,数据结构的重要性大于算法。


如果在栈顶维护最小的值min,那么pop的时候,获得的就不是当前的栈顶元素,这就把栈结构破坏了。


如果min的时候,pop所有的值,从中找出最小的值,那么算法复杂度永远不会为O(1)。因为至少需要遍历栈中所有的数据。


因为O(1)意味着随机访存的速度,所以栈中的最小值一定是提前被算好,而后被存储在变量或者数组中。


考虑用一个变量min_val来存储当前栈中的最小值。push的时候,将当前值与min_val对比,从而更新min_val,那么min_val中一定保存着当前最小的值。但是在pop的时候,当栈中的最小值,也就是min_val相等的元素被pop出去后,无法更新min_val,因为无法知道当前栈的最小值是多少,除非pop出所有元素,遍历所有元素后,得出当前min_val。但是显然这样做就不会有O(1)的性能。


现在的问题在于,如果最小元素被pop出去,怎么获得当前的最小元素?最简单的方法就是记录下每一个栈元素的所对应的最小值。每pop一个值,就能得知当前的最小值。


但是用什么来存储这些对应每个栈元素的最小值呢?第一个想到的就是数组,每push一次,如果push的元素<当前最小值(数组中最后的一个值),就在数组中add这个值,作为当前的最小值;反之,则最小值不变,在数组中add上一个最小值。


呵呵,如果把这个横着躺着的数组立起来,就会发现其实它也是一个栈。暂且称之为铺助栈吧。




程序中,永远是算法复杂度和空间复杂度的博弈。既然一个变量min_val无法达到目的,

原创粉丝点击