Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

大小堆运用巧解数据流的中位数 ​​​​​​​​​​。 阅读详情

Google面试题

股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值)。


import java.util.*;

/**
 * Find median with max-heap and min-heap
 * O(1) find and O(logN) insert 
 *
 */
public class FindMedian {
	private static PriorityQueue<Integer> maxHeap, minHeap;
	private static int numOfElements = 0;

	public static void main(String[] args) {

		Comparator<Integer> revCmp = new Comparator<Integer>() {
			@Override
			public int compare(Integer left, Integer right) {
				return right.compareTo(left);
			}
		};

		// Or you can use Collections' reverseOrder method as follows.
		// Comparator<Integer> revCmp = Collections.reverseOrder();

		maxHeap = new PriorityQueue<Integer>(20, revCmp);
		minHeap = new PriorityQueue<Integer>(20);

		addNumber(6);
		addNumber(4);
		addNumber(3);
		addNumber(10);
		addNumber(12);
		System.out.println(minHeap);
		System.out.println(maxHeap);
		System.out.println(getMedian());

		addNumber(5);
		System.out.println(minHeap);
		System.out.println(maxHeap);
		System.out.println(getMedian());

		addNumber(7);
		addNumber(8);
		System.out.println(minHeap);
		System.out.println(maxHeap);
		System.out.println(getMedian());
	}

	/*
	 * Maintains a condition that maxHeap.size() >= minHeap.size()
	 * 1) the max-heap contains the smallest half of the numbers and min-heap contains the largest half
	 * 2) the number of elements in max-heap is either equal to or 1 more than the number of elements in the min-heap
	 */
	public static void addNumber(int value) {
		maxHeap.add(value);
		// If total number of elements in the heap is even before insertion,
		// then there are N elements both in max-heap and min-heap.
		// Insert to max-heap, result in max-heap has n+1 elements, but this is
		// valid since max-heap can contain 1 more element than min-heap
		if (numOfElements%2 == 0) {
			
			if (minHeap.isEmpty()) {
				numOfElements++;
				return;
			}
			// If the newly inserted value is larger than root of min-heap
			// we need to pop the root of min-heap and insert it to max-heap.
			// And pop root of max-heap and insert it to min-heap
			else if (maxHeap.peek() > minHeap.peek()) {
				Integer maxHeapRoot = maxHeap.poll();
				Integer minHeapRoot = minHeap.poll();
				maxHeap.add(minHeapRoot);
				minHeap.add(maxHeapRoot);
			} 
		} 
		// For this case, before insertion, max-heap has n+1 and min-heap has n elements.
		// After insertion, max-heap has n+2 and min-heap has n elements, so violate!
		// And we need to pop 1 element from max-heap and push it to min-heap
		else {
			minHeap.add(maxHeap.poll());
		}
		numOfElements++;
	}

	/*
	 * If maxHeap and minHeap are of different sizes, then maxHeap must have one
	 * extra element.
	 */
	public static double getMedian() {
		if (numOfElements%2 != 0)		// If total number received is not even
			return new Double(maxHeap.peek());
		else
			return (maxHeap.peek() + minHeap.peek()) / 2.0; 
	}
}



Ref:

http://www.ardendertat.com/2011/11/03/programming-interview-questions-13-median-of-integer-stream/

http://blog.sina.com.cn/s/blog_979956cc0101hab8.html

http://blog.youkuaiyun.com/ajaxhe/article/details/8734280

http://www.cnblogs.com/remlostime/archive/2012/11/09/2763256.html


聊聊 Java 数据结构与算法中的堆最小堆和最大堆 堆的数据结构有很多种体现形式,包括;2-3堆、B堆、斐波那契堆,而在 Java API 中最常用的是用于实现优先队列的二叉堆,它是由 JWJ Williams 在 1964 年引入的,作为堆排序算法的数据结构。另外在 Dijkstra 算法等几种高效的图算法中,堆也是非常重要的。堆的实现在 Java API 中主要体现在延迟队列的实现二叉堆上,这里小傅哥单独把这部分代码拆分出来,了解下关于小堆和大堆的实现。从对堆的数据结构介绍上可以看到,小堆和大堆的唯一区别仅是对元素的排序方式不同。 阅读详情

