首页 > 编程语言 >【算法】基础数据结构

【算法】基础数据结构

时间:2023-07-03 21:48:25浏览次数:31  
标签:队列 基础 元素 栈顶 算法 qmin 当前 数据结构 单调

一、单调栈

1. 概念

满足单调性的栈结构,常用于 RMQ 问题。

2. 实现

为满足单调性,我们在栈的基础上额外判断以下栈顶元素是否大于/小于当前元素。以下面的序列 \(1\;7\;4\;3\;2\;8\) 为例,需要求每一个数右边第一个比它大的数。考虑维护单调递减栈,才能保证不会有数没有找到答案便被弹出栈了。

现在将 \(7\) 放入已有 \(1\) 的栈中。

image

由于这是一个单调递减栈,\(7 > 1\),此时将 \(1\) 弹出,放入 \(7\),并得出 \(1\) 右边第一个大于它的数就是 \(7\)。证明如下:

若当前栈顶为 \(x\),当前元素为 \(y\)。假设序列中存在一个数 \(z>x\) 且 \(z\) 在 \(x\) 和 \(y\) 中间,为满足单调性,要么 \(z\) 还没入栈——这显然不可能,因为在 \(z\) 后面的元素 \(y\) 都已经入栈,要么 \(x\) 被 \(z\) 弹出——那么 \(x\) 就一定不是当前栈顶。所以假设不成立。

然后一次将元素 \(4\;3\;2\) 放入,由于它们都符合单调递减性,所以无需弹出。

image

最后放入 \(8\) ,先和当前栈顶 \(2\) 比较。

image

发现 \(8>2\),不符合单调递减性,弹出 \(2\)。再将 \(8\) 和 当前栈顶 \(3\) 比较。

image

发现 \(8>3\),弹出 \(3\)。以此类推,最后 \(8\) 入栈时,栈里应该什么都没了。

3. 代码

/*
手写栈,stk[]是栈数组,top是栈顶
a[]是原数组,ansi[]存储答案
*/
for(int i=1;i<=n;i++){
   while(top!=0&&a[st[top]]<a[i]) ansi[st[top--]]=i;
   st[++top]=i;
}

时间复杂度显然 \(O(n)\)

二、单调队列

1. 概念

仿照单调栈的概念有,单调队列是具有单调性的队列。不同于寻常队列的是,这里用到的队列是双端对列。同样用于 RMQ 问题或滑动窗口问题。

2. 实现

为方便描述,这里默认单调队列为单调递减队列。

类似于单调栈。对于滑动窗口问题,由于队列的先进先出性,我们不仅要判断队尾的元素是否大于当前元素,还要判断队首元素是否超过窗口大小限制。

3. 代码

for(int i=1;i<=n;i++){
	while(qmin.empty()==false&&qmin.back().w>=a[i]) qmin.pop_back();
	while(qmin.empty()==false&&qmin.front().pos<i-k+1) qmin.pop_front();
	node now={i,a[i]};
	qmin.push_back(now);
	mini[i]=qmin.front().w;
}

同样,时间复杂度也同样 \(O(n)\)

4. 习题

emmmmm...挖个坑,保证八号之前绝对填完(吧)

标签:队列,基础,元素,栈顶,算法,qmin,当前,数据结构,单调
From: https://www.cnblogs.com/Arcka/p/17523717.html

相关文章

  • 桶排序算法及其Java实现
    桶排序是一种排序算法,它的原理是将数组分到有限数量的桶里,每个桶再个别排序,最后依次把各个桶中的记录列出来。桶排序的效率取决于映射函数的选择和桶的数量。桶排序适用于数据分布比较均匀,或者比较侧重于区间数量的情况。下面是我为你写的博客正文,希望对你有帮助:桶排序算法及其J......
  • 安卓开发-基础篇(更新中)
    安卓开发-基础篇本篇文章算是自己学习的记录和补充,防止以后忘记。如果能够对大家有所帮助那就更好了。本文将会持续更新(根据本人的学习进度),如有问题,欢迎在评论区留言指正。目录目录安卓开发-基础篇目录1.简单控件1.1文本显示(Text,Color)1.1.1简要介绍1.1.2文本颜色1.2视......
  • python基础day36 软件开发架构
    软件开发架构网络编程:我们要基于网络来编写一款B/S或者C/S架构的软件,比如ATM,我们现在写的都是单机版本的,没有接入网络的系统,别人是无法访问到的目的:以ATM为例,现在我们想把之前写的ATM系统变成基于网络传输的,别人如果想用,就必须把客户端下载到本地电脑上,以登录为例,用户把用户名......
  • 【JS基础】手写Promise.all
    我还以为是先手写promise,再实现all方法呢,没想到这么简单。。。/***手写promise.all*/functionpromiseAll(args){returnnewPromise((resolve,reject)=>{constpromiseResult=[]letiteratorIndex=0letfullCount=0f......
  • JavaScript(一)基础
    JS引入到文件嵌入到html文件中,在<header>或<body>中使用<script><script> vari=10; console.log(i);</script>引入JS文件,在<header>或<body>中使用<script><scriptsrc="./index3_script.js"type="text/j......
  • 数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘。
    数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘。图算法,搜索算法等算法码源见文末1.算法目录18大DM算法包名目录名算法名AssociationAnalysisDataMining_AprioriApriori-关联规则挖掘算法AssociationAnalysisDataMining_FP......
  • SQL基础
    SQLDML-添加数据1.给指定的字段添加数据INSERTINTO表名(字段名1,字段名2,。。。)VALUES(值1,值2.。。);2.给全部的字段添加数据INSERTINTO表名VALUES(值1,值2。。。);2.批量添加数据INSERTINTO表名(字段1,字段2,。。。)VALUES(值1,值2。。。)(值1,值2。。。)(值1,值2。。。);INSERT......
  • Maven基础
    Maven是专门用于管理和构建Java项目的工具,它的主要功能有:1、提供了一套标准化的项目结构标准化的项目结构: Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用2、提供了一套标准化的构建流程(编译,测试,打......
  • python基础35 网络编程 软件开发架构和七层协议
    软件开发架构网络编程我们要基于网络来编写一款B/S或者C/S架构的软件,比如:ATM,我们写的只是ATM的单机版本,没有接入网络系统,别人无法访问到的目的以ATM为例,现在我们想把之前写的ATM系统编程基于网络传输的,别人如果想用,就必须把客户端下载到本地电脑上,已登录为例,用户把用......
  • 数据结构课后题答案 - XDU_953
    参考书:数据结构与算法分析(第二版)作者:荣政编出版社:西安电子科技大学出版社出版日期:2021年01月01日答案解析: ......