编程之美3.7--队列中取最大值操作问题
来源:互联网 发布:农村网络技术发展 编辑:程序博客网 时间:2024/06/02 13:13
问题:
假设有这样一个拥有3个操作的队列:
1. EnQueue(v): 将v加入队列中
2. DeQueue(): 使队列中的队首元素删除并返回此元素
3. MaxElement: 返回队列中的最大元素
设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。
说一下我对解法三的理解,代码就不再赘述了
stackItem[]:栈数组,Link2NextMaxItem[]:保存最大值的位置值的数组,maxStackIndex:初始化Link2NextMaxItem[]过程中,保存最大值位置信息
例如要操作的数据为PUSH(2,6,4,8,9),那么先处理2,push(2),
2 6 4 8 9
↑
x=2,
stacktop=0,stackItem[0]=2,Max()<0,(因为maxStackIndex初始值为-1,所以返回-INF),
x>Max(){Link2NextMaxItem[0]=-1,
maxStackIndex=0;}
stackItem:
2Link2NextMaxItem:
-1此时maxStackIndex=0;
下一个值
2 6 4 8 9
↑
x=6,
stacktop=1,stackItem[1]=6,Max()=2,(因为maxStackIndex=0,所以返回stackItem[0]),
x>Max(){Link2NextMaxItem[1]=0,
maxStackIndex=1;}
stackItem:
62Link2NextMaxItem:
0-1此时maxStackIndex=1;
下一个值
2 6 4 8 9
↑
x=4,
stacktop=2,stackItem[2]=4,Max()=6,(因为maxStackIndex=1,所以返回stackItem[1]),
x<Max()Link2NextMaxItem[2]=-1,
maxStackIndex不变,还是1;
stackItem:
462Link2NextMaxItem:
-10-1此时maxStackIndex=1;
下一个值
2 6 4 8 9
↑
x=8,
stacktop=3,stackItem[3]=8,Max()=6,(因为maxStackIndex=1,所以返回stackItem[1]),
x>Max(){Link2NextMaxItem[3]=1,
maxStackIndex=3;}
stackItem:
8462Link2NextMaxItem:
1-10-1此时maxStackIndex=3;
下一个值
2 6 4 8 9
↑
x=9,
stacktop=4,stackItem[4]=8,Max()=8,(因为maxStackIndex=3,所以返回stackItem[3]),
x>Max(){Link2NextMaxItem[4]=3,
maxStackIndex=4;}
stackItem:
98462Link2NextMaxItem:
31-10-1此时maxStackIndex=4
所以,pop操作的时候,先弹出stackItem栈顶元素,9,
因为stacktop=4 等于 maxStackIndex=4,是当前最大值
然后maxStackIndex=Link2NextMaxItem[stacktop=4],根据上图maxStackIndex=3,
stacktop--;
下一次pop,弹出stackItem栈顶元素,8,
因为stacktop=3等于 maxStackIndex=3,是当前最大值
然后maxStackIndex=Link2NextMaxItem[stacktop=3],根据上图maxStackIndex=1,
stacktop--;
下一次pop,弹出stackItem栈顶元素,4,(无论是否是最大值都弹出栈顶元素了)
因为stacktop=2不等于 maxStackIndex=1,所以不是当前最大值
maxStackIndex仍然是1
stacktop--;
下一次pop,弹出stackItem栈顶元素,6,
因为stacktop=1等于 maxStackIndex=1,是当前最大值
然后maxStackIndex=Link2NextMaxItem[stacktop=1],根据上图maxStackIndex=0,
stacktop--;
最后弹出栈底元素,1
所以最大值的顺序是9,8,6,2。
在弹出8以后,弹出4后才能弹出6,所以,尽管4大于2,但是在这种栈的存储方式比较下,无法体现4。
- 编程之美3.7--队列中取最大值操作问题
- 3.7-编程之美-队列中取最大值操作问题
- 编程之美--3.7 队列中取最大值操作问题
- 编程之美-队列中取最大值操作问题
- 编程之美—队列中取最大值操作问题
- 编程之美-队列中取最大值操作问题
- 编程之美读书笔记-队列中取最大值操作问题
- 编程之美3.7队列中取最大值操作
- 读书笔记之编程之美 - 3.7 队列中取最大值操作问题
- 编程之美:第三章 结构之法 3.7队列中取最大值操作问题
- 编程之美读书笔记3.7队列中取最大值操作的问题 解法2
- 编程之美3.7——队列中取最大值操作问题
- 编程之美3.7——队列中取最大值操作问题
- 编程之美3.7队列中取最大值操作问题Java版
- 编程之美3.7——队列中取最大值操作问题
- 编程之美之队列中取最大值操作
- 编程之美——队列中取最大值操作问题
- [编程之美] PSet3.7 队列中取最大值操作问题
- mixer: mysql协议分析
- FFmepg 多线程解码历程 - 7:submit_packet
- hdu 3416 Marriage Match IV 最大流 最短路径
- Android系统访问串口设备
- 冒泡,选择,插入,归并,快排
- 编程之美3.7--队列中取最大值操作问题
- VS2012程序打包部署详解
- tomcat启动指定项目
- log4j用法
- Resis 性能测试
- 创建我的第一个Servlet
- oracle的decode函数用法
- 2013级C++第17周项目【项目1-体会函数参数传递】
- Android常用知识点总汇