Data Structures and Algorithms
文章平均质量分 75
coordinate_blog
这个作者很懒,什么都没留下…
展开
-
RMQ问题(超详细!!!)
0x01 介绍**RMQ (Range Minimum/Maximum Query)**问题是指:对于长度为nnn的数列AAA,回答若干询问RMQ(A,i,j)(i,j<=n)RMQ(A,i,j)(i,j<=n)RMQ(A,i,j)(i,j<=n),返回数列AAA中下标在i,ji,ji,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。0x02 朴素算法最简单...原创 2020-02-14 16:33:45 · 4232 阅读 · 0 评论 -
笛卡尔树(超详细!!!)
0x01 介绍笛卡尔树是一种特定的二叉树,可由数列数列构造,在范围最值查询、范围top k查询(range top k queries)等问题上有广泛应用。它具有堆的有序性,中序遍历可以输出原数列。笛卡尔树结构由Vuillmin(1980)在解决范围搜索的几何数据结构问题时提出。从数列中构造一棵笛卡尔树可以线性时间完成,需要采用基于栈的算法来找到在该数列中的所有最近小数。笛卡尔树每一个结点由一...原创 2020-02-13 20:43:51 · 12267 阅读 · 1 评论 -
最短路问题
0x01 单源最短路径单源最短路径:给定一个图G=(V,E)G=(V,E)G=(V,E),我们希望找到从给定源节点s∈Vs\in Vs∈V到每个节点v∈Vv\in Vv∈V的最短路径。注意:这篇文章的主要作用是代码模板记录,算法不做证明,证明过程参看算法导论!!!0x0101 Bellman-Ford算法Bellman-Ford算法的思路非常简单,我们观察下面的图: 我们此时...原创 2020-01-30 14:59:42 · 630 阅读 · 0 评论 -
KMP算法(超详细!!!)
0x01 介绍KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。0x02...原创 2020-01-15 16:05:22 · 3890 阅读 · 0 评论 -
图着色问题(超详细!!!)
0x00 图着色问题图着色问题(Graph Coloring Problem, GCP)又称着色问题,是最著名的NP-完全问题之一。图的m可着色判定问题给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。图的m可着色优化问题若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数...原创 2019-10-15 11:24:20 · 38349 阅读 · 2 评论 -
最大流问题(超详细!!!)
0x00 最大流最大流量问题涉及通过最大单源单汇流网络找到可行流量。如图所示。 每个边缘都标有容量,即可以携带的最大物品数量。 最大流问题是找出可以从顶点source到顶点sink总的物品数量(最大的那个)。 如上图所示,当0->1和2->1汇聚的时候不能超出1->3的值12(1的输出最大为12)。最后可以到达5的最大物品个数就是19+4=23。也就...原创 2019-10-12 09:12:00 · 25372 阅读 · 2 评论 -
二分图(超详细!!!)
0x00 二分图二分图是一个图,它的顶点可以分为两个独立的集合u和v,这样每一条边(u,v)要么从u到v连接一个顶点,要么从v到u连接一个顶点。换句话说,对于每一条边(u,v),要么u属于u,要么v属于v,或者u属于v,v属于u,也可以说没有边连接同一集合的不同点。 0x01 二分图的判定可以通过染色法判定二分图。如果可以通过两种颜色将图染色,使得相同集合中的顶点使用相同的颜色,...原创 2019-10-12 11:04:11 · 14741 阅读 · 2 评论 -
最小生成树(超详细!!!)
假设给定图中有N个顶点,那个最小生成树有N-1条边,算法的主要步骤按每条边权重的大小从小到大对所有边进行排序。选择权重最小的边。 检查它和当前的生成树是否构成环? 如果没有构成环,则包括此边。 否则,丢弃它。重复步骤#2,直到生成树中有(N-1)条边。我们可以通过并查集来检查是不是有环。举个例子,如下图 这个图中,我们有9个点和14条边,那么最小生成树有8条边。首先将所...翻译 2019-07-28 17:17:47 · 8267 阅读 · 2 评论 -
关于时间复杂度的几个典型证明
0x01 证明O(f)+O(g)=O(f+g)O(f)+O(g)=O(f+g)O(f)+O(g) = O(f+g)令F(n)=O(f)F(n)=O(f)F(n)=O(f),则存在自然数n1n1n_1、正数c1c1c_1,使得任意自然数n≥n1n≥n1n\geq n_1,有:F(n)≤c1f(n)F(n)≤c1f(n)F(n)\leq c_1f(n)同理,令G(n)=O(g)G(n)...原创 2018-03-02 16:55:13 · 12839 阅读 · 2 评论 -
摩尔投票算法
Boyer-Moore majority vote algorithm(摩尔投票算法)是一种线性时间复杂度和常数级空间复杂度的算法,永安里查找元素序列中的众数。它是Robert S. Boyer和J Strother Moore命名,是一种典型的流算法。该算法的最简单的形式,查找最多出现的元素,也就是找到一个输入中出现一半以上的重复元素。但是,如果该数不存在的话,算法将检测不到真实结果,但是仍将...原创 2019-03-19 08:57:35 · 2862 阅读 · 0 评论 -
寻找特定数字问题
0x00 问题描述给定一个整数数组,除了一个元素出现ppp次(p&amp;amp;amp;gt;=1p&amp;amp;amp;gt; = 1p&amp;amp;gt;=1,p%k!=0p%k!= 0p%k!=0),其余每个元素出现kkk(k&amp;amp;amp;gt;1k&amp;amp;amp;gt;1k&amp;amp;gt;1)次,找到那个特殊的元素。0x01 含有1bit数字的特殊情况假翻译 2018-11-10 10:03:01 · 1519 阅读 · 2 评论 -
Manacher’s Algorithm超详细!!!
0x00 问题描述给定一个字符串,找到最长的回文子串。如果给定的字符串是“forgeeksskeegfor”,则输出应为“geeksskeeg”如果给定的字符串是“abaaba”,则输出应为“abaaba”如果给定的字符串是“abababa”,则输出应为“abababa”如果给定的字符串是“abcbabcbabcba”,则输出应为“abcbabcba”0x01 常见解法寻找回文的...翻译 2018-11-13 08:56:15 · 7205 阅读 · 4 评论 -
k 数和问题
在之前的几篇文章中Leetcode 1:两数之和(最详细解决方案!!!)Leetcode 167:两数之和 II - 输入有序数组(最详细解决方案!!!)Leetcode 15:三数之和(最详细解决方案!!!)那么这些问题是不是有一些内在的联系呢?k-SUM can be solved more quickly as follows.For even k: Compute a sorted...原创 2018-10-12 10:24:45 · 1711 阅读 · 0 评论 -
Hamiltonian Cycle(哈密顿回路)
对于无向图来说,哈密顿路径对于图每个顶点只访问一次。 哈密顿回路(或哈密顿循环)是一个哈密顿路径,并且从哈密顿路径的最后一个顶点到第一个顶点存在边缘(也就是可以回到初始位置)。 确定给定图是否包含哈密顿循环。 如果包含,则打印路径。 以下是所需功能的输入和输出。输入:2D阵列graph[V][V](其中V是图中的顶点数,通过邻接矩阵表示)。如果从i到j存在一条边,则graph[i][j]为1,否...翻译 2018-11-22 17:25:59 · 13384 阅读 · 0 评论 -
判断四个点是否可以构成矩形(优雅的解法!!!)
首先我们需要先检查输入的四个点是不是有重复。然后判断四个角是不是直角即可。def isOrthogonal(p1, p2, p3): return (p2[0] - p1[0]) * (p2[0] - p3[0]) + (p2[1] - p1[1]) * (p2[1] - p3[1]) == 0def _isRectangle(p1, p2, p3, p4): return ...原创 2018-12-24 15:27:53 · 12901 阅读 · 3 评论 -
Leetcode 单调栈问题总结(超详细!!!)
0x00单调栈主要回答这样的几种问题比当前元素更大的下一个元素比当前元素更大的前一个元素比当前元素更小的下一个元素比当前元素更小的前一个元素0x01 问题一维护一个单调递减的栈。 Leetcode 496:下一个更大元素 I(超详细的解法!!!)Leetcode 503:下一个更大元素 II(超详细的解法!!!)Leetcode 739:每日温度(超详细的解法!!!)cl...原创 2019-01-17 10:43:45 · 29379 阅读 · 4 评论 -
Leetcode 二分法问题总结(超详细!!!)
0x00 循环不变式初始化:它在循环的第一轮迭代开始之前,应该是正确的。保持:如果在某一次循环迭代开始之前是正确的,那么在下一次迭代开始之前,它也应该保持正确(假设当循环变量等于k时符合,再看执行一遍循环体后是否还符合循环不变式)。终止:循环能够终止,并且可以得到期望的结果。(这一步是和数学归纳法不同的一点,用循环不变式则更进一步,数学归纳法到这里就得出了一个关系式就结束,而用循环不变式,不...原创 2019-01-20 09:48:49 · 4528 阅读 · 0 评论 -
拓扑排序(超详细!!!)
对于一个有向无环图来说拓扑排序的结果遵循如下规则,即如果有一条从顶点viv_ivi指向顶点vjv_jvj的边,那么最后的排序结果中viv_ivi一定在vjv_jvj的前面。例如 这个图的拓扑排序就是1 2 3 4 5。同一个图可以有多个拓扑排序结果,对于上面那个图,还有一种排序结果就是1 2 3 5 4。为了可以进行拓扑排序,给定的图中不可以有环。我们可以简单论证一下,假...原创 2019-07-28 08:50:03 · 6085 阅读 · 1 评论 -
Hash表的理论基础与具体实现(详细教程)
字典通常可以用三种数据类型表示:线性表,跳表,Hash表。Hash表又称为散列表,使用一个散列函数把字典的数对映射到一个散列表的具体位置。如果数对p的关键字是k,散列函数为f,那么在理想情况下,p在散列表中的位置为f(k)。暂时假定散列表的每一个位置最多能够存储一个记录。为了搜索关键字为k的数对,先要计算f(k),然后查看在散列表的f(k)处是否已有一个数对。如果有,便找到该数对。如果没有,字...原创 2018-05-13 20:08:52 · 2101 阅读 · 0 评论