查找中位数,在线算法

转载自:http://www.cnblogs.com/lienhua34/archive/2011/12/06/2381299.html

 

问题:
给定n个int型的数和一个空的集合,每次往集合中插入一个数,每次插入之后给出这个集合的中位数。(中位数的概念是:如果集合有奇数个数,给出排序后处在最中间的那个数;如果是偶数个数,给出排序后最中间两个数的均值。)

集合中元素,前一半存储在一个最大堆中,后一半存储在一个最小堆中。使用变量MaxHeapNum记录最大堆元素的个数,使用变量MinHeapNum记录最小堆元素的个数。控制MaxHeapNum与MinHeapNum的差不能超过1。每次将要插入的元素Num与最大堆顶部元素MaxHeapTop和最小堆的顶部元素MinHeapTop将进行比较,根据具体情况进行插入:

1.如果Num < MaxHeapTop,则
  1.1 如果MaxHeapNum <= MinHeapNum,将Num插入最大堆;
  1.2 如果MaxHeapNum == MinHeapNum + 1,将MaxHeapTop从最大堆中移到最小堆,并将Num插入最大堆。
2.如果MaxHeapTop <= Num <= MinHeapTop,则
  2.1 如果MaxHeapNum <= MinHeapNum,将Num插入最大堆;
  2.2 如果MaxHeapNum == MinHeapNum + 1,将Num插入最小堆;
3.如果Num > MinHeapTop,则
  3.1 如果MinHeapNum <= MaxHeapNum,将Num插入最小堆;
  3.2 如果MinHeapNum == MaxHeapNum + 1,将MinHeapTop移到最大堆中,将Num插入最小堆。

在每次插入后,都要根据情况对MaxHeapNum和MinHeapNum进行变更,并将有改动的堆进行堆调整。

上面的插入情况会保证最大堆和最小堆的元素个数差小于1,中位数就只在最大堆和最小堆的顶部元素中产生:如果最大堆和最小堆的元素个数相等,则中位数为最大堆和最小堆的顶部元素的平均值;否则,中位数为元素个数多的那个堆的堆顶元素。

复杂度分析:每次插入元素时的堆调整平均复杂度为O(log(N/2)),插入N次,所以总的复杂度为O(N*log(N/2))。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值