首页 > 其他分享 >滑动窗口的极值与deque用法

滑动窗口的极值与deque用法

时间:2023-05-18 12:44:24浏览次数:42  
标签:deque 窗口 滑动 data 极值 block 指针

在程序设计中,为了优化算法可能会用到滑动窗口或者双指针的思想,这种算法能够蛮力情况下的复杂度\(O(n^2)\)降低为线性。滑动窗口的问题通常可以用双指针来解决,即用头尾两个指针来约束窗口大小。
网上对于这两个名词的定义和解释莫衷一是。个人理解,固定一段窗口/区间大小而衍生的问题可以理解为单纯的滑动窗口问题,而双指针思想不局限于解决滑动窗口问题,还包含快慢指针、对撞指针(双指针向内移动)等,本质在于以两个指针来维护问题域,并且能在均摊O(1)下得到可行解。

本文基于Python deque双端队列,以最容易理解的方式归纳滑动窗口的问题的求解方法。

deque双端队列

Python的双端队列类型在官方collections库中,是一种类似原生列表(list)的容器,实现了在队列两端快速添加(append/appendleft)和弹出(pop/popleft)。源码由C语言实现,可在Github的CPython项目下Modules/_collectionsmodule.c文件中找到。
deque本质是一个双向链表,每个节点是一个固定长度的block,可以包含64个元素。在源码注释中,设计者提到固定长度的block可以
1)避免频繁分配内存的开销,提高效率;
2)大幅减少了链表指针,提升数据/指针比,从而提升内存利用率;
3)有利于缓存局部性。

点击查看源代码
/* The block length may be set to any number over 1.  Larger numbers
 * reduce the number of calls to the memory allocator, give faster
 * indexing and rotation, and reduce the link to data overhead ratio.
 * Making the block length a power of two speeds-up the modulo
 * and division calculations in deque_item() and deque_ass_item().
 */
#define BLOCKLEN 64
#define CENTER ((BLOCKLEN - 1) / 2)
#define MAXFREEBLOCKS 16
/* Data for deque objects is stored in a doubly-linked list of fixed
 * length blocks.  This assures that appends or pops never move any
 * other data elements besides the one being appended or popped.
 *
 * Another advantage is that it completely avoids use of realloc(),
 * resulting in more predictable performance.
 *
 * Textbook implementations of doubly-linked lists store one datum
 * per link, but that gives them a 200% memory overhead (a prev and
 * next link for each datum) and it costs one malloc() call per data
 * element.  By using fixed-length blocks, the link to data ratio is
 * significantly improved and there are proportionally fewer calls
 * to malloc() and free().  The data blocks of consecutive pointers
 * also improve cache locality.

标签:deque,窗口,滑动,data,极值,block,指针
From: https://www.cnblogs.com/izcat/p/17411587.html

相关文章

  • 基于爬山优化算法的三维曲面极值搜索matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要       爬山法是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。假定所求问题有多个参数,我们在通过爬山法逐步获得最优解的过程中可以依次分别将某个参数的值增加或者......
  • 基于爬山优化算法的三维曲面极值搜索matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要爬山法是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。假定所求问题有多个参数,我们在通过爬山法逐步获得最优解的过程中可以依次分别将某个参数的值增加或者减少一个单位。爬山法是......
  • 【Echarts】 柱状图折线图X轴随鼠标滑动延伸
    dataZoom属性://做自适应的时候精良不要使用Echarts的interVal属性 dataZoom:[{id:'dataZoom',type:'inside',xAxisIndex:[0],filterMode:'none',start:xAxis.length>100?100-(60*100/xAxis):0.//从哪个位置开始,自适应位置变化end:100//百分比,100的意思......
  • Android滑动卡片视图:Sliding-deck
    Sliding-deck提供了一个直观的用户操作控件,可以滑动删除,快速预览。如果你想要一个view的堆叠效果而又不想让代码变复杂,这就是你需要的解决方案。使用说明:1.-配置项目依赖把 librarydependency添加到 build.gradle文件。dependencies{...compile'com.re......
  • Android滑动卡片效果:Swipecards
    一个类似于Tinder的Android库,用于创建滑动卡片效果。您可以向左或向右滑动来切换喜欢或不喜欢的内容。 //implementtheonFlingListenerpublicclassMyActivityextendsActivity{...@OverrideprotectedvoidonCreate(BundlesavedInstanceState){......
  • C++黑马程序员——P207-209. deque容器 插入和删除,数据存取,排序操作
    P207.deque容器——插入和删除P208.deque容器——数据存取P209.deque容器——排序操作P207.deque插入和删除 ————————————————————————————————————————————————————————1#include<iostream>2#......
  • LeetCode 239. 滑动窗口最大值
    题目链接:LeetCode239.滑动窗口最大值题意:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。解题思路:(单调队列)O(n)使用单调队列求解......
  • 基于自回归整合滑动平均模型(ARIMA)的时间序列预测
    基于自回归整合滑动平均模型(ARIMA)的时间序列预测ID:8629644191951129......
  • 滑动窗口的最大值
    classSolution{public:vector<int>res;deque<int>q;vector<int>maxInWindows(vector<int>&nums,intk){for(inti=0;i<nums.size();i++){//先弹出左端点,保证队列里所有元素都是有效的......
  • 移动端滑动验证时页面跟随移动的问题处理
    在写一个移动端网页的滑动验证时,如果手指在屏幕上滑动会触发手机自带的事件。比如手机切屏或返回上一页等等。有两种网页端的方法可以阻止移动端左右滑动触发上一下和下一页的操作。1.CSS方法:html{touch-action:none;touch-action:pan-y;}2.使用JS代码:varsta......