当前位置: 首页 > news >正文

程序设计-有一个实时交易系统,成交价格会持续写入。现在需要你设计一个模块,能够:实时接收新的成交价,在任意时刻快速返回当前成交价的中位数

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​https://www.captainai.net/troubleshooter

import java.util.Collections; import java.util.PriorityQueue; /** * 实时成交价格中位数计算器 * 支持动态插入价格,快速获取当前中位数 * 时间复杂度:插入 O(log n),查询 O(1) */ public class PriceMedianCalculator { // 最大堆:存储较小的一半元素,堆顶为这部分的最大值 private final PriorityQueue<Double> maxHeap; // 最小堆:存储较大的一半元素,堆顶为这部分的最小值 private final PriorityQueue<Double> minHeap; public PriceMedianCalculator() { // 最大堆:使用反向顺序实现 this.maxHeap = new PriorityQueue<>(Collections.reverseOrder()); // 最小堆:默认顺序 this.minHeap = new PriorityQueue<>(); } /** * 添加新的成交价格 * @param price 成交价格 */ public void addPrice(double price) { // 决定将新价格放入哪个堆 if (maxHeap.isEmpty() || price <= maxHeap.peek()) { maxHeap.offer(price); } else { minHeap.offer(price); } // 平衡两个堆的大小 balanceHeaps(); } /** * 平衡两个堆,确保: * 1. maxHeap的大小 >= minHeap的大小 * 2. 两个堆的大小差不超过1 */ private void balanceHeaps() { // maxHeap最多比minHeap多一个元素 if (maxHeap.size() > minHeap.size() + 1) { minHeap.offer(maxHeap.poll()); } // 确保maxHeap不会小于minHeap else if (minHeap.size() > maxHeap.size()) { maxHeap.offer(minHeap.poll()); } } /** * 获取当前所有成交价格的中位数 * @return 中位数 * @throws IllegalStateException 如果没有成交价格 */ public double getMedian() { if (maxHeap.isEmpty()) { throw new IllegalStateException("No prices available"); } // 如果总数为奇数,中位数在maxHeap的顶部 if (maxHeap.size() > minHeap.size()) { return maxHeap.peek(); } // 如果总数为偶数,中位数为两个堆顶的平均值 else { return (maxHeap.peek() + minHeap.peek()) / 2.0; } } /** * 获取当前价格总数 */ public int getSize() { return maxHeap.size() + minHeap.size(); } /** * 清空所有价格 */ public void clear() { maxHeap.clear(); minHeap.clear(); } }

算法说明

核心思想:使用两个堆(最大堆和最小堆)来维护数据流的中位数

工作原理

  1. 最大堆(maxHeap)存储较小的一半元素,堆顶是这半部分的最大值

  2. 最小堆(minHeap)存储较大的一半元素,堆顶是这半部分的最小值

  3. 保持两个堆的平衡:maxHeap.size() == minHeap.size()maxHeap.size() == minHeap.size() + 1

  4. 奇数个元素:中位数 = maxHeap的堆顶

  5. 偶数个元素:中位数 = (maxHeap堆顶 + minHeap堆顶) / 2

性能优势

  • 插入操作:O(log n)

  • 查询中位数:O(1)

  • 空间复杂度:O(n)

http://www.cnnetsun.cn/news/2135329.html

相关文章:

  • 知网/万方双重机检底座下,哪些降重软件可以同时降低查重率和AIGC疑似率?
  • 手把手教你为Aocoda F405V2飞控升级AT32F435芯片:引脚兼容性检查与固件适配要点
  • CDMA2000基站测试关键技术解析与工程实践
  • OpenClaw AI运维速查手册:单文件HTML打造终端高效查询工具
  • ZIP密码恢复革命:bkcrack如何用已知明文攻击3分钟解锁加密文件
  • 避坑指南:YOLOv8-pose关键点训练数据准备,Labelme标注的3个常见错误与修复脚本
  • FPGA新手避坑指南:用Verilog在Spartan-6上搞定IS62LV256 SRAM读写(附完整代码)
  • 智能优化光伏系统电池参数辨识与状态评估实现【附代码】
  • 解锁论文降重新姿势:书匠策AI,你的学术减负小能手!
  • 从RGB-D数据到3D感知:Kinect V2深度图与彩色图对齐实战(Python/OpenCV)
  • 微信语音导出mp3全攻略:手机免电脑、在线工具、格式工厂三种方法实测对比
  • ARM架构CNTHVS_CTL_EL2寄存器详解与虚拟定时器应用
  • Element ui el-dialog 在一个有滚动条的页面,打开一个弹框,完了再打开一个弹框后,滚动条可以滚动,怎么限制不能滚动。
  • 告别公式复制烦恼:LaTeX2Word-Equation让你的学术写作效率提升10倍
  • SGMICRO圣邦微 SGM4581YTS16G/TR TSSOP16 信号开关
  • Java 25虚拟线程调度性能翻倍的7个关键配置:从ThreadLocal泄漏到ForkJoinPool调优全链路实测
  • 如何用JPlag在5分钟内识别代码抄袭:技术决策者的完整指南
  • 敏捷团队如何‘瘦身’应用MFQ测试理论?我的轻量级实践与避坑指南
  • 单细胞数据分析避坑指南:你的表达矩阵是怎么来的?详解Barcode、UMI与建库方法
  • FastMCP 开发 MCP Server 完全实战指南
  • VxWorks6.9 SMP性能调优笔记:避免多核任务调度中的‘伪并发’与锁竞争
  • 【YOLOv11】060、YOLOv11在零售业实战:商品识别与货架分析的坑与经验
  • StarRailCopilot深度解析:如何用模块化架构实现崩坏星穹铁道全流程自动化
  • 用游戏化编程学Python逻辑:拆解ICode‘绿色飞板’训练场的20个思维陷阱
  • VSCode主题DIY进阶:从零开始,为你的C/C++代码打造一套高可读性的语义化配色方案
  • 中国词元,世界AI元语——模力方舟Moark与口袋龙虾PocketClaw的生态实践
  • 15分钟完成黑苹果配置:OpCore-Simplify智能工具终极指南
  • 圆满收官!桥田智能磁力换模硬核闪耀2026国际橡塑展
  • 3分钟掌握Locale-Emulator:让Windows程序显示正确语言的终极方案
  • 别再只盯着FMEA了!聊聊车载开发中DRBFM这个‘防患于未然’的利器