算法基础
文章平均质量分 57
m0_74911187
这个作者很懒,什么都没留下…
展开
-
KMP算法
一般来说,我们最常见也是最容易想到的就是暴力枚举字符串A中的每个位置i,把字符串B与字符串A的后缀A【i~N】对齐,向后扫描逐一比较B【1】与A【i】,B【2】与A【I+1】……是否相等。我们把这种比较的过程称为A与B尝试进行“匹配”。上述的做法虽然常见,思路简单,但是时间复杂度是很高的,理想情况是O(N+M),但是很容易被卡成O(NM),且理想情况的概率是极小的,所以我们要学习KMP算法,KMP算法可以在O(N+M)的时间复杂度求出上述问题。原创 2023-08-06 20:38:30 · 48 阅读 · 0 评论 -
【快速排序和归并排序】
一,快速排序(时间复杂度为O(NlogN),最坏情况为O(N))对于快速排序,我们得思路是,选择一个值做为我们得分界点(一般为数组得第一个元素),使得数组左边得数都小于这个值,数组右边得数都大于这个值附上代码如图: 二,归并排序(时间复杂度为O(Nlog N))归并排序得思想和快速排序差不多,都是基于分治,归并排序选取得值为数组长度得中间值,将数组分割成多个小数组,然后再将他们合并,归并排序相较于快速排序比较稳定附上代码如图:原创 2023-07-15 21:27:20 · 68 阅读 · 1 评论 -
整数二分与实数二分
第二种:二,实数二分实数二分相较于整数二分简单,代码如图:原创 2023-07-15 21:32:55 · 106 阅读 · 1 评论 -
前缀和与差分
代码如图:一维数组差分代码如图:原创 2023-07-15 21:41:17 · 72 阅读 · 1 评论 -
离散化模板
一.离散化离散化的核心思想就是将一个长度非常长的数组映射到一个小数组上,一般是用vector来实现,通过去重排序后数组按升序排列,每个数都会对应一个下标,对于在区间需要单点修改与区间查询时需要先查找该数对应的数组下标。代码如图:(题目来源于acwing802)原创 2023-07-16 15:13:04 · 63 阅读 · 1 评论 -
数组模拟单链表和双链表
【代码】数组模拟单链表。原创 2023-07-16 17:13:45 · 53 阅读 · 1 评论 -
单调栈与单调队列模板
一,单调栈 时间复杂度O(N)单调栈主要用于在O(N)的时间复杂度内找到一个数左右两边第一个大于这个数的数是哪个或者第一个小于这个数的数是哪个代码如图: 二,单调队列 时间复杂度为O(N)单调队列主要用于求动态区间的最值,数组模拟的单调队列要比stl容器中的priority_queue速度要快代码如图(该题为滑动窗口的题解):原创 2023-07-16 20:11:12 · 53 阅读 · 1 评论 -
trie树(字典树)模板
字典树是用于高效存储和查询字符串集合的数据结构字典树的结构长这样: 从根节点开始遍历往下找,如果没有所需结点,则插入一个新结点。如何判断当前结点是否为一个单词末尾:在这个单词末尾的结点进行标记代码如图: idx用于给结点编号原创 2023-07-17 09:07:02 · 53 阅读 · 1 评论 -
并查集模板
并查集可以高效的将两个集合合并和询问两个集合是否在一个元素当中基本原理:每个集合用一颗树来表示。树根的编号就是整个集合的编号,每个节点存储它的父节点,f[x]表示x的父节点问题一:如何判断树根如果f[x]==x,那么x节点就是树根问题二:如何求x的集合编号while(f[x]!=x)x=f[x] (这个操作可以进行路径压缩,在寻找的过程将路径上的节点都指向根节点,详见代码)问题三:如何合并两个集合f[x]是 x的集合编号,f[y]是y的集合编号,p[x]=y代码如图:原创 2023-07-17 10:43:02 · 75 阅读 · 1 评论 -
堆的初理解
【代码】堆的初理解。原创 2023-07-17 16:15:40 · 45 阅读 · 1 评论 -
整数哈希与字符串哈希
那么现在的问题就是P和MOD如何取值,什么时候会用到哈希呢?原创 2023-07-17 22:01:00 · 430 阅读 · 1 评论 -
DFS与BFS以及图的存储以及遍历
【代码】DFS与BFS以及图的存储以及遍历。原创 2023-07-18 17:07:47 · 76 阅读 · 1 评论 -
最短路的相关算法
dijkstra算法是基于贪心的思想,从源点开始,我们每次选取距离源点最近点,然后以这个点去更新接下来的点,直至全部点都更新完,初始时要将每个点距离源点的距离初始化为极大值,最后如果还为极大值表示从源点无法走到这个点。对于朴素算法,我们要得到每个点距离源点的最近距离,要遍历全部的点,那就是O(N)的时间复杂度,对于这个地方我们就可以进行优化,用堆来存储每个点距离源点的最短距离,想得到最小的点,那就是O(logN)得。用邻接矩阵得方法实现得代码如图;原创 2023-07-18 21:56:59 · 168 阅读 · 1 评论 -
最小生成树与二分图
接下来依次介绍每种解法。原创 2023-07-19 21:14:13 · 81 阅读 · 0 评论 -
数论汇总
3,线性筛法求质数 时间复杂度几乎为O(N)1,试除法判定质数 时间复杂度O(sqrt(N))2.分解质因数 时间复杂度O(sqrt(N))原创 2023-07-20 11:20:20 · 255 阅读 · 0 评论 -
背包问题汇总
有 N件物品和一个容量是 V的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原创 2023-07-23 08:29:49 · 338 阅读 · 0 评论 -
DP汇总
用一个二维数组dp[i][j] 表示从顶点走到第 i 行第 j 列的值的集合,集合属性为最大值,可以发现dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])题目可能出现某个位置上是负数的情况,所以首先要初始化为负无穷代码如下:时间复杂度O(N^2)二,最长上升子序列1,朴素解法时间复杂度为O(N^2) 以一个一维数据dp[i]表示以 i 结尾的最长上升子序列的集合,集合属性为最大值如果i的前一个数j小于i,那么dp[i]=max(dp[j]+1)代码如下:2,用原创 2023-07-24 11:43:10 · 119 阅读 · 0 评论 -
贪心汇总
解题思路,将所有区间按左端点从小到大排序,从前往后依次枚举每个区间,在所有能覆盖start的区间中选择右端点最大的区间,然后将start更新成右端点的最大值。给定N个区间[ai,bi],以及一个线段区间【s,t】,选择尽可能少的区间完全覆盖线段区间【s,t】,输出最少选择区间的数量,如果不能实现则输出-1。假定每个果子重量都为 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。输入包括两行,第一行是一个整数 n,表示果子的种类数。原创 2023-07-25 20:35:34 · 41 阅读 · 0 评论