一、待解决问题
对于一个数组,如果用滑动窗口的方式求解数组某一段的最值,在不考虑时间复杂度的情况下,用循环就能轻松实现,而如果考虑时间复杂度,"队列"这种先进先出的数据结构,就十分实用于这种情况。
与静态的滑动窗口相类似,当动态地获取数据时,我们也可以用循环队列来模拟一个滑动的串口。
本次针对的问题是:当传感器每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] =