- 博客(42)
- 收藏
- 关注
原创 算法竞赛备赛——【字符串】字符串哈希
通过哈希函数将字符串转为整数。对于一个超长的字符串,将其转成用整数存储,需要的时候再转回字符串,可以极大节省空间性质:在Hash函数值不一样的时候,两个字符串一定不一样在Hash函数值一样的时候,两个字符串不一定一样。我们将Hash函数值一样但原字符串不一样的现象称为哈希碰撞举例:b=27 M=131”dsae“ = (d*27^3+s*27^2+a*27+e)%131 看作b进制的数M最大 unsigned long long 2^64-1 系统自然溢出 ----> 自然取余法。
2025-07-24 11:49:55
480
原创 算法竞赛备赛——【图论】欧拉路径
区分:哈密尔顿路径对于一个连通的图G,有:欧拉路径: 一条路径,它能够不重复地遍历完所有的边。这个性质很像不重复地一笔画完所有边,所以有些涉及到欧拉路径的问题叫做一笔画问题。欧拉回路: 一条路径,它能够不重复地遍历完所有的边,并且回到起点。可以看出欧拉回路也是欧拉路径。半欧拉图: 一个图,图中存在欧拉路径。欧拉图: 一个图,图中存在欧拉回路。可以看出欧拉图也是半欧拉图。如何判断有没有欧拉路径/欧拉回路?无向图中:1 存在欧拉路径的充要条件 : 度数为奇数的点只能有0或2个。
2025-07-24 11:49:24
592
原创 算法竞赛备赛——【图论】拓扑排序
前置知识:1.DAG图:一个无环的有向图,即有向无环图。2.AOV网络:在⼀个表示⼯程的有向图中,⽤顶点表示活动,⽤弧表示活动之间的优先关系的有向图称为顶点表示活动的⽹(Activity On Vertex Network),简称AOV⽹。拓扑排序:其实就是对⼀个DAG图构造拓扑序列的过程。拓扑排序算法:kahn(卡恩)算法(基于BFS)和 基于DFS的算法。
2025-07-23 12:32:18
349
原创 算法竞赛备赛——【图论】求最短路径——小结
5.队列优化Bellman-Ford算法(SPFA):时间复杂度玄学,单源最短路,适用于出现负边权的情况,但无法处理存在负权回路的情况。3.Bellman-Ford算法:O(|V||E|),单源最短路,适用于出现负边权的情况,但无法处理存在负权回路的情况。4.堆优化Dijkstra算法:O((|V|+|E|)*log|V|),单源最短路,不能处理存在负边权的情况。1.Floyd算法:O(|V|^3),多源最短路,适用于出现负边权的情况,但无法处理存在负权回路的情况。时使用 可以检验负环。
2025-07-18 11:00:27
261
原创 算法竞赛备赛——【图论】求最短路径——Bellman-Ford & SPFA
存图:边集数组/二维vector/链式前向星最多松弛n-1轮每松弛一轮至少可以确定一个点的最短距离,每一轮至少有一条边被松弛掉不能求负权回路,但可以检验负环。
2025-07-18 10:56:23
584
原创 算法竞赛备赛——【图论】求最短路径——Dijkstra
用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。Dijkstra的时间复杂度是O (|v|^2),它不能处理存在负边权的情况。
2025-07-17 18:05:09
13770
原创 算法竞赛备赛——【图论】求最短路径——Floyd算法
基于动态规划应用:求多源最短路 时间复杂度:n^3dijkstra:不能解决负边权floyd:能解决负边权 不能解决负边权回路问题求最短路径:dijkstra bfs floyd。
2025-07-17 17:42:15
488
原创 算法竞赛备赛——【图论】链式前向星
图的存储方式:通用的三种:邻接矩阵、邻接表、边集数组有向图:十字链表无向图:多重邻接表刷题常用:邻接矩阵、链式前向星(邻接表变形)
2025-04-06 17:06:20
648
原创 算法竞赛备赛——【数据结构】二叉树
二叉树的问题大多基于递归实现(面试较多 力扣的二叉树的题会多一些 竞赛遇到的较少)(线的总数 2n2+n1=n2+n1+n0-1)n0=n2+1。n个节点 x个度为0的节点 有x-1个度为2的节点。先序对应入栈 中序对应出栈顺序 用卡特兰数可求。先序+中序可以确定一棵树。
2025-04-01 17:20:44
592
原创 算法竞赛备赛——【数据结构】并查集
注意根据数据大小来开int 或者 long long 否则容易MLE树的存储结构 双亲表示法——数组 孩子表示法 孩子兄弟表示法。
2025-03-31 23:28:30
660
原创 算法竞赛备赛——【数据结构】链表
跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能,有序链表实现而二分查找。让两个指针相差k个 只用遍历一轮。有点复杂 暂时不需要做。
2025-03-21 20:01:44
701
原创 算法竞赛备赛——二分
前提:库函数只能对数组进行二分查找。数组中元素是单调的,一般为单调不减/单调不增。如果不单调,可先用sort变为单调。时间复杂度:O(logn)见常用库函数见常用库函数:最大的最小值 、不比x大的最大值、最大的最近。
2025-03-02 14:45:00
2047
原创 算法竞赛备赛——【背包DP】二维费用背包、分组背包
有一个体积为V的背包,商店有n种物品,每种物品有一个价值v、体积w、重量m,每种物品仅有1个,问能够装下物品的最大价值。这里每一种物品只有2种状态即“拿0个、1个”,但是需要同时考虑体积和重量的限制。只需要在01背包的基础上稍加改动,dp[i][j]表示当前体积为i,重量为j的情况下所能拿的物品的最大价值。状态转移方程为dp[i][j]=max(dp[i][j],dp[i-w][j-m]+v)
2025-02-18 23:40:10
1037
原创 算法竞赛备赛——【背包DP】多重背包
有一个体积为V的背包,商店有n种物品,每种物品有一个价值v和体积w,每种物品有s个,问能够装下物品的最大价值。这里每一种物品只有s+1种状态即“拿0个、1个、2个…s个”在基础版模型中,多重背包就是将,从而退化成01背包处理只需要在01背包的基础上稍加改动,即可时间复杂度为O(nsV)
2025-02-17 15:51:13
1029
原创 算法竞赛备赛——【背包DP】01背包、完全背包
有一个体积为V的背包,商店有n个物品,每个物品有一个价值v和体积w,每个物品只能被拿一次,问能够装下物品的最大价值。这里每一种物品即“拿”或“不拿”设状态dp[i][j]示到第i个物品为止,拿的物品总体积为j的情况下的最大价值。我们并不关心某个物品有没有被拿,只关心当前体积下的最大价值转移方程为:dp[i][j] = max(dp[i-1][j],dp[i-1][j-w]+v);如果不拿物品i,那么最大价值就是 dp[i-1][j],如果拿了就是从体积j-v转移过来,体积会变大w,价值增加v。
2025-02-16 16:08:02
1174
原创 算法竞赛备赛——【动态规划DP】最长公共子序列LCS
在求解LCS时,一般设dp[i][j]表示A[1~i]序列和B[1~j]序列中的最长公共子序列的长度(不规定结尾),状态转移方程为此方法的时间复杂度为:O(n^2)
2025-02-15 11:21:44
375
原创 算法竞赛备赛——【动态规划DP】最长上升子序列LIS
在求解LIS时,一般设dp[i]表示1~i序列中以a[i]结尾的最长上升子序列的长度,状态转移方程为dp[i]=max(dp[j]+1),if a[i]>a[j];此方法的时间复杂度为:O(n^2)
2025-02-14 12:11:39
624
原创 算法竞赛备赛——【动态规划DP】线性DP
DP(动态规划)全称Dynamic Programming,是运筹学的一个分支,是一种将复杂问题分解成很多重叠的子问题,并通过子题的解得到整个问题的解的算法。基本步骤确定状态,一般为“到第i个为止, x为i (x为k) 的方案数/最小代价/最大价值”,可以根据数据范围和复杂度来推理确定状态转移方程,即从已知状态导到新状态的方法,并确保按照这个方向一定可以正确地得到最终状态。根据状态转移的方向来决定使用迭代法还是递归法 (记忆化)确定最终状态并输出。
2025-02-12 11:51:22
2358
原创 算法竞赛备赛——【搜索】迭代加深搜索、启发式搜索
迭代加深是一种深度优先搜索。本质还是深度优先搜索,只不过在搜索的同时带上了一个深度,当达到设定的深度时就返回,一般用于找。如果一次搜索没有找到合法的解,就让设定的深度加一,重新从根开始。迭代加深搜索就是控制了搜索深度的DFS,总体来看像一个BFS,将深搜和广搜结合起来,且通过剪枝灵活地控制宽度与深度,就很好的解决了DFS时间复杂度高和BFS队列高内存的弊端,提高了搜索的效率。注意事项:在大多数的题目中,广度优先搜索还是比较方便的,而且容易判重。
2025-02-11 15:19:23
1122
原创 算法竞赛备赛——【搜索】记忆化搜索
将搜索过程中会重复计算且结果相同的部分保存下来,作为一个状态,下次访问到直接返回结果。通常会使用数组或者map来进行记忆化。下标一般和dfs的参数表对应。需要保证重复计算的结果相同。例题:斐波那契数列设F[1]=1,F[2]=1,F[n]=F[n-1]+F[n-2],求F[n],结果对1e9+7取模。样例输入:5000样例输出:976496506。
2025-02-10 11:26:11
970
原创 算法竞赛备赛——【搜索】剪枝
将搜索过程中一些不必要的部分直接剔除。剪枝是回溯法的一种优化手段,先写一个暴力搜索,然后找到某些特殊的数字关系或者逻辑关系,通过约束来降低时间复杂度。
2025-02-09 11:12:26
1036
原创 算法竞赛备赛——【搜索】BFS、双向BFS
BFS是广度优先搜索,第一次遇到的某个状态即为到这个状态的。BFS 最主要用途。:BFS比DFS快。注意:如果图中的边有权重,且不是所有边的权重都相同,那么不能用 BFS 来找最短路径,而要用其他算法,比如 Dijkstra 算法。广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:把根节点放到队列的末尾。每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。
2025-02-08 10:32:47
1987
原创 算法竞赛备赛——【搜索】DFS
深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止。与类似。排列搜索树。
2025-02-07 10:31:39
1273
原创 算法竞赛备赛——【基础算法】位运算
按位与 & (两个1为1) 按位或 | (有1为1) 按位取反 ~ (0变1 1变0) 按位异或 ^ (相同为0 不同为1) 左移<< (×2) 右移 >> (÷2)&作用:取地址 引用 按位与^异或:异或不会使得位宽变大 所以a1^a2<=2*n 异或运算。
2025-02-06 11:31:19
588
原创 算法竞赛备赛——【基础算法】离散化、双指针
离散化是一种将数组的值域压缩,从而更加关注元素的大小关系的算法。当原数组中的数字很大、负数、小数(大多数情况是数字很大),难以将”元素值“表示为”数组下标“,一些依靠下标实现的算法和数据结构无法实现时,就考虑将其离散化。离散化一般结合其他算法或数据结构(树状数组、线段树、二维平面的计算几何)进行考察,一般不单独考察。要求:内部有序,sort使其有序;去重;可以直接通过离散化下标得到值,也可以通过值得到离散化下标(通过二分得到/lower_bound)利用vector实现。
2025-02-05 09:57:14
905
原创 算法竞赛备赛——【基础算法】前缀和、差分
一种预处理算法,只适用于a数组为静态数组的情况,即a数组中的元素在区间和查询过程中不会进行修改。如果需要实现“先区间修改,再区间查询”使用差分数组。如果需要实现“一边修改,一边查询”使用树状数组或线段树等数据结构。
2025-02-04 10:01:11
991
原创 算法竞赛备赛——贪心
基本原理:每一步都选择局部最优解,而尽量不考虑对后续的影响,最终达到全局最优解。局限性:贪心算法不能保证获得全局最优解,但在某些问题上具有高效性。特征:贪心选择性质,最优子结构性质,(操作次数一定,不同操作产生贡献相同,每次选择代价最小的)贪心往往和排序、优先队列等一起出现。
2025-02-01 17:01:16
1061
原创 算法竞赛备赛——常用STL
头文件:#include<utility>表示一对值pair:先按照first升序排序,若相等再按照second升序排序。
2025-01-29 23:28:49
480
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