Data_Structure
文章平均质量分 88
Miserable_ccf
Stay hungry ,stay foolish
展开
-
『笔记备忘』串的模式匹配算法——KMP算法
『写在前面』今天又是连着上一下午的数据结构,ORZ。讲了Knuth,Morris,Pratt三位大牛写的惊天算法。但是听的糊里糊涂,所以今天来整理一下。『KMP算法原理』KMP算法其实是对经典BF算法的一种优化,利用了之前比较过的“已知信息”,跳过了重复的比较,加快了算法效率。先看BF算法BF算法是一种暴力求解的方式,是拿子串从头挨个和主串比较 ,当串匹配成功就跳出循环...原创 2018-09-29 22:01:40 · 277 阅读 · 1 评论 -
『单调栈』2019牛客暑期多校训练营(第二场)Second Large Rectangle
https://ac.nowcoder.com/acm/contest/882/H题意: 给一个只有‘0’和‘1’的矩形,找到次大的全是‘1’的矩形,两个矩阵只要存在一个‘1’是属于A矩形而不属于B矩形 那么A和B就是不同的矩形思路: 先使用单调栈求出最大子矩形,然后将这个最大子矩形的高hh,左边距离最近的点位置ll,右边距离最近的点位置rr,所在行ii记录下来,然后遍历一遍全图找到忽略已找到...原创 2019-07-26 15:00:08 · 103 阅读 · 0 评论 -
笛卡尔树快乐分析+模板整理
笛卡尔树:同时满足两个性质,从key(key就是索引位置,如下图中9的key为1,3的key为2…)来看,满足二叉搜索树的特性,从value来看,满足堆的性质。①堆的性质,如下图(维基百科),小根堆,两子的值大于等于父亲的值②二叉搜索树性质,即左子树的点key(默认为下标)比根小,右子树的点key(默认为下标)比根大显然,按中序遍历这棵树,可得原序列③询问下标i到下标j之间(i<...原创 2019-07-30 19:16:09 · 166 阅读 · 0 评论 -
信息学竞赛中离散化算法
离散化(Discretization ),把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。...原创 2019-07-31 00:03:23 · 396 阅读 · 0 评论 -
2019牛客暑期多校训练营(第一场)A.Equivalent Prefixes
A.Equivalent Prefixeshttps://ac.nowcoder.com/acm/contest/881/A题意:两个长度为n的数组A和B,求最大的m,使得1到m之内的所有区间的最小值位置相同。思路:因为使用了单调栈,所以明确一下单调栈作用是什么。单调栈:记录每个值的左边第一个比当前值小的位置。单调栈的一大优势就是线性的时间复杂度,所有的元素只会进栈一次...原创 2019-07-20 10:46:05 · 117 阅读 · 0 评论 -
『RMQ』解决RMQ问题的方法(二)—— ST(Sparse Table)算法
Sparse(稀疏) Table算法普遍简称ST表,复杂度为O(nlogn),以O(nlogn)的预处理代价,换取O(1)的查询时性能,在查询次数较多的时候,比线段树有明显的优势。这种算法运用的主要思想是倍增思想。倍增思想的核心就是,通过递推使得结论成倍地提高。ST的建立过程中使用了动态规划的思想:(以求最大值为例)状态: f[i][j] 代表从i开始连续第2 ^ j个数的最大值 即 区...原创 2019-07-28 23:44:27 · 146 阅读 · 0 评论 -
最长公共子串问题——矩阵法求解
最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。『算法思路』1、把两个字符串分别以行和列组成一个二维矩阵。2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。3、通过查找出值为1的最长对角线...原创 2019-03-03 21:07:46 · 1382 阅读 · 1 评论 -
解决最长回文子串问题——Manacher算法
问题描述:输入一个字符串,求出其中最大的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着遍历和倒着遍历得到的序列相同,如madam,lol,oppo,zz。计算字符串的最长回文字串最简单的算法就是枚举该字符串的每一个子串,并且判断这个子串是否为回文串,这个算法的时间复杂度为O(n^3)的,而稍微优化的一个算法是枚举回文串的中点,这里要分为两种情况,一种是回文串长...原创 2019-03-03 19:53:04 · 1075 阅读 · 0 评论 -
快速排序的一次再回顾
『快速排序的描述』快排主要是采用了分而治之的思想。分解:数组A[]被划分两个(可能为空)子数组A[]和A[],使得A[]中的每一个元素都小于等于A[ ],而A[ ]也小于等于A[]中的每个元素。其中,计算下标q也是划分过程的一部分。解决:通过递归调用快速排序,对子数组A[]和A[]进行排序。合并:因为子数组都是原址排序的,所以不需要合并操作:数组A[ ...原创 2019-03-01 16:05:17 · 175 阅读 · 0 评论 -
POJ 1376 Robot——C++的BFS解法
题目传送门:http://poj.org/problem?id=1376洛谷翻译传送门:https://www.luogu.org/problemnew/show/P1126注:POJ是多组输入,洛谷是单组输入。『解题思路』采用BFS策略求从起点到终点的最短路,题目有点坑,输入的是方格坐标,但机器人移动的是点,应该注意。因为还有方向问题,故而首先将方向转化为数字变量,便于计算旋转的...翻译 2019-01-29 15:24:37 · 177 阅读 · 0 评论 -
『数据结构实训』俄罗斯套娃问题 ——DFS
『问题描述』 伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉。首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这片草原,南北向和东西向的道路纵横交错。现在,路口放着纯金打造的俄罗斯套娃,重量大小不等,重的都能装下轻的。你可以沿着道路飞奔,拾取路口的套娃,要求是任何时刻必须是一个套娃,装好后就不能再拆开了。注意不要走重复路。” 请你为伊...原创 2019-01-07 17:47:08 · 1879 阅读 · 0 评论 -
回顾归并排序来看分治思想
归并排序的主要操作:分解待排序的n个元素的序列成各具n/2个元素的子序列; 使用归并排序递归地排序成两个子序列; 合并两个已排好序的子序列产生的已排好序的答案。这完全符合分治模式在每层递归的三个步骤:分解原问题为若干子问题,这些子问题是原问题的规模较小的实例; 解决这些子问题,递归的求解各子问题。子问题若规模足够小,则直接求解; 合并这些子问题的解成原问题的解。下面使用归并排序...原创 2019-03-01 19:55:25 · 214 阅读 · 0 评论 -
求n以内的的素数——埃氏筛法和欧拉筛法
求N以内的素数,朴素算法对于10^7之类的大数无疑是要超时的。时间复杂度为O(N^2)和O(N)所以就需要一个效率更加高的方法来进行素数筛选。1.Eratosthenes筛法(埃氏筛法)时间复杂度:O(n*lglgn)( 约等于 O(n*1.5) )筛法的思想:对于不超过N的每个非负整数p,删除2p,3p,4p,...,但处理完所有数之后,还没有被删除的就是素数。可用标志数组bk...原创 2018-11-24 18:31:13 · 827 阅读 · 0 评论 -
『最小生成树』Prim算法——加点法(优先队列/堆优化 + C++实现 + 例题)
『算法原理』 在一个连通网的所有生成树中,各边的代价之和最小的那颗生成树称为该连通网的最小代价生成树(Minimum Cost Spanning Tree),简称最小生成树(MST)。 Prim算法之所以叫加点法,就是因为其本质是一个点一个点地加入到最小生成树中。算法步骤如下:设有一无向连通图G,有n个顶点。a.初始化——任意找图中的一点作为源点,...原创 2018-11-06 13:00:00 · 3783 阅读 · 0 评论 -
『最小生成树』Kruskal算法——加边法 (并查集优化 + C++语言编写 + 例题)
『算法原理』 在一个连通网的所有生成树中,各边的代价之和最小的那颗生成树称为该连通网的最小代价生成树(Minimum Cost Spanning Tree),简称最小生成树(MST)。 Kruskal算法之所以叫加边法,就是因为其本质是一个边一个边地加入到最小生成树中。算法步骤如下:设有一无向连通图G,有n个顶点。a.将所有边的权值从小到大排列。...原创 2018-10-31 17:48:02 · 6130 阅读 · 1 评论 -
树状数组的快乐分析+模板整理
树状数组 (Binary Indexed Tree(B.I.T)),重点是在树状的数组,是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值。能用树状数组解决的问题,基本上都能用线段树解决,而线段树能解决的树状数组不一定能解决。相比较而言,树状数组效率要高很多。树状数组的常见操作给定一个数列:a1,a2,...,an...转载 2019-07-31 22:23:29 · 108 阅读 · 0 评论