算法笔记
文章平均质量分 57
基本算法的总结
kgduu
这个作者很懒,什么都没留下…
展开
-
Kruskal算法
【代码】Kruskal算法。原创 2024-01-21 12:00:16 · 398 阅读 · 0 评论 -
BellmanFord算法
【代码】BellmanFord算法。原创 2023-11-19 22:18:30 · 293 阅读 · 1 评论 -
车辆调度算法
有什么车辆调度算法的最新研究,比如用强化学习的方法?策略算法工程师之路-图优化算法(一)(二分图&最小费用最大流)模拟退火(SA)算法求解容量受限的车辆路径(CVRP)问题世界冠军之路:菜鸟车辆路径规划求解引擎研发历程VRP相关知识整理vrp算法有哪些?原创 2023-10-12 13:50:05 · 513 阅读 · 0 评论 -
图论中边的概念
前向边:上图中左边的红线表示的边,由结点指向子孙节点。交叉边:上图中右边的绿线表示 的边。反向边:上图中的虚线表示的边。树边:上图中的黑色的边。原创 2023-08-31 10:35:20 · 253 阅读 · 0 评论 -
Dijkstra算法
结点分为两个集合,已确定最短路径的点集合S和未确定最短路径的点集合T,使用。表示从起点s到终点u的最短路径。原创 2023-08-29 19:22:37 · 154 阅读 · 0 评论 -
Floyd_warshall算法
原理是使用动态规划算法。的距离,并且中间只经过。原创 2023-08-13 23:02:15 · 245 阅读 · 0 评论 -
算法思维导图
fill:#333;color:#333;color:#333;fill:none;算法图算法最短路径Dijkstra。原创 2023-08-12 11:19:26 · 236 阅读 · 0 评论 -
并查集学习理解
并查集原创 2023-04-02 11:23:31 · 172 阅读 · 0 评论 -
数字转中文
数字转中文原创 2023-03-25 14:05:41 · 104 阅读 · 0 评论 -
循环队列实现
循环队列实现原创 2023-03-17 17:57:03 · 99 阅读 · 0 评论 -
动态规划算法
1、基础动态规划应用于子问题重叠的情况:要去刻画最优解的结构特征; 尝试递归地定义最优解的值(就是我们常说的考虑从转移到); 计算最优解; 利用计算出的信息构造一个最优解。2、原理2.1 最优子结构具有最优子结构也可能是适合用贪心的方法求解。注意要确保我们考察了最优解中用到的所有子问题。证明问题最优解的第一个组成部分是做出一个选择; 对于一个给定问题,在其可能的第一步选择中,你界定已经知道哪种选择才会得到最优解。你现在并不关心这种选择具体是如何得到的,只是假定已经知道...原创 2022-04-09 19:47:20 · 367 阅读 · 0 评论 -
算法相关资源
The Ultimate Topic List (with Resources, Problems and Templates) - CodeforcesI compiled a list of almost all useful blogs ever published on Codeforces [update: till 09.06.2021] - Codeforces原创 2021-12-04 21:12:42 · 109 阅读 · 0 评论 -
模乘逆算法
求满足于下面条件的x:其并不是总是存在,只要在a和m是互质的才存在,即1、扩展欧几里德算法实现如下:int x, y;int g = extended_euclidean(a, m, x, y);if (g != 1) { cout << "No solution!";}else { x = (x % m + m) % m; cout <&...原创 2021-10-31 17:03:56 · 311 阅读 · 0 评论 -
后缀数组学习笔记
1、基本定义子串:字符串原创 2014-10-09 22:57:08 · 722 阅读 · 0 评论 -
算法(第4版)学习笔记
1、概要原创 2021-10-14 12:06:29 · 165 阅读 · 0 评论 -
迭代加深搜索
每次限制搜索深度的深度优先搜索。本质还是深度优先搜索,只不过在搜索的同时带上了一个深度d,当d达到设定的深度时就返回,一般用于最优解。如果一次搜索没有找到合法的解,就让设定的深度加1,重新从要开始。因为BFS的基础是一个队列,队列的空间复杂度很大,当状态比较多或者单个状态比较大时,使用队列的BFS就显出了劣势。事实上,迭代加深类似于用DFS方式实现的BFS,它的空间复杂度相对较小。当搜索树的分支比较多时,每增加一层的搜索复杂度会出现指数级爆炸式增长,这时前面重复进行的部分所带来的复杂度几乎可以忽略,这也原创 2021-10-12 20:37:04 · 741 阅读 · 0 评论 -
前缀函数及kmp算法
1、字符串基础1.1字符集一个字符集是一个建立了全序关系的集合,也就是说中的任意两个不两只的元素和都可以比较大小,要么,要么。字符集中的元素称为字符。1.2字符串一个字符串S是将n个字符顺次排列形成的序列,n称为S的长度,表示为。S的第i个字符表示为S[i]。1.3子串字符串S的子串S[i..j],,表示S串中从i到j这一段,也就是顺次排列S[i], S[i+1],...,S[j]形成的字符串。1.4子序列字符串S的子序列是从S中将若干元素提取出来并不改变相对位置形成...原创 2021-09-25 17:30:53 · 580 阅读 · 0 评论 -
扫描线填充算法
1、基本思想用水平扫描线从上到下(或者从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。多边形被扫描完毕后,颜色填充也完成了。包含4个步骤求交,计算扫描线与多边形的交点 交点排序,对第2步得到的交点按照x值从小到大进行排序。 颜色填充,对排序后的交点两两组成一个水平线段,以画线段的方式进行颜色填充。 是否完成多边形扫描?如果是结束算法,否则改变扫描线,然后转第1步原创 2021-08-23 22:33:22 · 4914 阅读 · 0 评论 -
字符串的第n个排列的算法
1、next_permutation算法直接使用STL中的2、阶乘数制法直接计算第n个排列,不需要找到所有的排列再找到第n个。阶乘数系统使用阶乘值而不是数的幂来表示位值。位值有5!=120 4!=24 3!=6 2!=1 1!=1 0!=10阶位值总是为0,1阶位值可以是0或者1,2阶位值可以是0,1,2,依此类推。前几个数用阶乘数系统表示如下0 -> 0 = 0 * 0!1 -> 10 = 1 * 1! + 0 * 0!2->...原创 2021-08-08 15:35:50 · 414 阅读 · 0 评论 -
算法中的一些技巧
1、输入输出优化ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);原创 2021-08-01 22:03:45 · 162 阅读 · 0 评论 -
字符串hash算法
字符串s的哈希定义为原创 2021-04-18 21:11:58 · 1812 阅读 · 0 评论 -
minimax search算法
局面估价函数:给每个局面(state)规定一个估价函数值f,评价它对于己方的有利程度。胜利的局面的估价函数值为,而失败的局面的估价函数为-Max局面:假设这个局面轮到己方走,有多种决策可以选择,其中每种决策都导致一个子局面(sub-state)。由于决策权在我们手中,当然是选择估价函数值f最大的子局面。因此,该局面的决策函数等于子局面f值的最大值,把这样的局面称为max局面。Min局面:假设这个局面轮到对方走,它也有多种决策可以选择,其中每种决策都也会导致一种子局面,但由于决策权在对方手中,在最坏的原创 2020-12-13 13:10:49 · 592 阅读 · 0 评论 -
Floyd cycle算法
问题:对一个链表,判断是否有环。存在环时,求出环的起始位置及环长度使用快慢指针1、判断是否有环,快指针移动两步,慢指针每次移动一步,看快慢指针是否会相遇2、环的起始位置如上图所示,假设快慢指针相遇点为离环起始位置 b,快指针移动距离为a+(b+c)n+b,慢指针移动距离为a+b,则有a+(b+c)*n+b=2(a+b) => a = (n-1)(b+c) + c。为什么慢指针在第一圈时就相遇?因为假设在环起始位置时,环长度为L,快指针在环上位置为b',慢指针经过c'相遇,则有c'原创 2020-10-11 20:11:07 · 179 阅读 · 0 评论 -
Fisher_Yates算法
有两种方式,一种是从头到尾形式,另外一种是从尾到头形式从尾到头形式就是首先在数组中的任何位置选择一个随机元素,然后使用数组中的最后一个元素进行交换。在下一步中,它从数组中除最后一个元素之外的任何位置选择一个随机元素,并将其与倒数第二个元素交换。它一直持续到交换每个元素为止。从头到尾形式是首先在数组中的任何位置选择一个随机元素,然后使用数组中的第一个元素进行交换。在下一步中,它从数组中除第一个元素之外的任何位置选取一个随机元素,将其与第二个元素交换,直到交换每个无素为止。...原创 2020-05-16 20:37:09 · 780 阅读 · 1 评论 -
蓄水池抽样算法
简介蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数。要求选取的概率一样定理:该算法保证每个元素以 k / n 的概率被选入蓄水池数组。证明:首先,对于任意的 i,第 i 个元素进入蓄水池的概率为 k / i;而在蓄水池内每个元素被替换的概率为 1 / k; 因此在第 i 轮第j个元素被替换的概率为 (k / i ) * (1 / k) = 1 / i。 接下来用数学归纳法来证明,当循环结束时每个原创 2020-05-15 23:14:27 · 308 阅读 · 0 评论 -
Stern-Brocot树
Stern-Brocot树是一个维护分数的树,由两个简单的分数开始0/1,1/0,在两邻的两个分数a/b,c/d之间插入新的分数(a+c)/(b+d)其有两个性质,一个是单调性,另外一个是最简性。...原创 2020-05-03 16:25:51 · 749 阅读 · 0 评论 -
LIS
最长上升子序列问题1、动态规划,时间复杂度为O(n^2)用 d(i)表示从0到i时的最长上升子序列的长度,动态转移方程为d(i)=max{d(j)} + 1,其中0<=j<0并且nums[i] > nums[j]。伪代码如下function LIS() ans = 0 d[0]=1 for i in 1 to n ...原创 2020-05-03 10:39:49 · 242 阅读 · 0 评论 -
LCA问题
在一棵有根树中,两个结点u和v的最近公共祖先是指这样的一个结点 w,是u和v的祖先,并且在树T中具有最在深度。tarjan离线算法 ,伪代码如下:LCA(u) MAKE-SET(u) ancestor[FIND-SET(u)] = u for each child v of u in T LCA(v) UNIO...原创 2020-04-28 23:55:28 · 240 阅读 · 0 评论 -
拓扑排序
拓扑排序解决的问题是有向图的节点排序。在有向无环图中,将图中的顶点以线性方式进行排序,使得对于任何的顶点u到v的有向边(u,v),都可以u在v的前面。1、Kahn算法首先将所有入度为0的点组成一个集合S,每次从S里面取出一个顶点u放入L,然后遍历u的所有边(u,v1),(u,v2),...,并删除,并判断该边的另一个顶点,如果在移除这一条边后入度为0,则将这个顶点放入集合S中。不断的重复上...原创 2020-04-24 12:09:50 · 409 阅读 · 0 评论 -
flood fill算法
flood fill算法实现有三种形式1、depth first search2、breadth first search3、breadth first scan基本思想是找到还没有分配component的结点,并且计算哪个componetn包含此结点。深度优先搜索算法是通过当前结点的所有邻接结点查找一步,对于还没有分配component的结点,赋值相应的component,然...翻译 2020-02-13 22:17:18 · 468 阅读 · 0 评论 -
约瑟夫环问题
n 个人标号 。逆时针站一圈,从 号开始,每一次从当前的人逆时针数 个,然后让这个人出局。问最后剩下的人是谁?设J(n,k)表示n,k时约瑟夫环问题的答案。有如下递归式J(n,k)=(J(n-1,k) + k) mod nint josephus(int n, int k){ int res = 0; for (int i = 1; i <= n; ++i)............原创 2019-11-17 15:38:00 · 311 阅读 · 0 评论 -
堆排序算法实现
思路:先将数组以大根堆形式存取,然后每次将首尾元素替换时,将堆长度减1,最后就是从小到大排列代码如下:class Solution{public: void heapSort(int nums[], int n) { for (int i = n / 2; i >= 0; i--) { siftUp(i, nums, n); } int len = n;原创 2017-04-07 22:20:19 · 647 阅读 · 0 评论 -
单链表的反转
有两种方法,一种是非递归,另外一种是非递归非递归算法中,用到三个连续的结点,分别表示p,q,r,其中p.next = q,q.next = r,当然本身链表为空,直接返回null,如果只有一个结点,返回头结点,如果有两个结点,将q.next=p,p.next = null,否则q.next = p,p = q,q = r代码如下:class ListNode{ int val原创 2016-03-08 21:23:35 · 1345 阅读 · 0 评论 -
二叉树遍历的非递归
前序遍历的非递归:1、在入栈时加入结果集,不停的取左子树入栈,直到为空。2、如果栈非空,pop栈顶结点,取其右子树作为当前结点,继续第一步,直到栈为空中序遍历的非递归:1、在入栈时,不停的取左子树入栈,直到为空。2、如果栈非空,pop栈顶结点,加入结点集,取其右子树作为当前结点,继续第一步,直到栈为空后序遍历的非递归:1、在遍历结点时,总是先将右子树结点入栈,再将左子树结点入栈。2、如果左原创 2016-03-01 11:54:04 · 1058 阅读 · 0 评论 -
已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法
二叉树中的前序遍历是先访问根结点,再访问左子树,右子树。中序遍历是先访问左子树,再是根结点,最后是右子树。后序遍历是先访问左子树,再是右子树,最后是根结点。算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了。二叉树的表示形式为//二叉树的结构表示为class Tr原创 2016-01-01 23:40:54 · 2068 阅读 · 0 评论 -
判断数组中的重复元素
问题,有一个n+1个元素的数组,包含1到n的n个数,外加一个重复元素,将这个重复元素找出。方法一:使用置换法,由于下标是从0开始,如果nums[i]==i+1,说明元素是放在正确的位置,继续判断。如果nums[i] == nums[nums[i]-1],说明nums[i]就是重复元素,是要求找到的,否则就转换nums[i]和nums[nums[i]-1]代码如下:class Solut原创 2015-12-20 15:22:33 · 3502 阅读 · 1 评论 -
多数投票算法
在一个数组中,元素个数为n(假设最多投票元素存在),输出元素出现次数大于n/2的数算法思路:1、一个变量cand表示所求的元素,一个变量count统计个数,将count初始化为0. 2、在遍历数组的过程上 (1)如果count=0,则将count=1,cand=array[I];原创 2015-10-08 22:51:33 · 5682 阅读 · 1 评论 -
最大子数组乘积算法
给出一数组a,求最大子数组乘积算法思路:用动态垃规划.用maxValue(n)表示从0到n的最大子数组乘积,minValue(n)表示从0到n的最小子数组乘积。状态转移方程为:minValue(n)= min{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]}maxValue(n)=max{minValue(n-1)*a[n], maxVal原创 2015-09-05 11:59:36 · 2005 阅读 · 0 评论 -
最大子段和
给出一个数组,求其最大子数组和(要求最少取一个元素)主要是用动态规划法,用dp(n)表示从0到n之间的最大子数组和。其状态转移方程为dp(n)=dp(n-1)代码如下:class Solution {public: int maxSubArray(vector& nums) { int res = numeric_limits::min(); int sum = 0;原创 2015-09-04 11:07:43 · 1231 阅读 · 0 评论 -
字典序排列的算法
已知数组长度为n,序列表示为,求其下一个字典序排列。算法思路:从尾开始,找到,然后从尾到i找到,然后与替换,并且将到之间的数反转代码如下class Solution{public: bool nextPermutation(vector& nums) { int len = nums.size(); if (len <= 1) return false; int原创 2015-08-03 23:00:25 · 748 阅读 · 0 评论