当前位置: 首页 > news >正文

数据结构算法

⩕ 单调栈

1、概念

对于一个栈,维持其单调性,有两种情况,单调递增栈:由栈底到栈顶单调递增

单调递减栈:由栈底到栈顶单调递减

2、核心模板( 单调递增栈 )
stack<int>  stk;
void    insert(int x)
{while(!stk.empty() && stk.top() > x)stk.pop();stk.push(x);
}
3、应用

可用于找到一序列中某一元素一侧首个大于或小于它的元素

————————————————————————————

⩕ 单调队列

〇 单调队列

1、概念

对于一队列,维持其单调性,有两种情况,单调递增队列:从队尾到队头单调递增

单调递减队列:从队尾到队头单调递减

2、核心模板
deque<int>  q;
void    insert(int x)
{while(!q.empty() && q.back() < x)q.pop_back();q.push_back(x);
}

〇 滑动窗口

1、概念

对一长为 n 的数组,有一长为 k( k <= n )的滑动窗口在其上滑动,且维持滑动窗口上的单调性

2、原理

设长为 n 的数组 a[n] ,

————————————————————————————

⩕ kmp算法

〇 寻找首个模式串

1、暴力解法( BF )

两重循环:i 循环主串 s ,j 循环模式串 t

在循环过程中 i ,j 会不断回溯,因此此解法效率低下

2、kmp优化原理
3、核心模板
void    getnext(string &t)
{int i = 0;k = -1;next[0] = -1;while(i < t.size()){if(k == -1 || t[i] = t[k])  next[++i] = ++k;else    k = next[k];}
}
int kmp(string &s , string &t)
{int i = 0,j = 0;while(i < s.size() && j < (int)t.size()){if(j == -1 || s[i] = t[j])  i++,j++;else    j = next[j];}if(j == t.size())   return  i - j;else    return  -1;
}
4、深入分析

next数组中存的是模式串t 在与主串s 匹配失败时 模式串t 在当前失配位置可右移到的最大位置

如:模式串t A B C A B

t的下标 0 1 2 3 4

next数组 -1 0 0 0 1

若在第一个A处失配,则应回溯到模式串t 中 -1 的位置,但模式串t 中无该位置,即不回溯

若在第一个B处失配,则应回溯到模式串t 中 0 的位置,即第一个A处

若在第二个B处失配,则应回溯到模式串t 中 1 的位置,即第一个B处

. . . . . .

对前缀指针 k ,后缀指针 i ,其初始化分别为 k = -1,i = 0,其中 i 一直后移,若前后缀匹配成功则,i,k 均后移

对 i 的状态分析:i 一直后移并与 k 所指向的元素匹配,匹配成功时,i ,k 均后移,将此时 k 所指元素的位置存入next数组

匹配失败时,i 后移,k 回溯,将上一次匹配成功的位置存入next数组

对 k 的状态分析:1、k = -1 : 初始状态 ,此时可看作 k 指向模式串外的一万能值,即可与任意值成功匹配,即 k = -1 时就视为匹配成功一次,此时 k 后移指向模式串t 中 t[0] ,即模式串中首个元素,模式串失配时即回溯到第一个元素

2、++k: 配对成功后 k 值更新,此时 k 可视作有两重含义,一是指向模式串t 中前缀元素的指针后移

二是模式串t 中前缀与后缀连续成功匹配的长度,且该长度为 k + 1

3、k = next[k]: k 匹配失败后回溯,回溯位数为 k + 1,即回溯到首个前后缀匹配成功的位置的前一位置,

连续成功匹配的长度可写作( k + n )+ 1,其中 k + n 表示 k 后移的过程,n 表示 k 后移的位数( n = 1,2,3 ... )

上式可写为 k + n + 1,即 k 是首个匹配成功的位置的前一位置,n + 1 即从该位置向后成功匹配的位数

k = next[k] 即回溯到了首个前后缀匹配成功的位置的前一位置

〇 优化next数组

1、情景

在某些情况下,next数组的处理效率并不是很高

如:主串s A A A B A A A A B

模式串t A A A A B

模式串t下标 0 1 2 3 4

next数组 -1 0 1 2 3

如上所示,设两个指针:i 指向主串s,j 指向模式串t 模式串t 在 j = 3 时与主串s 失配,依 next数组 此时指向 模式串t 的指针 j 应回溯到 t[2] ,然而易知 j = 2 时仍失配,此时 j 会回溯到 t[1] ,但 j = 1 时仍失配,此时 j 回溯到 t[0]

