[算法学习]
对做题遇到的不熟悉,没见过的算法或者数据结构进行整理总结
cykap
这个作者很懒,什么都没留下…
展开
-
[算法学习no17]拓扑排序
拓扑排序就是给你一个有向图让你按照点的优先级来输出点的一种排序算法到底什么是点的优先级呢?比如说,在这个图中,a结点指向b结点,那我们就可以说a的优先级比b高。所以我问问你,优先级最高的结点有什么特点?当然,就是没人指向它,即入度为0的点那我再问问你,优先级第二高的结点有什么特点?哈哈,不是优先级最高结点指向的结点就是第二高结点哦优先级第二高的结点,就是在你把优先级第一高的结点移走之后(同时把他们的边也移走)剩下这张图中的最高级结点,也就是移走一级节点之后入度就变成0的那些结点同理,我原创 2021-04-04 19:26:40 · 79 阅读 · 0 评论 -
[算法学习no16]离散化处理
什么叫离散化?比如给你一个数组下标 1 2 3数值 1 5000 2需要你进行一系列大小比较有关的操作,那么他们的实际大小就不重要了比如让你求出数组中比1大的元素个数,你知道有两个那我把5000换成 3,是不是还有2个?这个数组中5000就是最大的,如果我的操作不涉及求值,只用比较大小,就像我刚才说的,求出一个数组中比1大的元素个数那这个5000换成3 ,换成4 或者把下标为3的那个2换成3,换成4,都是不会改变的。而有的操作需要靠数值大小来确定地址,如果你的数原创 2021-04-03 17:37:27 · 256 阅读 · 1 评论 -
[算法学习no15]归并排序
归并排序就是递归+合并利用分治法把数组分成最小单元,保证每次合并都是在合并两个有序数组有序数组的合并非常高效而不断分治就是为了把数组分成单个元素,一个元素排成两个有序数组,两个有序数组排成四个有序数组等等合并有序数组的思路设置一个函数传入当前数组的前下标,和最后下标,然后利用一个空数组储存a分开之后合并的数组总结来说,归并排序就是一个递归函数只要first<last就一直保持递归,左右分支,当递归完成时,进行下面的操作,将有序数组合并即可。第一次实验失败,看看自己的归并排序到底哪原创 2021-04-03 16:02:23 · 68 阅读 · 0 评论 -
[算法学习no14]进制哈希BKDR Hash
进制哈希,就是让长度为n的字符进行下列运算:for(int i=1;i<=n;i++){ans=(ans*k)+a[i];}当然这是初始版如果溢出,那么计算机会自动舍弃高位的值,留下低进制位的数字让我们现在考虑该如何选取k如果是偶数,那么最终会因为溢出而导致高位运算无法参与而如果是奇数,那么即使溢出,高位字符也会因为奇数不是2的整数倍,会留下1,从而在低位产生影响所以1.k为奇数下面我们在看看k应该选取怎么样的奇数为了自动取位,我们应该选择数据为unsigned型,如果不是这原创 2021-04-03 12:14:01 · 335 阅读 · 0 评论 -
[算法学习no13]prim算法
普利姆算法数据结构:1.pick数组,代表是否被选中2.mindis数组,下标就是点的编号,数值为当前已选点的集合中的所有点到这个点的距离的最小值3.father数组,下标也是点的编号,如果该点没有选定,则为-1,否则为更新mindis时对应路径和其相连的点的编号步骤:1.接入一个顶点2.遍历和这个顶点相连的所有边,拿出相连的顶点,(如果该顶点没有被选中)到mindis里面进行比较如果小于,则更新相应的mindis和father,并且和当前最小值min进行比较,如果还是小于,那么记录当前点的原创 2021-04-02 19:00:54 · 161 阅读 · 0 评论 -
[算法学习no12]kruskal算法
1.读取边2.对边排序3.遍历,判断当前两个点连起来之后是否成环(利用查并集)if(find(x)==find(y))4.如果成环跳过看下一位不成环那么就把这两位连起来f[find(x)]=find(y);更新dis值原创 2021-04-01 21:27:45 · 81 阅读 · 0 评论 -
[算法学习no11]插入排序与希尔排序
所谓希尔排序就是在插入排序外面多了一层循环并且改变了内部插入排序的间隔而已多的那层循环for(int gap=arr.length;gap>=1;gap=gap/2)把内部插入排序的间隔改成gap即可现在学习插入排序两个移动下标一个在已排序数组中a,且初始化为已排序数组中最后一个元素(即最大元素)一个指向未排序部分的第一个元素b按照从小到大排序如果b元素大于a指向元素,那么a元素前拨就好了a元素前拨方式就是arr[a+1]=arr[a],a–;直到arr[b]>=arr原创 2021-04-01 21:24:53 · 82 阅读 · 0 评论 -
[算法学习no10]Floyd算法以及其正确性证明
具体原理就是把图里面所有点拿出一个遍历所有路径看看能不能把这个点加入到这个路径里面也就是进行判断:dis[i,j]>dis[i,k]+dis[k,j]如果满足就要更新dis[i,j]的值完毕非常简单易于上手现在思考其正确性:如果一条路4->3->1->2->5->6为4->6的最优解.从这个图中我们可以看到,一定可以直接连通的点就是4,33,11,22,55,6Floyd算法是在把这些路都找出来,然后拼接成成品的一个过程我们已原创 2021-04-01 15:02:01 · 1092 阅读 · 0 评论 -
[算法学习no9]SPFA
说白了就是bfs只不过,对于bfs,访问过的点不可以再访问而spfa改成了,只要你不在队列里面,就可以让你再次入队缺点:不是很稳定所以:如果被卡数据就要用dij算法(不知道全名,还没有学习)暂时写到这里...原创 2021-03-31 20:51:33 · 60 阅读 · 0 评论 -
[算法学习no8]dfs优化-记忆化搜索
根本思路:就是函数思想原创 2021-03-31 18:31:44 · 297 阅读 · 0 评论 -
[算法学习no7]图的遍历
图的遍历分为两种1.深度优先搜索2.广度优先搜索图的遍历难度在于图有闭环,双向所以一定不要迷路因此,需要用数组标记访问过的结点即可1.深度优先搜索传入参数为结点输出这个结点标记这个结点找到和这个结点相连的所有点判断这些点是否被访问过如果没被访问过直接递归2.广度优先搜索使用队列让传入的结点入队打印结点标记结点进入循环,终止条件为队列为空遍历和队首结点相连的所有结点如果结点未被访问那么打印结点标记结点让结点入队首元素出队二者的重要形式:深度优先搜索是递归。原创 2021-03-30 22:16:06 · 83 阅读 · 0 评论 -
[算法学习no6]二叉树序列
先序:根左右中序:左根右后序:左右根中序+后序:前序思路:递归分治1.后序最后找到根节点2.打印根节点3.中序找到根节点,左右分开,分别为左子树和右子树4.在后序中找到左子树,打印这个序列的最后一个点(也就是左子树根节点)5.继续在中序中找到左子树的根节点,把左子树再分成左右两个子树6.这样递归下去就可以了。中序+前序:后序1.前序找到根节点2.中序中找到根节点,分成左右子树2.递归左子树2.1在前序中找到根节点2.2中序中找到根节点,分成左右树2.3递归左子树2.4递归原创 2021-03-28 10:46:13 · 475 阅读 · 0 评论 -
[算法学习no5]kmp
朴素算法:子字符串和母字符串比较,子字符串和母字符串上分别有个指针,不同则把子字符串的指针拨回头部重新比较kmp:在不同的时候,把子字符串的指针回拨一定的长度(这个长度由一个next数组进行记录),然后从回拨位置进行比较求解next数组:本质即为利用next数组本身进行求解,有两个指针,一个指向前缀,一个指向后缀,前缀相当于字串,后缀相当于母串,若不等,则把子串指针回拨到一定位置,回拨位置由next数组确定。相当于一个递推,从基础的next[0]=-1和next[1]=0,开始,把next数组的剩原创 2021-03-28 09:59:01 · 88 阅读 · 0 评论 -
[算法学习no4]递归
1.堆栈到递归的转化堆栈常常用来解决具有优先级问题的表达式,特别是有括号的这种而递归也可以很完美地解决优先级问题以括号为例栈:如果遇到左括号,那么入栈,遇到右括号则一直弹出,直到遇到左括号为止递归:遇到左括号,直接递归(后递归先运行结束)所以创造了一个优先环境,继续计算,直到遇到右括号,return现在的值即可。堆栈和递归有异曲同工之妙啊!...原创 2021-03-27 16:05:48 · 75 阅读 · 0 评论 -
[算法学习no2]单调队列
作用:用来求解一段范围内的最值问题其实就是一个漏了的单调栈罢了。具体思路:以最小值为例1.若队空:入队2.不空当前元素小于等于队尾元素队尾元素从尾部出队直到当前元素大于队尾元素如果出完了,也就是变成空队列了,那么直接入队,更改最小值即可。入队3.如果当前队首元素超出范围队首元素从头部出队只用出一次就行,因为每次都只移动一格,更新最小值。求最大值也是一样。不做详解...原创 2021-03-26 21:31:06 · 48 阅读 · 0 评论 -
[算法学习no1]单调栈
单调栈:单调递减栈:上面的人最小,重力栈,重的往下沉原理:1.遍历数组2.栈空:入栈3.当前元素大于栈顶元素,栈顶元素出队,栈顶下标减一,当前元素继续和栈顶元素比较4.当前元素小于栈顶元素,直接入队,栈顶下标加一用途:为数组中的每一个元素找到其右边第一个大于它的数字或者倒着遍历,可以为其找到其左边第一个大于它的数字单调递增栈,反重力栈,重的上浮原理:1.遍历数组2.栈空:入栈3.当前元素小于栈顶元素,栈顶元素出栈,栈长减一,继续和栈顶元素比较4.当前元素大于栈顶元素,入栈用途原创 2021-03-23 21:36:47 · 65 阅读 · 0 评论