Algs4-2.4.30动态中位数查找
2.4.30动态中位数查找。设计一个数据类型,支持在对数时间内插入元素,常数时间内找到中位数并在对数时间内删除中位数。提示:用一个面向最大元素的堆再用一个面向最小元素的堆。
解:设初始有2N或2N+1个元素,设有一个大堆和一个小堆,
大堆堆顶元素为max,小堆堆顶元素为min,中位数元素mid指向null,待插入堆的元素为new。
大堆堆顶元素为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
先将前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
如果mid=null,返回(max+min)/2
否则返回mid
3)插入新元素new
插入新元素new后,要保持两个堆的元素个数相同。
在插入新素前,两个堆的元素个数是相同的,因为初始化、插入、删除中位数 时就是保证了这一点。
当 mid=null时,插入新元素使用(b)步的方法。
当 mid<>null时,将mid插入到大堆,mid置为null,然后插入新元素按(a)步的方法。
插入新元素new后,要保持两个堆的元素个数相同。
在插入新素前,两个堆的元素个数是相同的,因为初始化、插入、删除中位数 时就是保证了这一点。
当 mid=null时,插入新元素使用(b)步的方法。
当 mid<>null时,将mid插入到大堆,mid置为null,然后插入新元素按(a)步的方法。
4)删除元素mid时
删除元素mid后,要保持两个堆的元素个数相同。
在删除前,两个堆的元素个数是相同的,因为初如化、插入、删除中位数 时就保证了这一点。
当mid<>null时,将mid直为null。
当mid=null时,mid=(max+min)/2
删除元素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个数时,上述算法描述需作调整。