相关推荐

堆之最小堆、最大堆(java实现)

文章目录堆图解最大堆的api设计最大堆代码实现最小代码实现 堆 定义:堆是树型的一对多的数据结构,使用数组实现 对应完全二叉树 每个节点大于等于或者小于等于它的子节点 二叉树: 每个非叶子节点最多有两个分支节点 满二叉树: 每个非叶子节点都有两个子节点 完全二叉树: 最后一层的最后一个节点的父节点不满足满二叉树之外,其它非叶子节点都满足满二叉树 堆分为最小堆和最大堆 最大堆:是一个完全二叉树,父节点不小于子节点 最小堆:是一个完全二叉树,父节点不大于子节点 堆的特性: 堆的前一半是非叶子节点,后

klz 3903

最大堆和最小堆求数据流中的中位数【java实现】

 import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class FindMedianInStream {    private static class Heap{   //堆中元素存放的集合   private List data;   //比较器

sar31的博客 1562

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1269

算法练习:随时找到数据流的中位数、微软折纸问题

随时找到数据流的中位数 实现思路 准备两个堆,一个放前 n/2 个数,另一个放后 n/2个数。 比如 5 3 6 4 5 放到大根堆里,第二个数进来,5>3 ,将 3放到5下面。此时第一个堆里有2个数,第二个里有0个数。2-0>=2。将第一个堆的堆顶的数放入第二个堆,即小根堆,此时第一个堆里只有3 ,第二个里只有5 。 6 进来, 放入小根堆 3 5 6 4进来, 4...

尔等同学的博客 367

STM32实现webserver显示数据及配置参数

其实提到的将fsdata.c重命名为fsdata_custom.c,可以不重命令,将/LWIP/Target/lwipopts.h中HTTPD_USE_CUSTOM_FSDATA 定义为0,这样HTTPD_FSDATA_FILE将使用fsdata.c,避免每次生成fsdata.c需要重命令的麻烦。2、登录成功后,板卡根据板卡配置类型,返回对应的数据页面,该页面可实现数据校准、清零,以及进行到板卡参数设置页面。目前还未实现post功能以及http身份验证功能。3、板卡参数设置页面。

2693

Unity 2D精灵点击交互实现:从BoxCollider 2D到Event Trigger的完整指南

本文提供了Unity 2D精灵点击交互的完整实现指南。通过详细拆解BoxCollider 2D与Event Trigger两大核心组件的协同工作原理,手把手教你为Sprite Renderer添加点击、悬停等事件响应。文章包含从基础配置到进阶优化、性能调试的实战步骤,帮助开发者高效实现游戏世界内的对象交互,是Unity 2D开发的实用教程。

ansible6ops的博客 301

最小堆Min_Heapify

// Min_Heapify.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include iostream>#include algorithm>class Min_Heapify...{private:    int m_size;    int Parent(int i)..

yshuise的专栏 2439

ORB-SLAM3单目+IMU实战:从数据加载到位姿优化的完整流程解析

本文详细解析了ORB-SLAM3单目+IMU模式的完整实战流程。从EuRoC等数据集的数据格式准备、系统启动与数据流入口,到帧构建、IMU预积分、视觉-惯性联合初始化,再到基于运动模型的跟踪、局部地图优化及多线程协同,提供了从环境配置到代码解读的全面指南,并分享了参数调优与性能分析的实用调试经验。

weixin_29085151的博客 296

Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java...

Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值)。 SOLUTION 1: 1.维持两个heap,一个是最小堆,一个是最大堆。 2.一直使maxHeap的size大于minHeap. 3. 当两边size相同时,比较新插入的value,如果它大于minHeap的最大值,把它插入到...

weixin_34268753的博客 235

Conformal LEC逻辑等价性检查介绍和参考脚本

分为三个产品:Conformal L、Conformal XL、Conformal GXL。L是功能性检查,XL支持复杂数据通路的综合和APR优化,GXL支持定制的stdcell和定制memory的检查。Cadence Conformal Equivalence Checker,就是常说的LEC,可以用来验证RTL、门级网表、甚至spice网表的逻辑等价性。do文件是conformal的脚本文件,可以由综合工具(RTL Compiler/Genus)自己产生(write_do_lec),也可以手写。

NanDigits的博客 7250

Windows 11 24H2 外接显卡坞兼容性实测:3步解决USB设备失效

本文详细解析了Windows 11 24H2系统下外接显卡坞导致USB设备失效的问题,并提供了三步终极解决方案:驱动预解压与手动更新、电源管理设置调整、优化的设备连接顺序。通过雷电3接口的兼容性优化,帮助用户解决键盘鼠标卡死等常见问题,提升外接显卡坞的稳定性与性能。

weixin_31714129的博客 588

FanControl 插件入门:让风扇听懂任意传感器

当主板没有机箱风扇的温度接口,或想把智能家居温度计接进散热系统,默认配置就不够用了。FanControl 插件系统允许你把任意 .NET 数据源注入主程序,用主板不具备的信号驱动风扇曲线。下面从装好主程序开始,一步步完成第一个插件的安装与验证。 ## FanControl 插件能做什么:传感器注入与曲线控制一览 - 传感器注入:插件把主板不支持的温度、转速数据源接入主程序,变成可用的温度源 -

gitblog_00949的博客 853

智能车复工日记【3】:图像处理——基本扫线和基本特征提取和十字补线

目录前言基本扫线(除了进入环岛状态或者坡道或者十字路口的普通扫线)基本数据和初步特征进一步特征提取1、计算并且显示前n行左右线各丢失数目(不break和break的都有)2、计算左右线方差(以右线为例)【a】计算右线曲率(选三个点:r_start、中点、break点)【b】如果右线曲率在一定的范围,就进行右线拟合,从空白行开始计算斜率,否则则从0行开始计算 前言 图像大小185*70,通过扫线获取.........

hanhan的博客 3万+

大麦网抢票脚本完整教程:登录一次,开售瞬间自动下单

手动刷新大麦网页面抢票,拼的基本都是反应速度。大麦网抢票脚本 Automatic_ticket_purchase 换了个做法:浏览器只在登录那一步出场,之后查票、下单、拿支付链接全部由 requests 直接请求购票接口完成。本文按它真实的运行链路来讲:先看懂登录到支付这条路怎么走,再给部署步骤和 6 个参数的填法,最后列出跑不动时最常踩的坑。注意项目 README 已注明停止维护,它更适合作为学

gitblog_00350的博客 414

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1790

损失函数大汇总(五十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的新型损失函数,特别适用于高度类别不平衡的细粒度分割场景。与传统的区域型损失(如Dice、交叉熵)不同,它通过计算预测边界与真实边界之间的距离来优化模型,更关注边界精度而非区域重叠。核心思想是利用距离图(distance map)将边界约束转化为区域积分形式,实现端到端训练。具体实现中,损失函数为预测概率与距离图的点积,梯度仅取决于距离图,具有明确的空间引导性。相比区域型损失,Boundary Loss能更好处理小目标、细长结构等边界敏感任务,可与Dic

悦学共鸣,温柔以待,汇聚光芒,共同成长 239

双堆法实现数据流中位数的高效计算

中位数作为描述数据分布的关键统计量,在实时数据处理中面临独特挑战。传统基于排序的方法时间复杂度达O(nlogn),难以满足高频数据流处理需求。双堆算法通过维护一个最大堆和最小堆,将插入复杂度降至O(logn)同时保持O(1)查询能力。这种数据结构组合利用了堆的极值特性:最大堆保存较小半数,最小堆保存较大半数,通过平衡堆大小确保中位数始终位于堆顶。该技术在金融实时分析、物联网传感器处理等场景表现优异,也是LeetCode热题中的经典案例。算法实现需注意整数溢出、并发访问等边界条件,可通过JMH基准测试验证其微

weixin_34050519的博客 477

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

tech-interview-handbook 堆(Heap)面试学习指南:结构定义、复杂度速查、Top-K 技巧与手写最小堆实现

本文以 tech-interview-handbook 仓库中的堆专题学习指南 [heap.md](https://link.gitcode.com/i/7a03db6b5187f1d54a35de585e5d43ae) 为核心,系统梳理堆的定义、大小堆性质、时间复杂度速查表与"出现 k 就考虑堆"的面试识别技巧,并结合仓库中自带的纯 Python 手写最小堆实现 [heap.py](https:

gitblog_00096的博客 198

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeetCode 1167 Minimum Cost to Connect Sticks:最小堆贪心合并算法全解(含 9 种语言实现)

本文以 LeetCode 1167「Minimum Cost to Connect Sticks」(连接木棍的最低成本)为核心,完整讲解"每次合并两根最短木棍"的贪心策略、最小堆(Min-Heap)的底层工作原理、9 种主流语言的实现代码、复杂度分析以及高频踩坑点,并结合本仓库中其他堆类题目的源码与文档进行横向对比。读完本文你将掌握这一类"反复取最小两元素合并"题型的通用解题模板,并能直接复用于哈

gitblog_00035的博客 422

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

quickly find the median of a sequence of numbers

Question: Assume the user can enter a large sequence of integer numbers, please return the median of the entered numbers. Idea:  Create an min-heap and max-heap, and save the entered number to the

Yuwen's Hero 1079

LeetCode 295 数据流的中位数:双堆(大顶堆 + 小顶堆)解法全解析

本文以 [problems/295.find-median-from-data-stream.md](https://link.gitcode.com/i/1a52e6ee6abe098f8f818e391d6c45c6) 为主线,系统讲解 LeetCode 295「数据流的中位数」这道 hard 级经典题的完整解法。你将掌握:为什么静态数据的中位数很简单、动态数据流为何必须借助堆、如何用"大顶堆

gitblog_00191的博客 83

面试题41. 数据流中的中位数(Java)(优先队列,大小堆)

1 题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个...

weixin_43969686的博客 255

Java之堆和堆排序

堆排序是一种基于堆数据结构的排序算法,它的时间复杂度为O(n log n)。堆排序的核心思想是将待排序序列构造成一个堆,然后依次将堆顶元素与堆底元素交换,再对剩余的元素重新构造成堆,直到所有元素都有序。由于堆排序是基于完全二叉树的,因此可以使用数组来表示堆,从而节省了树的指针空间的开销。大根堆和小根堆。在大根堆中,父节点的值大于等于任何一个子节点的值,在小根堆中则相反,父节点的值小于等于任何一个子节点的值。因此,大根堆可以用来进行升序排序,而小根堆则可以用来进行降序排序。堆排序的主要优点是稳定性好。

qq_64580912的博客 1702

数据结构之堆栈

堆(heap) 堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 根节点最大的堆叫做最大堆、大根堆或大顶堆 根节点最小的堆叫做最小堆、小根堆或小顶堆 常见的堆还有二叉堆、斐波那契堆等。 堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 堆是应...

weixin_30296405的博客 239

java 最大Topk 小跟堆 最小Topk 大跟堆 详解

java 最大Topk 小跟堆 最小Topk 大跟堆 详解

T_Y_F_的博客 825
上一篇: Remove Duplicates from Sorted List 从链表里移除重复元素 @LeetCode
下一篇: 一句话经典总结红黑树插入
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值