博客
关于我
一道简约而不简单的算法题--数据流的中位数
阅读量:676 次
发布时间:2019-03-16

本文共 1506 字,大约阅读时间需要 5 分钟。

数据流的中位数问题解析

问题描述

中位数是有序列表中间的数。如果列表长度为偶数,中位数是中间两个数的平均值。例如:

  • [2, 3, 4] 的中位数是 3
  • [2, 3] 的中位数是 (2 + 3) / 2 = 2.5

我们需要设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 向数据结构中添加一个整数
  • double findMedian() - 返回当前所有元素的中位数

  • 创解思路

    数据结构选择

    本题中,我们选择使用堆(优先队列)这种数据结构。

    堆的设计

    将数据分为两部分:

    • 最大堆:存储较小的元素,其最大值小于最小堆的最小值。
    • 最小堆:存储较大的元素。

    为了保证动态操作过程中两个堆的数据量差不超过 1,我们在添加新元素时,会先将其添加到最大堆。在此基础上,如果最大堆的大小小于最小堆的大小,则将最大堆的最大元素移动到最小堆中。


    代码实现

    类结构

    import java.util.PriorityQueue;class MedianFinder {    PriorityQueue
    minHeap; PriorityQueue(Integer> maxHeap; public MedianFinder() { maxHeap = new PriorityQueue<>(Collections.reverseOrder()); minHeap = new PriorityQueue<>(); } public void addNum(int num) { maxHeap.add(num); minHeap.add(maxHeap.poll()); if (maxHeap.size() < minHeap.size()) { maxHeap.add(minHeap.poll()); } } public double findMedian() { if (maxHeap.size() == minHeap.size()) { return (maxHeap.peek() + minHeap.peek()) * 0.5; } else { return maxHeap.peek(); } }}

    代码解析

  • addNum(int num):-SOAP 加入栈中:新元素首先添加到最大堆。-为平衡两个堆的大小,可能将一个堆中的元素移到另一个堆。

  • findMedian():-如果最大堆和最小堆大小相同,中位数是两者元素的平均值。-否则,返回最大堆的顶元素作为中位数。


  • 示例分析

  • 添加数字 1,2,3:-findMedian() 返回 2

  • 添加数字 4:-findMedian() 返回 3


  • 技术细节

    整个实现过程中,我们采用了以下策略:

    • 动态平衡: 保持两个堆的元素数量差不超过 1。
    • 元素比较: 新加的元素总是与最大堆的最大值或最小堆的最小值比较,以确保堆的有序性。
    • 高效操作: 通过优先队列的性质,实现了 O(log n) 时间复杂度的插入和查找操作,满足高效数据处理的需求。

    总结

    通过以上方法,我们成功设计并实现了一个能够在线性时间内查询中位数的数据结构。无论是加数操作还是查询中位数,都能在 O(log n) 的时间复杂度内完成。这个方法在处理大规模动态数据流时表现优异,适用于需要实时中位数查询的场景。

    转载地址:http://ixhqz.baihongyu.com/

    你可能感兴趣的文章
    php删除文件夹下面所有文件包括(删除文件夹)不删除文件夹
    查看>>
    React Collapse Pane 项目教程
    查看>>
    php判断ip黑名单程序代码
    查看>>
    php判断复选框是否被选中的方法
    查看>>
    PHP判断指定目录下是否存在文件
    查看>>
    php判断数组是否为空
    查看>>
    PHP判断数组是否有重复值、获取重复值
    查看>>
    springboot基于Web的社区留守儿童管理系统源码毕设+论文
    查看>>
    Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
    查看>>
    PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示
    查看>>
    PHP加密与安全的最佳实践
    查看>>
    PHP区分 企业微信浏览器 | 普通微信浏览器 | 其他浏览器
    查看>>
    php原生代码怎么连表查询,PHP tp5中使用原生sql查询代码实例
    查看>>
    PHP去掉转义符
    查看>>
    php去除字符串开头或末尾的字符(例如逗号)
    查看>>
    php反射api
    查看>>
    PHP反射ReflectionClass、ReflectionMethod 入门教程
    查看>>
    PHP反射机制
    查看>>
    php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
    查看>>
    php取绝对值
    查看>>