(给ImportNew加星标,提高Java技能)
编译:ImportNew/覃佑桦
www.baeldung.com/java-stream-integers-median-using-heap
1.概述
本文介绍了如何查找整数流的中位数。
我会通过示例说明问题,分析问题,最后给出几种Java解决方案。
2.问题描述
中位数(又称中值)指一个有序数据集的中间值。对于一组整数,小于中位数的元素与大于中位数的元素一样多。
在一组有序数据集中:
如果元素个数为奇数,那么中间那个元素是中位数:在有序整数集合{5,7,10}中,中位数是7;
如果元素个数为偶数,没有中间元素,那么中位数为两个中间元素的平均值:在有序整数集合{5,7,8,10}中,中位数为 (7+8)/ 2 = 7.5。
现在,假设输入是数据流而非一个有限集合。可以把整数流的中位数定义为,到目前为止已读取整数集合的中位数。
问题可以形式化描述为:对于给定的整数流输入,设计一个类,为读取的每个整数执行下面两个任务:
将整数添加到整数集
查找目前为止已读取整数集合的中位数
例如:
add 5 // sorted-set = { 5 }, size = 1
中位数 -> 5
add 7 // sorted-set = { 5, 7 }, size = 2
中位数 -> (5 + 7) / 2 = 6
add 10 // sorted-set = { 5, 7, 10 }, size = 3
中位数 -> 7
add 8 // sorted-set = { 5, 7, 8, 10 }, size = 4
中位数 -> (7 + 8) / 2 = 7.5
..
尽管输入的整数流是无限的,但我们假设可以把数据流中的所有元素一次存到内存中。
可以将任务用下面的代码表示:
void add(int num);
double getMedian();
3.朴素方法
3.1.有序列表
让我们从一个简单的想法开始:通过照索引访问列表的中间元素或者中间两个元素,计算整数有序