将一个有5个元素的数组中的值(整数)按逆序重新存放。_如何用堆计算整数流的中位数...

本文探讨了如何在数据流中查找整数的中位数,提出了一种通过保持两个堆(一个最小堆,一个最大堆)来实现的方法。在Java中,可以使用PriorityQueue来创建堆,并通过调整堆的大小来维持中位数的实时计算。这种方法使得`getMedian`操作的时间复杂度为O(1),而`add`操作的时间复杂度为O(log n)。
摘要由CSDN通过智能技术生成

(给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。

现在,假设输入是数据流而非一个有限集合。可以把整数流的中位数定义为,到目前为止已读取整数集合的中位数。

问题可以形式化描述为:对于给定的整数流输入,设计一个类,为读取的每个整数执行下面两个任务:

  1. 将整数添加到整数集

  2. 查找目前为止已读取整数集合的中位数

例如:

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.有序列表

让我们从一个简单的想法开始:通过照索引访问列表的中间元素或者中间两个元素,计算整数有序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值