您的位置:首页 > 理论基础 > 数据结构算法

[编程之美]设计一个高效的数据结构,尽可能快的返回队列中的最大值

2012-06-04 16:39 375 查看
如题。设计一个高效的数据结构,包含MaxElement操作,快速的返回队列中最大的元素。编程之美关于这题的解析实在是太漂亮了,因为直接求解没有什么好的解法,但是我们可以轻松使用两个栈来实现一个队列,这样就把问题转换为如果方便的从栈中返回最大值问题。

思路如下:

在栈中维护一个最大值序列,保证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栈弹出。相当于入队经过一次操作,出对经过两次操作。所以这种方法的时间复杂度是线性的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