Algs4-2.4.30动态中位数查找

2.4.30动态中位数查找。设计一个数据类型,支持在对数时间内插入元素,常数时间内找到中位数并在对数时间内删除中位数。提示:用一个面向最大元素的堆再用一个面向最小元素的堆。
 
解:设初始有2N或2N+1个元素,设有一个大堆和一个小堆,
    大堆堆顶元素为max,小堆堆顶元素为min,中位数元素mid指向null,待插入堆的元素为new。
 
1)初始化:
  先将前N个元素插入到大堆。
 
 将第N+1个元素到第2N个元素对每个元素new插入到大堆,插入时进行如下操作:
a)IF max<=new THEN
    new插入到小堆。
  ELSEIF max>new THEN
    max插入到小堆,
    大堆中删除堆顶元素max,
    new插入到大堆。
  END IF
 
   
  如果有第2N+1个元素,那么
b)IF max<=new<=min THEN
      mid=new
  ELSEIF max<=new>=min THEN
      mid=min
      小堆中删除min
      new插入到小堆
  ELSEIF max>=new (AND max<=min 堆已满足这个条件) THEN
      mid=max
      大堆中删除max
      new插入到大堆
  END IF
 
2)返回中位数
  如果mid=null,返回(max+min)/2
  否则返回mid
 
3)插入新元素new 
   插入新元素new后,要保持两个堆的元素个数相同。
   在插入新素前,两个堆的元素个数是相同的,因为初始化、插入、删除中位数 时就是保证了这一点。
   当 mid=null时,插入新元素使用(b)步的方法。
   当 mid<>null时,将mid插入到大堆,mid置为null,然后插入新元素按(a)步的方法。
 
4)删除元素mid时
  删除元素mid后,要保持两个堆的元素个数相同。
  在删除前,两个堆的元素个数是相同的,因为初如化、插入、删除中位数 时就保证了这一点。
  当mid<>null时,将mid直为null。
  当mid=null时,mid=(max+min)/2
 
5)附加:本文中位数定义为:当有2N个数时,排序后,中位数=(第N个数+第(N+1)个数)/2;当有2N+1个数时,排序后,中位数=第N+1个数
 
若中位数定义:当有2N个数时,排序后,中位数=第N个 或 第N+1个数时,上述算法描述需作调整。
 
 
原文地址:https://www.cnblogs.com/longjin2018/p/11825743.html