要获取最小值和最大值,用什么样的数据结构

z1z2z3z4 2008-12-10 10:54:05
需要用一个数据结构保存100000个数据,要求能快速取得最小值和最大值,不用排序,要求高效。
相关要求如下:
1、能高效读取最大/最小值。但一次只要获得最大或最小值即可,不用同时获得两个。
2、能高效删除最大值或最小值。

现在我用heap,能以O(1)获得最小值,或最大值,但获取另一个最值则慢。我的具体用法是:
如果用红黑树,觉得有点笨重,有没有比红黑树更轻便的结构实现这个?

我看数据结构的数提到这些:
裴波那契堆、伸展树、红黑树、2-3树、2-3-4树、二项堆、最小-最大堆、双端堆
都没用过,请问哪个容易解决我的问题?
...全文
433 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
z1z2z3z4 2008-12-16
[Quote=引用 9 楼 hmsuccess 的回复:]
我知道最大堆,最小堆,还没听说过双端堆,什么是双端堆?
[/Quote]
看了一下资料,双端堆是树根不使用,树根下面,左边为最小堆,右边为最大堆。这个结构能快速查找最小值和最大值。

另外,还有个最小最大堆,结构上是一层最小堆,一层最大堆,也能快速查找最小值和最大值。

如果要求是快速查找最小值和最大值,看来双端堆和最小最大堆都能实现,就是不明白两者还有什么区别?难道它们的结构不同,但都用来干相同的一件事吗?
回复
silentdai 2008-12-13
[Quote=引用 10 楼 shyli 的回复:]
引用 6 楼 silentdai 的回复:
建堆的复杂度是O(n)

我错了……
[/Quote]

同勉同勉
我也是最近开始看二项堆的时候发现二叉堆建堆是O(n)的,可笑的是我想当然地以为
sigma_(i=1)^(n) i*log(i)是O(n)的,后来才发现我自以为是的建堆方法有误...


回复
UncleQiong 2008-12-12
帮顶,努力学习中

回复
silentdai 2008-12-12
建堆的复杂度是O(n)
回复
shyli 2008-12-12
[Quote=引用 6 楼 silentdai 的回复:]
建堆的复杂度是O(n)
[/Quote]
我错了……
回复
hmsuccess 2008-12-12
[Quote=引用 3 楼 dlyme 的回复:]
可以用双端堆。

只有十万个数据而已,数据量并不大。
不管是双端堆、红黑树、还是采用两个堆(一个最大堆一个最小堆),效率相差没多少。
[/Quote]
我知道最大堆,最小堆,还没听说过双端堆,什么是双端堆?
回复
MicroDeviser 2008-12-12
顶起
回复
jummy_lin 2008-12-10
O(1)获得最小值????
回复
帮up。
回复
shyli 2008-12-10
建树或建堆的复杂度都是O(nlogn),等于排序的复杂度,并且删除都是O(logn)。
如果不用插入数据的话,可以用下面简单的方法
先对数组排序。
然后设置两个位置,int min = 0, max = n - 1;其中n为元素个数,分别表示最小值和最大值的位置。
获取最大值是ary[max],获取最小值是a[min]。
删除最大值是max--,删除最小值是min++。
初始化复杂度O(nlogn),查找和删除都是O(1)
回复
Tiger_ldy 2008-12-10
刻苦学习中。。。。。。。。。。。。。
回复
可以用双端堆。

只有十万个数据而已,数据量并不大。
不管是双端堆、红黑树、还是采用两个堆(一个最大堆一个最小堆),效率相差没多少。
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-12-10 10:54
社区公告
暂无公告