您的位置:首页 > 其它

堆的应用

2015-08-07 13:59 106 查看
第一个是ali的面试题:

第一题是本周淘宝上有5亿个商品成交数据,让你找出销量最高的10000个商品。

直接想起来优先队列也就是堆。从而引出堆的一个重要的应用------大数据



【适用范围】
海量数据前n大,并且n比较小,堆可以放入内存




基本原理及要点:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。(为什么说使用堆效率很高,一般的优先队列效率比较低么?进行对比分析,。见《数据结构》P125)


第二题:题目介绍:

输入为不断地数字流,实时显示出当前已经输入的数字序列的中位数

双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。

解答:

求中位数的方法很多,对于大数据量最经典是桶的计数方法,但是对于这个问题不适用,因为数据是不断变化的

可以用最大堆和最小堆来解答这个问题:

1.假设当前的中位数为m,其中最大堆维护的是<=m的数字序列,最小堆维护的是>=m的数字序列,但是两个堆都不包含m

2.当新的数字到达时,比如为a,将a与m进行比较,若a<=m 则将其加入到最大堆中,否则将其加入到最小堆中

3.如果此时最小堆和最大堆的元素个数的差值>=2 ,则将m加入到元素个数少的堆中,然后从元素个数多的堆将根节点赋值到m,最后重建两个最大堆和最小堆,返回到2(复杂度为建堆的复杂度O(nlogn))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: