博客
关于我
一道简约而不简单的算法题--数据流的中位数
阅读量: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/

    你可能感兴趣的文章
    php7和PHP5对比的新特性和性能优化
    查看>>
    PHP7安装pdo_mysql扩展
    查看>>
    PHP7实战开发简单CMS内容管理系统(7) 后台登录架构 用户登录校验
    查看>>
    php7,从phpExcel升级到PhpSpreadsheet
    查看>>
    PHP8中match新语句的操作方法
    查看>>
    PHP:第一章——PHP中常量和预定义常量
    查看>>
    PHP:第一章——PHP中的位运算
    查看>>
    phpcms
    查看>>
    phpcms 2008 product.php pagesize参数代码注射漏洞
    查看>>
    phpcms V9 自定义添加 全局变量{DIY_PATH}方法
    查看>>
    Redis五种核心数据结构的基本使用与应用场景
    查看>>
    PHPCMS多文件上传和上传数量限制
    查看>>
    phpEnv的PHP集成环境
    查看>>
    PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
    查看>>
    PHPMailer发送邮件
    查看>>
    phpmailer发送邮件,可以带附件
    查看>>
    phpmyadmin 安装
    查看>>
    phpmyadmin数据库建表及插入
    查看>>
    phprpc简单使用
    查看>>
    phpstorm中Xdebug的使用
    查看>>