双堆维护数组中位数

关于双堆维护数组中位数,百度了下,貌似很多人都搞错了原理。这里介绍下:

双堆(median-heap)包含一个小根堆,一个大根堆,每个堆包含全部data的一半。小根堆的数据大于等于中位数,大根堆的数据小于等于中位数。
(1)当小根堆比大根堆多一个data时,中位数是小根堆的堆顶;同理大根堆比小根堆多一个数据时,中位数是大根堆的堆顶。
(2)当两个堆的数据一样多时,那么全部数据个数是偶数,这个时候中位数的选择要根据自己所确定的中位数定义(取均值,偏大,偏小等等)
(3)每次插入数据,将数据与堆顶的数据比较来确定插到哪个堆里。如果要插入的元素比现在的中位数大,插入小根堆;否则插入大根堆。如果两个堆的data个数相差超过1,有可能需要平衡两个堆:将数据较多的那个堆的堆顶拿出插入到另外个较少的堆中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值