算法
幻世至上
while(life==true)Learning;
Leanring?happiness:sadness;
展开
-
【模板算法】单源最短路问题-dijkstra算法(邻接表+优先队列优化)
dijkstra算法适用范围:求一个点到另一个点或其他点的最短路问题,当然,最大路也可以,重载一下<号即可。我写的这次模板是双条件的,即除了路径长度限制还有当路径长度相同后data小的优先输出,并且还有返回路径的函数,所以普适度更高,如果做得题目不需要双条件,删除data相关内容即可。在该篇文章最后会有源代码及两组测试数据供大家测试。edge结构体定义struct edge{ ...原创 2018-03-17 13:05:49 · 1008 阅读 · 0 评论 -
【轮盘赌】给定比例随机生成样本份数
最近在忙期末的任务,毛概需要写一份调查报告。所以突然想起轮盘赌法可以根据预设的比例随机生成样本的份数,所以就写了个小程序试试,当然只是实验,数据还是要自己收集的才真实啊。#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string&...原创 2018-06-10 21:10:23 · 597 阅读 · 0 评论 -
【第九届蓝桥杯A组国赛】E题题解
前言:这道题当时看的时候看错了,或者说看得太快,推了一下发现1是1个,2是4个,3就理所当然的认为是9个,然后飞速写完,检查都没检查出来,我也是服了自己。。。说实话确实很伤心,这道题就算是小白,写个暴力,50多分到手,我居然1分都没拿到,优秀奖滚粗也是理所应当的吧。题目描述:给一个数列,每一个元素都在G[N]数列中出现G[N]次。i: 1 2 3 4 5 6 7 8 9 ...原创 2018-05-27 19:31:21 · 647 阅读 · 0 评论 -
【算法】从后向前的字符串匹配算法——BMH算法+sunday算法
前言KMP算法将从前向后的字符串匹配的效率发挥到了极致,所以想要进一步提升,只能打破思维定式,找到一条与众不同的路。所以从后往前的字符串匹配算法就应运而生。它可以更为高效的快速移动字符串,但是在最坏情况下会退化为朴素的BF算法。BMH算法介绍BMH算法是由BM算法改进的算法,BM算法的方法为预先定义好“坏字符偏移函数”和“好后缀偏移函数”,当字符串与模式不匹配时,就通过这两个函数计算出...原创 2018-05-15 21:18:44 · 2059 阅读 · 0 评论 -
【Prim迷宫算法】随机迷宫生成
最近在学Android开发,老师让我们自己做个应用,我就想做个简单的Roguelike RPG小游戏。由于要用到迷宫,所以在网上学习了一下Prim迷宫算法,先用C++手撸了一个简单的模板。Prim算法描述 随机选择一个白色格子[i,j] (实际位置为i*2+1,j*2+1)作为当前正在访问的格子,同时把该格子放入一个已经访问的列表中。 循环以下操作,直到所有的格子都被访问到: 1...原创 2018-05-21 17:24:18 · 11805 阅读 · 4 评论 -
【模板算法】LCA最近公共祖先问题——二分搜索
算法描述:通过预处理parent数组,实现对两个节点公共祖先的二分搜索。主要目的是降低多次搜素的综合复杂度,预处理数组的复杂度为O(nlogn),单词处理的复杂度为O(logn)。算法实现原理:对于任意顶点v,利用其父亲节点信息,可以通过parent[k+1][v]=parent[k][parent[k][v]]得到其每向上走2^k步所到的顶点parent[k][v]。有了k=fl...原创 2018-05-12 17:38:21 · 275 阅读 · 0 评论 -
【算法】轮盘赌法
算法描述今天在看遗传算法时看到的一种选择随机算子的算法。通过产生大量随机数往一个固定轮盘里扔来实现概率选择。算法实现原理首先每次运行时调用随机函数rand()/RAND_MAX,生成一个0-1之间的随机数temp; 再判断该随机数究竟落到了哪一块区域: 1.i=1时,如果temp<=sum (P[0]),则返回i,否则i++ 2.i=k时,如果temp<=sum(...原创 2018-05-03 16:52:45 · 8153 阅读 · 0 评论 -
【算法】强连通分量分解——Kosaraju算法
算法描述:在有向图中,我们可能会想知道是否存在一个环,这个环上的任意一个顶点都可以访问同一个环上的其他顶点,这个环上的顶点所组成的集合就叫做一个强连通分量。而将有向图分解成若干个不想交的强连通分量,则叫做强连通分量分解。算法原理:1.将有向图存储为G[V]和其反向图rG[V]。void add_edge(int from,int to){ G[from].push_...原创 2018-05-09 16:54:21 · 815 阅读 · 0 评论 -
【模板算法】字符串匹配问题——MP算法+KMP算法
MP算法介绍:字符串匹配中,如果我们选择最朴素的BF算法,即每次匹配失败就返回到该次刚开始匹配的位置,时间复杂度为O(M*N),M,N分别为匹配字符串p和被匹配字符串s的长度。这个复杂度在M和N长度都很大时是极其不方便的,所以,我们需要想办法利用现有的资料去减少匹配次数。如果我们在p[i]处匹配失败了,可以知道的是前0-i-1是匹配成功的,那么我们可以根据这个将P向后滑动,而不是将P移到最前面...原创 2018-04-11 21:20:34 · 1506 阅读 · 0 评论 -
【算法】尺取法——快速求解取连续子序列问题
算法描述这个算法通过反复推进开头和结尾,可以在O(n)的线性时间内解决连续子序列问题。算法模拟比如当前pre=i,pro=j,temp=a[i]+a[j]。 1.如果temp-a[i] > M,则推进pre,pre++,temp-=a[i] 重复1直到temp-a[i] < M 2.如果temp-a[i] < M,则 i—j 为以j为终点最靠近M的值 ...原创 2018-04-15 21:53:02 · 468 阅读 · 0 评论 -
【模板算法】快速幂的实现
算法介绍假设我们要求的数为a^b,那么我们可以先得到a^(b/2),而a^(b/2)又可以通过a^(b/4)得到,从而在O(logn)时间内完成运算。 非递归的方法为:假设为2^23,将23转化为2进制(10111),即为2^16 * 2^4 * 2^2 * 2,从而得出每当b&1的结果为1时就把当前的倍数赋值给ans,每次循环a都翻倍。 注意:如果进行模除,则a(翻倍后)和ans...原创 2018-04-14 15:59:40 · 161 阅读 · 0 评论 -
【算法】最大流问题——Ford-Fulkerson算法+Dinic算法
Ford-Fulkerson算法描述:最大流问题可以看做是无向图搜索,找到一条可以使结果增加的边。不过只有当有流量出去,对应的向回推的流才有容量,二者相加等于该边总容量。不断搜索直到没有可以增加的边,则返回最大值。Ford-Fulkerson算法的复杂度为O(FE)。添加对应边struct Stream{//保存终点,流量,反向边编号 int to,cap,revNum;...原创 2018-03-31 15:31:06 · 2064 阅读 · 0 评论 -
【算法】凸包问题——卷包裹算法
算法介绍:凸包问题的朴素实现,我比较喜欢的解释就是拿一根橡皮筋,地图上的点就是一个个钉子,用橡皮筋从一个位置开始,绕着钉子转一圈,所得到的就是最终结果凸包。算法流程:1.对点进行排列,可以按照x轴最小或者y轴最小来排序,如果有多个最小点则按照y轴最小/x轴最小来选取点,不考虑重复点。2.选定初始点之后,选择第一个判断点(第一次不是初始点,后面都设为初始点),再遍历所有节点作为候选点(跳过...原创 2019-09-02 10:34:15 · 789 阅读 · 0 评论