由上可知,next数组在上述情况中效率较低,在 j = 3 处失配时由于左侧均为重复元素,合理的操作应为直接回溯到 t[0] 即首个重复元素处

2、优化原理

增加一层判断,即判断相邻元素是否相同,相同则在对应的next数组的位置存入首个重复元素的位置

3、核心模板

void    getnextval(int nextval[],string &t)
{int i = 0,k = -1;nexxtval[0] = -1;while(i < t.size() - 1){if(k == -1 || t[k] == t[i]){if(t[++k] != t[++i])    nextval[i] = k;else    nextval[i] = nextval[k];}else    k = nextval[k];}
}

〇 寻找所有的模式串

1、前缀函数

用一长度为 m 的 Pi 数组表示,Pi[ i ] 表示 t[ 0 ... i ] 这个子串的最长公共前后缀的长度,则 Pi数组 与 next数组 有以下关系

Pi[ i ] = | next[ 1 ] = 0 , i = 0

| next[ i + 1 ] , i > 0

2、核心模板
vector<int> getPrefix(string &t)
{int m = t.size();vector<int> Pi(m);for(int i = 1;i < m;i++){int k = Pi[i - 1];while(k && t[k] != t[i])    k = Pi[k - 1]if(t[k] == t[i])    k++;Pi[i] = k;}return  Pi;
}
vector<int> kmp(string &s,string &t)
{int n = s.size(),m = t.size();string  r = t + '#' + s;Pi[m] = getPrefix( t );vector<int> res;for(int i = m + 1;i <= n + m;i++)if(Pi[i] == m)  res.push_back(i - 2 * m);return  res;
}

〇 寻找所有的模式串

1、前缀函数

用一长度为 m 的 Pi 数组表示,Pi[ i ] 表示 t[ 0 ... i ] 这个子串的最长公共前后缀的长度,则 Pi数组 与 next数组 有以下关系

Pi[ i ] = | next[ 1 ] = 0 , i = 0

| next[ i + 1 ] , i > 0

2、核心模板
vector<int> getPrefix(string &t)
{int m = t.size();vector<int> Pi(m);for(int i = 1;i < m;i++){int k = Pi[i - 1];while(k && t[k] != t[i])    k = Pi[k - 1]if(t[k] == t[i])    k++;Pi[i] = k;}return  Pi;
}
vector<int> kmp(string &s,string &t)
{int n = s.size(),m = t.size();string  r = t + '#' + s;Pi[m] = getPrefix( t );vector<int> res;for(int i = m + 1;i <= n + m;i++)if(Pi[i] == m)  res.push_back(i - 2 * m);return  res;
}

————————————————————————————

⩕ 并查集

1、应用

将两个集合合并,询问两个元素是否在同一集合中

2、基本原理

每个集合用一棵树表示。树根编号代表整个集合的编号,每个节点储存它的父节点,p[ x ] 表示 x 的父节点

3、实现原理

树根的判断:if( p[ x ] = x )

求 x 的集合编号:while( p[ x ] != x ) 从 x 开始一级级向上寻找其父节点,直到找到树根

合并集合:p[ x ] 是 x 集合的编号,p[ y ] 是 y 集合的编号,令 p[ x ] = y ,连接其树根即可合并两集合

4、核心模板
int find(int x)     //找到x所在集合
{if(p[x] != x)   p[x] = find(p[x]);return  p[x];
}
​
void    merge(int a,int b)      //合并两个集合
{int pa = find(a);int pb = find(b);if(pa != pb)p[pa] = pb;
}
​
void    query(int a,int b)      //询问a,b是否在同一集合
{int pa = find(a);int pb = find(b);if(pa == pb)    cout<<"YES"<<endl;else    cout<<"NO"<<endl;
}

————————————————————————————

⩕ 模拟堆

1、概念

堆是储存数据的一种方式,可用完全二叉树表示

可分为两类,大根堆:根节点最大,向下递减

小根堆:根节点最小,向下递增

2、堆的核心操作

up:符合堆单调性的上浮

down:不符合堆单调性的下沉

堆的所有操作均可依靠上述两核心操作完成

3、堆的基础操作 ( 以小根堆为例 )

堆排序

插入数据:在堆的尾部插入新数据,再排序,即 heap[++idx] = x; up(idx);

