java - 是否有数据结构支持快速插入和中值计算?
问题描述
我需要一个支持以下操作的数据结构:
- 插入一个数字;
- 找出所有插入数字的中位数;
- (附加)找到所有插入数字的预先知道的分位数(0-1);
最简单的方法是在每次插入后对数字进行排序,但这并不快。有更快的解决方案吗?
解决方案
您可以使用两个二进制堆在 O(logN) 中执行操作 (1) 和在 O(1) 中执行操作 (2)(也许您也可以快速执行操作 (3),我只是不太熟悉概率论)。
创建一个 max-heapL
和一个 min-heap R
。创建两个变量a
,b
它们将存储一个(或两个)中间元素。堆L
将存储所有小于中间元素的元素,堆R
将存储所有大于中间元素的元素。L
和的大小R
将始终相同。
插入(x
):
- 如果数据结构中的元素计数是奇数(
a
存储中间元素,b
不存储任何内容):- 如果
x < a
:b = a
a = x
- 如果
x >= a
:b = x
- 如果
- 如果数据结构中的元素个数是偶数(
a
并b
存储两个中间元素):- 如果
x < a
:- 放入
b
_R
- 放入
x
_L
b = null
- 放入
- 如果
x > b
:- 放入
x
_R
- 放入
a
_L
a = b
b = null
- 放入
- 如果
a <= x <= b
:- 放入
a
_L
- 放入
b
_R
a = x
b = null
- 放入
- 如果
获取中位数():
- 只需返回
a
(如果元素数为奇数)或(a + b) / 2
(元素数为偶数)
推荐阅读
- entity-framework-core - 如何在没有内存键的情况下对 EF Core 3 视图进行单元测试?
- javascript - Flex 盒子里面有 2 个 div 里面有一个画布
- java - 使用 Spring Cloud @StreamListener 接收所有类型的消息
- python - 在什么情况下 loc 和 iloc 比仅仅使用 __getitem__ 和 pandas 数据帧更好?
- python - Docker 上的气流 - 路径问题
- java - 如何解决 Intellij IDEA servlet 错误
- nginx - 无法使用公共 IP 访问配置了 nginx 的 EC2 实例
- amazon-web-services - 如何使用自定义分类器使 AWS Glue 爬网程序跳过日志文件的第一行?
- notepad++ - 在 Notepad++ 中更改不可打印字符的外观或字体
- python - 在熊猫中满足条件后按组前向填充缺失值