码迷,mamicode.com
首页 > 其他好文 > 详细

在线求中位数

时间:2014-10-30 16:46:15      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:sp   代码   bs   nbsp   情况   元素   在线   l   push   

在线求第k个数做得多了,在线求中位数也是用堆,一个最大堆,一个最小堆。

思想大概是这样子的:

  1. 一个最大堆,一个最小堆,最大堆对应于前n/(n+1)个数,最小堆对应于后n/n+1个数;假设最大堆堆项元素为n1, 最小堆堆顶为n2, 则n1 <= n2;
  2. 确保两个堆的大小最多只差1. 设最大堆大小为s1, 最小堆大小为s2,则abs(s1-s2) <= 1;
  3. 对于新来的数m,分情况调整:
    1. 如果s1== s2, 那么:如果m<= n2, m插入到最大堆,s1= s1+1; 否则插入到最小堆,s2=s2+1;
    2. 如果s1 > s2, 那么:如果m >= n1, m插入到最小堆,s2=s2+1;否则,n1pop出最大堆,然后push进最小堆,然后m进最大堆,s2=s2+1;
    3. 如果s1 < s2, 那么:如果m <=n2, m插入到最大堆,s1=s1+1;否则,n2pop出最小堆,然后push进最大堆,然后m进最小堆,s1=s1+1;

代码如下:

 

在线求中位数

标签:sp   代码   bs   nbsp   情况   元素   在线   l   push   

原文地址:http://www.cnblogs.com/linyx/p/4062914.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!