[编程之美]设计一个高效的数据结构,尽可能快的返回队列中的最大值
2012-06-04 16:39
375 查看
如题。设计一个高效的数据结构,包含MaxElement操作,快速的返回队列中最大的元素。编程之美关于这题的解析实在是太漂亮了,因为直接求解没有什么好的解法,但是我们可以轻松使用两个栈来实现一个队列,这样就把问题转换为如果方便的从栈中返回最大值问题。
思路如下:
在栈中维护一个最大值序列,保证MaxElement操作的时间复杂度为O(1)。
伪代码如下:
用两个栈来实现一个队列,设置栈A和栈B。
上述代码能够用栈来实现一个队列。出队的时候,如果A栈为空,那么“把B栈中的所有数据都弹出,压入A栈”这个操作不是O(1)的。虽然如此,但从每个元素的角度来看,它被移动的次数最多可能有3次,这3次分别是:压入栈B,从B栈压入A栈,从A栈弹出。相当于入队经过一次操作,出对经过两次操作。所以这种方法的时间复杂度是线性的。
思路如下:
在栈中维护一个最大值序列,保证MaxElement操作的时间复杂度为O(1)。
伪代码如下:
class stack { public: stack () { stackTop = -1; maxStackItemIndex = -1; } void Push(Type x) { stackTop++; if (stackTop >= MAXN) ; else { stackItem[stackTop] = x; if (x > Max()) { link2NextMaxItem[stackTop] = maxStackItemIndex; maxStackItemIndex = stackTop; } else { link2NextMaxItem[stackTop] = -1; } } } Type Pop() { Type ret; if (stackTop < 0) { ThrowException(); } else { ret = stackItem[stackTop]; if (stackTop == maxStackItemIndex) { maxStackItemIndex = link2NextMaxItem[stackTop]; } stackTop--; } return ret; } Type MAX() { if (maxStackItemIndex >= 0) { return stackItem[maxStackItemIndex]; } else { return -INF; } } private: Type stackItem[MAXN]; int stackTop; int link2NextMaxItem[MAXN]; int maxStackItemIndex; };
用两个栈来实现一个队列,设置栈A和栈B。
上述代码能够用栈来实现一个队列。出队的时候,如果A栈为空,那么“把B栈中的所有数据都弹出,压入A栈”这个操作不是O(1)的。虽然如此,但从每个元素的角度来看,它被移动的次数最多可能有3次,这3次分别是:压入栈B,从B栈压入A栈,从A栈弹出。相当于入队经过一次操作,出对经过两次操作。所以这种方法的时间复杂度是线性的。
相关文章推荐
- 设计队列容器的数据结构,使得返回最大元素的操作时间复杂度尽可能的低。
- 9.3栈和队列(三)——设计一个栈,出pop与push方法,还支持 min方法,可返回栈元素中的最小值
- 算法与数据机构学习_第一章.栈和队列_1.设计一个有返回栈中最小元素功能的栈
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
- PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
- 简单编程(十四)定义一个方法能够判断并返回两个整数的最大值,并调用自己的方法测试是否正确。
- 数据结构:有人设计以下算法用于删除整数顺序表L中所有值在[x,y]范围内的元素,该算法显然不是高效的,请设计一个同样功能的高效算法。
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)
- 结对编程之返回一个二维数组中所有子矩阵和的最大值
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- 如果字符串的一个子串(其长度大于 1)的各个字符均相同,则称之为等值子串。试设计一算法,求出串S中的最大等值子串 函数返回最大等值子串的长度,如果没有则返回1。 例如: 若S= “abc123abc1
- 对于一个非常大的数,如何快速高效返回比它小的最大质数【腾讯笔试题】
- 如何用Java和Redis设计一个高效的先入先出的队列
- 编程珠玑: 14章 堆 14.2实现一个优先级队列,返回数组中最小值 -------解题总结
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
- 请设计一个高效算法,找到四条边颜色相同的最大子方阵。
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。