题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路一:
Java的PriorityQueue默认内部是自然排序,结果为小顶堆,也可以自定义排序器,比如下面反转比较,完成大顶堆。
为了保证插入新数据和取中位数的时间效率都高效,使用大顶堆+小顶堆的容器,并且满足:
1、两个堆中的数据数目差不能超过1,这样可以使中位数只会出现在两个堆的交接处;
2、大顶堆的所有数据都小于小顶堆,这样就满足了排序要求;
3、当insert的数字个数为奇数时:使小顶堆个数比大顶堆多1;
4、当insert的数字个数为偶数时,使大顶堆个数跟小顶堆个数一样;
5、那么当总数字个数为奇数时,中位数就是小顶堆堆头;
6、当总数字个数为偶数时,中位数就是 2个堆堆头平均数。
*当数据总数为偶数时,新加入的元素,进入小顶堆(经过大顶堆筛选,取出大顶堆中最大的元素进入小顶堆)
*当数据总数为奇数时,新加入的元素,进入大顶堆(经过小顶堆筛选,取出小顶堆中最小的元素进入大顶堆)
import java.util.Comparator;
import java.util.PriorityQueue;
pub