取最小值:最小值即 heap[1]

删除最小值:先删除堆顶元素,再将堆尾元素放至堆顶,再排序 heap[1] = heap[idx]; idx--; down(1);

删除任意元素

4、堆的储存方式

定义一 heap 数组进行储存,将 heap[ 1 ] 设为树根,若 heap[ x ] 为某一节点,则 heap[ 2*x ] 、heap[ 2*x+1]分别为其左右儿子节点,

5、核心模板
void    down(int u)
{int t = u;if( 2*u <= idx && h[ 2*u ] < h[t] ) t = 2*u;if( 2*u + 1 <= idx && h[ 2*u + 1] < h[t]) t = 2*u + 1;if( u != t )    swap(h[u],h[t])
}
​
void    up(int u)
{while( u/2 && h[u/2] > h[u]){swap(h[u],h[u/2])u/2;}
}

欢迎订阅专栏,数据结构实验,期末大作业,前端后端,算法都有哦,想我发哪个方面的资源或文章可以私信我,免费的哦

相关文章:

数据结构算法

⩕ 单调栈 1、概念 对于一个栈&#xff0c;维持其单调性&#xff0c;有两种情况&#xff0c;单调递增栈&#xff1a;由栈底到栈顶单调递增 单调递减栈&#xff1a;由栈底到栈顶单调递减 2、核心模板&#xff08; 单调递增栈 &#xff09; stack<int> stk; void …...

WordPress个性化站点

这个信息爆炸的时代&#xff0c;拥有一个能够迅速传达信息、展示个性、并能够与世界互动的在线平台&#xff0c;已成为企业和个人的基本需求。WordPress以其无与伦比的易用性和强大的扩展性&#xff0c;成为了构建此类平台的首选工具。而LNMP是由Linux、Nginx、MySQL和PHP组成的…...

GESP C++ 2024年03月一级真题卷

一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 C表达式 (3 - 2) * 3 5 的值是( )。 A. -13 B. 8 C. 2 D. 0 答案&#xff1a;B 解析&#xff1a;略 第 2 题 C 语句 cout << "5%2" << 5 % 2 执行后的输出是…...

Linux驱动开发基础(Hello驱动)

所学内容来自百问网 目录 1. 文件在内核中的表示 2. 打开字符设备节点时&#xff0c;内核中也有对应的struct file 3. 编写驱动程序步骤 4. 相关知识点 4.1 涉及函数解析 4.2 module_init/module_exit的实现 4.3 register_chrdev的内部实现 4.4 class_destroy/device_…...

centos7安装 ES集群 elasticsearch

这里写自定义目录标题 编写启动脚本 elasticsearch.sh启动可能报错&#xff1a;elasticsearch 7.10启动报错 bootstrap checks failed解决方法问题原因&#xff1a;注意 退出xshell&#xff0c;重新登录&#xff1a; 上面两个配置项改完后&#xff0c;ES启动用户(es 或root) **…...

互联网应用主流框架整合【Redis数据结构及常用命令】

在大部分情况下我们使用Redis只是执行一些简单的命令操作&#xff0c;通常无需区分是否是在一个连接池里的同一个链接去执行&#xff0c;如果需要执行多条命令&#xff0c;需要保证命令在同一个链接里完成&#xff0c;则采用SessionCallback接口操作即可 Redis数据结构-字符串…...

GORM 自动迁移与命名策略

在现代软件开发中&#xff0c;数据库结构的维护和迁移是常见的挑战之一。GORM&#xff0c;作为 Go 语言中强大的 ORM 库&#xff0c;提供了自动迁移功能&#xff0c;帮助开发者轻松地管理数据库表结构的变更。此外&#xff0c;GORM 还允许开发者通过命名策略&#xff08;Naming…...

python社会科学问题研究的计算实验

实验十五&#xff1a;社会科学问题研究的计算实践 1.实验目标及要求 &#xff08;1&#xff09;掌握网络视角 &#xff08;2&#xff09;掌握社会网络基础内容 &#xff08;3&#xff09;掌握友谊悖论 2.实验主要内容 随机生成一次符合社会网络特征的网络&#xff0c;通过计…...

Element Plus 发布 2.8.0

