用循环队列模拟滑动窗口动态求最值及峰峰值

滑动窗口求最值

一、待解决问题

对于一个数组,如果用滑动窗口的方式求解数组某一段的最值,在不考虑时间复杂度的情况下,用循环就能轻松实现,而如果考虑时间复杂度,"队列"这种先进先出的数据结构,就十分实用于这种情况。

与静态的滑动窗口相类似,当动态地获取数据时,我们也可以用循环队列来模拟一个滑动的串口。

本次针对的问题是:当传感器每0.1s读取数据时,实时计算得到过去5s的最值之差。

二、方法对比

由于博主比较久没有使用数据结构了,因此在开始时先向计算机专业的同学寻求帮助,得到了“使用最大堆”的回复,但经过对比发现,最大堆作为一种树形结构,虽然很好地模拟了队列的模式,并同时能时刻得到堆中的最大值,在输入新元素和输出最大值时,能以较小的时间复杂度实现堆中元素的快速重新排列,从而得到最大值,但缺点是无法在最大堆中直接得到最小值。

因此,我重新选择了使用“循环队列”的方式,在占用不太多的空间资源下,实现滑动串口的模拟,并动态求最值。

图1 滑动窗口

滑动窗口

三、思路和程序

1.程序设计流程图如下

2.程序代码

#define MaxQSize 8		//7+1,多出的一位元素作为队列满的检验
typedef enum {
   
   ERROR = 0, SUCCESS = !ERROR} ErrorStatus;

//初始化循环队列
ErrorStatus Init_SeQueue(SeQueue* Q)
{
   
   
	uint8_t i;
	Q->base = (uint16_t*)malloc(MaxQSize*sizeof(uint16_t));
	if(! Q->base) return(0);		//分配空间失败
	
	for(i = 0;i < MaxQSize;i++)
	{
   
   
		Q->base[i] =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值