半年前的稿子——单调队列

单调队列是一种特殊的数据结构,用于保持元素的单调性,常用于求解范围内的最小值或最大值问题。通过不断更新和调整队列,可以在O(1)时间内获取到指定范围内的最小值。例如,在给定数字序列中查找滑动窗口最小值,单调队列能高效解决。理解其工作原理对于优化算法性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。

顾名思义就是一个有规律的队列,这个队列的规律是:所有在队列里的数都必须按递增(或递减)的顺序列队,如果真有这么一个队列,那么队列的头是不是就是最小(或最大)的呢?

我们简单了解一些单调队列的思想,假如你在饭堂打饭时,有个人人高马大,急匆匆跑过来,看排了这么一长串队,心中急躁,从队列最后的一个人开始,看见好欺负的就赶走,自己站着,直到干不过的就停下,这样排在前面的认肯定是最高大威猛的。

这个队伍就可以认为是一个”单调队列“(单调递减队列),也就是允许两端弹出,只允许一端插入的队列(允许两端插入,只允许一端弹出的也属于双端队列)。
在这里插入图片描述

百度百科中单调队列的解释是
不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。

用单调队列来解决问题,一般都是需要得到当前的某个范围内的最小值或最大值。

举个例子:有 7 6 8 12 9 10 3 七个数字,现在让你找出范围( i-4,i )最小值

那我们就可以这样模拟一遍。
先初始化{ 0 }(表示i=0时的值),i从1开始

i=1 ->{ 0 }(表示i=1时,在其范围内最小的值为0)-> 7进队{ 7 }

i=2->{ 7 }(表示i=2时,在其范围内最小的值为7)-> 6比7小,7出,6进{ 6 }

i=3->{ 6 } (表示i=3时,在其范围内最小的值为6)->8比6大,8进{ 6, 8}

i=4->{ 6, 8}(表示i=4时,在其范围内最小的值为6)-> 12比8大,12进{6, 8 , 12};

i=5->{6, 8 , 12}(表示i=4时,在其范围内最小的值为6)-> 9比12小,12out,9比8大,9进{6,8, 9}

i=6->{6,8, 9} 但是 单调队列中元素6的下标是2,不在(2, 6],中,故6 out,这就是单调队列的精髓了。
故单调队列为{ 8,9 }(表示i=5,时,在其范围内最小的值为8)->10比9大,10进 最终 单调队列为{ 8,9, 10} ;

i=7->{ 8,9, 10}(表示i=6,时,在其范围内最小的值为8)-> 3比单调队列为{ 8,9, 10}的任意值都小,故全out,最终集合为{ 3 }

单调队列的核心是得到当前的某个范围内的最小值或最大值。

### 图像处理中的人物行为检测 对于图像处理中的行为检测,尤其是针对特定动作如“读稿子”的识别,可以采用深度学习模型来实现。现代计算机视觉技术已经能够通过卷积神经网络(CNNs)、循环神经网络(RNNs)以及注意力机制等方法完成复杂的行为分析。 #### 数据集准备 为了训练一个有效的模型用于识别人物正在读稿子这一行为,需要构建专门的数据集。数据集中应包含大量标注好的视频片段或静态图片,其中人物正在进行读稿子的动作[^1]。这些数据应当尽可能多样化,覆盖不同场景、光线条件和个体差异。 #### 特征提取与建模 一种常用的方法是利用两阶段框架:先定位人体姿态的关键点位置,再基于这些关键点序列预测具体行为类别。例如OpenPose算法可用于获取身体各部位坐标;随后可将时间维度上的多帧特征输入到长短时记忆网络(LSTM)或者Transformer架构下进行分类判断[^2]。 以下是简单的Python代码示例展示如何加载预训练模型并执行推理过程: ```python import torch from torchvision import models, transforms from PIL import Image def load_model(): model = models.resnet50(pretrained=True) num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 2) # 假设只有两个类:"reading" 和 "not reading" device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) checkpoint = torch.load("path_to_checkpoint.pth", map_location=device) model.load_state_dict(checkpoint['model_state_dict']) return model.eval() transform_pipeline = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) image_path = "./test_image.jpg" img = Image.open(image_path).convert('RGB') input_tensor = transform_pipeline(img).unsqueeze_(0) with torch.no_grad(): outputs = load_model()(input_tensor) _, predicted_class = torch.max(outputs.data, 1) print(f"The person is {'reading a script.' if predicted_class.item()==0 else 'not reading'}") ``` 上述脚本展示了如何使用ResNet作为基础骨架结构来进行二元分类任务。“路径_to_检查点.pth”应该替换为你实际保存下来的权重文件地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值