双堆求中位数及C实现

480. 滑动窗口中位数 本题属于滑动窗口和中位数计算的组合问题。可以使用滑动窗口的思想,在每次窗口滑动时,动态地维护窗口内元素的有序性,从而快速计算出中位数。中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。的窗口从最左端滑动到最右端。个数,每次窗口向右移动。 阅读详情

堆

堆的动态创建与删除可参考http://blog.youkuaiyun.com/pngynghay/article/details/22101359,此处不再赘述。

双堆求中位数

算法描述:

1、创建两个堆(一个小根堆、一个大根堆),堆大小至少为给定数据个数的一半,(size+1)/2,即向上取整;

2、假定变量mid用来保存中位数,取定第一个元素,赋值给mid,即作为初始的中位数;

3、依次遍历后面的每一个数据,如果比mid小,则插入大根堆;否则插入小根堆;

4、如果大根堆和小根堆上的数据个数相差为2,则将mid插入到元素个数较少的堆中,然后从元素个数较多的堆中删除根节点,并将跟节点赋值给mid;

5、重复步骤3和4,直到所有的数据遍历结束;

此时,mid保存了一个数,再加上两个堆中保存的数,就构成了给定数据的集合。

如果两个堆中元素个数相等,则mid即为最终的中位数;否则,元素较多的堆的根节点元素与mid的和求平均值,即为最终的中位数。

算法实现

算法实现采用了整数,所以,最终的结果取了整数,可以将返回值转换为浮点型,更精确。

uint32_t getmedian(uint32_t *array, uint32_t size)
{
	int i = 0, minelem = 0, maxelem = 0;
	uint32_t mid = array[0];
	uint32_t heapsize = (size+1)/2;
	heap_t *minheap = heap_malloc(heapsize);
	heap_t *maxheap = heap_malloc(heapsize);
	for(i = 
295. 数据流的中位数 添加元素时,根据元素大小和两个堆的元素数量进行调整,确保大顶堆的元素都小于等于小顶堆的元素,且两个堆的元素数量差不超过 1。计算中位数时,根据两个堆的元素数量情况进行计算。通常可以使用两个堆(大顶堆和小顶堆)来解决,大顶堆存储较小的一半元素,小顶堆存储较大的一半元素,这样可以快速获取中间元素。由于无法直接提供图文,你可以根据上述步骤绘制流程图,将每个函数的操作步骤用图形表示,并用箭头连接表示调用关系,这样有助于理解和记忆代码。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 阅读详情

相关推荐

使用最大堆和最小堆实现中位数的查找

参考链接:双堆维护数组中位数 用堆维护中位数的意思是说,设计两个堆,第一个堆(大顶堆)存放小于中位数的元素,第二个堆(小顶堆)存放大于中位数的元素。 下面是双堆维护中位数的语言描述: 1、初始化的时候设置两个变量分别记录两个堆【左堆和右堆】的元素的个数。 2、取第一个元素d[0]作为初始中位数m。 3、循环后面的每一个元素,如果比m大,则插入到右堆,如果比m小,则插入到左堆。 4、

ajaxhe的专栏 1908

C/C++中位数搜索算法详解:快速选择原理、实现与性能优化

在数据处理和算法设计中,中位数搜索是一个基础而关键的问题,它用于寻找一组数据的中间值,是统计分析、数据挖掘和机器学习中的常见需求。其核心原理基于快速选择算法,该算法借鉴了快速排序的分治思想,但只关注目标顺序位置,从而将平均时间复杂度优化至O(n)。这一技术价值在于高效处理海量数据或流式数据场景,避免了全排序的开销。在C/C++这类高性能编程语言中,实现快速选择需要关注基准值选择策略(如随机选择或三数取中法)、分区函数优化(如Hoare分区法)以及递归与迭代的实现差异。本文通过详解快速选择算法,并自然融入**

weixin_33721427的博客 364

题解:学而思编程 动态中位数

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。本文分享的必刷题目是从。

团爸讲算法 41

MIT Mini Cheetah--仿真流程

MIT Mini Cheetah–仿真 摘要 由于官方提供代码中,控制仿真环境中的猎豹机器人运动需要遥控器来控制。官方默认推荐使用logitech Gamepad F310游戏手柄:We use the Logitech F310 controller. There’s a switch in the back, which should be in the “X” position. The controller needs to reconnected if you change the switch

Galaxy_Robot的博客 5915

【DaVinci Developer实战指南】从入门到精通:软件组件设计与配置全解析

本文详细解析了DaVinci Developer在汽车电子开发中的核心应用,从软件组件设计到配置实战,涵盖Application SWC创建、RunnableEntity设计及Exclusive Area配置等关键环节。通过实际案例分享,帮助开发者快速掌握AUTOSAR架构下的ECU软件开发技巧,提升工作效率与系统稳定性。

weixin_30952535的博客 248

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

基于UG585详细讲解其中TTC的原理和使用案例。

Alex的技术博客 7886

基于Flink的流式数据降维实现方案

理解为何实时场景需要降维(解决维度灾难)掌握Flink流处理与降维算法的结合方式学会用Flink实现一个可落地的流式降维系统覆盖内容包括:Flink流处理基础、降维算法选择(侧重在线算法)、Flink与降维的集成方案、实战代码示例,以及工业级场景的应用经验。本文从“为什么需要流式降维”出发,用“快递分拣”的生活案例引出核心概念;接着拆解Flink流处理、数据降维的底层逻辑;然后重点讲解“在线PCA”这一适合流式场景的降维算法,并用Flink实现一个完整的流式降维管道;

AI 领航者的博客 566

跟踪雷达点迹处理

1,点迹定义: 假设研究对象为位置x和速度v,预测值是根据这一时刻的x值、v值来预测下一时刻的x、v;测量值是根据传感器也就是雷达得到的,因为各种误差的存在,这两个值都不准确,所以把他们加权融合,得到一个新的量—状态值。 点迹就是所谓的测量值,由雷达对同一个目标探测到的一系列点(假设目标静止,但由于误差的存在,会扫描出不止一个点),航迹对应状态值,是点迹和预测轨迹的加权融合。 2,雷达信号和点迹处理关系: 3,点迹航迹处理流程 4,仿真 clear all; RealData=G

wangjie36的博客 1万+

博途PLC信号处理系列之卡尔曼滤波程序(Kalman Filter)

三菱系列PLC的卡尔曼滤波程序,可以参看下面这篇博文PLC滤波算法之卡尔曼滤波(kalmanFilter)代码+测试_RXXW_Dor的博客-优快云博客_plc滤波kalman滤波是采用递归的方法解决线性滤波问题,只需要当前的测量值input(西门子PLC里比如我们的模拟量通道AIW0值)和前一个采样周期的估计值(上一个时刻的滤波输出结果last_out)就能进行状态估计,需要的存储空间小,每一步的计算量小。下面我们通过程序代码一一给大家展示下。注意。......

RXXW_Dor的博客 3475

麒麟操作系统提示“默认密钥环已上锁”的解决办法

麒麟操作系统提示“默认密钥环已上锁”的解决办法

太极淘的博客 1万+

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 212

老版QQ原生表情gif动态

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 堆的动态创建与根节点删除
下一篇: Bloom Filter
IT_Linux
博客等级 码龄14年 31粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值