功能特性 组件更新 [color-picker] alpha-slider a11y (#14245 by tolking)添加 mention 组件 (#17586 by Fuphoenixes)[tree-v2] 添加 scrollTo 方法 (#14050 by kaine0923)[drawer] 添加 append-to 属性 (#17761 by tolking)[table] tree children 添加严格检查 (#13519 by t…...

解释区块链技术的应用场景和优势-水文

区块链技术是一种去中心化的分布式账本技术&#xff0c;其应用场景和优势如下&#xff1a; 金融领域&#xff1a;区块链可以用于加密货币交易&#xff0c;提供安全的、去中心化的支付系统。它也可以用于股票、债券和其他金融交易的记录和结算&#xff0c;提高交易的透明度和效率…...

等保测评基础知识(一)

1、时间类&#xff1a; 网络安全法&#xff1a; 2017年6月1日等保2.0实施时间&#xff1a; 2019年12月1日密码法&#xff1a; 2020年1月1日个人信息保护法&#xff1a; 2021年11月1日&#xff0c;数据安全法实施时间&#xff1a; 2021年9月1日关键信息基础…...

股指期货套期保值中的展期管理有哪些?

在复杂的金融市场环境中&#xff0c;展期作为一种重要的风险管理工具&#xff0c;被广泛应用于期货交易中&#xff0c;特别是当投资者需要对长期资产进行套期保值时。展期的核心思想在于&#xff0c;通过连续替换高流动性的近月期货合约来替代流动性较差的远月合约&#xff0c;…...

如何通过参考文献找到原文

当只有参考文献想要获取原文时&#xff0c;通常会用到以下方法&#xff1a; 举例参考文献1. 杨忠华,周勃,宁宝宽,等.面向新能源产业的专业研究生研创能力培养实践探索——基于“政产学研用”融合驱动[J].高教学刊,2024,10(23):19-22.DOI:10.19980/j.CN23-1593/G4.2024.23.004…...

春秋云境 | SQL | CVE-2022-4230

目录 靶标介绍 开启靶场 wpscan漏洞介绍 查询数据库表名 查询表中字段名 查询字段下数据 靶标介绍 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数&#xff0c;这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下&#xff0c;具有管理选项功能 (ad…...

3.串口(UART)

串口理论部分可看51部分&#xff1a;链接 数据帧 帧头(2字节&#xff0c;例如AA、BB) 数据长度&#xff08;2字节&#xff09; 数据 CRC16校验&#xff08;2字节&#xff09; 帧尾&#xff08;2字节&#xff09; 代码编写 串口一发送命令控制LED灯(PB5、PE5) LED灯、串口、…...

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载 2024 年 8 月 8 日凌晨&#xff0c;macOS Sonoma 14.6.1 发布&#xff0c;本更新包含了重要的错误修复&#xff0c;并解决了导致高级数据保护无法启用或停用的问题。同时带来了 macOS Ventura 13.6.9 安全更新。 本…...

论企业私域流量运营中的玩法创新与开源 AI 智能名片 O2O 商城小程序的应用

摘要&#xff1a;本文旨在探讨企业在构建私域流量池时的多种玩法策略&#xff0c;并着重分析如何针对不同类型客户制定个性化方案。同时&#xff0c;引入开源 AI 智能名片 O2O 商城小程序这一工具&#xff0c;阐述其在私域流量运营中的重要作用和价值&#xff0c;为企业提升运营…...

nginx.conf alias 静态资源 别名 nginx配置

Linux系统Bug 报权限不足错误 user root; 解决server_name太长时报错的问题 #解决server_name太长时报错的问题server_names_hash_bucket_size 64; 解决文件上传默认限制1M的问题 #解决文件上传默认限制1M的问题client_max_body_size 100m; 监听所有端口 server_name _; a…...

pve虚拟机使用

文章目录 1.pve 直通硬盘 1.pve 直通硬盘 查看硬盘号&#xff1a; ls /dev/disk/by-id -lqm set 101 --virtio1 /dev/disk/by-id/usb-HIKSEMI__93963907-0:0挂载sata类型&#xff1a; qm set 101 --sata1 /dev/disk/by-id/ata-ST4000DM004-2U9104_WFN7TMVV可以将一个硬盘挂…...

Linux:进程概念详解

1. 冯诺依曼体系结构 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 。 【注意】&#xff1a; a. 这里的存储器指的是内存 b. 不考虑缓存情况&#xff0c;这里的CPU能且只能对内存进行读写&#xff0c;不能访问外设(输入或输出设备) c.外…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...