数据结构与算法
文章平均质量分 71
Rebright-崇明
神说要有光,于是便有了我
展开
-
洛谷 P3367 ---- 【模板】并查集
题目描述给出一个并查集,请完成合并和查询操作。输入格式:第一行包含两个整数N、M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数Zi、Xi、Yi当Zi=1时,将Xi与Yi所在的集合合并当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N输出格式:如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N输入样例4 72 1 2...原创 2019-05-05 19:04:01 · 1072 阅读 · 0 评论 -
贪婪算法在求解最小生成树中的应用(JAVA)--Kruskal算法
Kruskal算法又被称为“加边法”,这种算法会将加权连通图的最小生成树看成具有V-1条边的无环子图,且边的权重和最小。算法开始时,会按照权重的非递减顺序对图中的边排序,之后迭代的以贪婪的方式添加边。下面以下图为例来讲解Kruskal算法的过程:Input:6 101 2 31 5 61 6 52 6 52 3 13 6 43 4 64 6 54 5 85 6 2Output:15完整代码如下:i...原创 2018-02-09 14:43:18 · 786 阅读 · 0 评论 -
贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法
贪婪算法:通过一系列步骤来构造问题的解,每一步对目前构造的部分分解做一个拓展,直到获得问题的完整解为止,而算法的核心思想就在于,算法的每一步都必须满足以下条件:可行(满足问题的约束条件)、局部最优(当前步骤所有可行选择中的局部最优解)、不可取消(一旦选择,在后续步骤中不可改变)。对于连通图来说生成树定义为包含图中所有顶点的连通无环子图而在加权连通图中权重最小的生成树被称为最小生成树Prim算法被又...原创 2018-02-09 14:41:59 · 965 阅读 · 0 评论 -
分治法在排序算法中的应用(JAVA)--归并排序
分治法最常用的就是将规模为n的实例划分成两个n规模为n/2的实例 。推广到一般的情况,我们可以将规模为n的实例划分为b个规模为n/b的实例。这样对于算法的运行时间存在递推式:T(n) = aT(n/b)+f(n),这个式子又被称为通用分治递推式。我们假定递推式中的f(n)∈O(n^d),其中d>=0,那么:所以,对于等分的T(n) = 2T(n/2) + 1,因为a=2,b=2,d原创 2018-02-04 16:19:35 · 780 阅读 · 0 评论 -
动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法
参考图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )这种算法也叫Floyd-Warshell算法,虽然和Warshell算法名字相近,算法思想也相近,但确实是两种算法。对于一个带权图(无向或有向),全源最短路径问题就是找出每个顶点到其他所有顶点之间的最短距离。我们用一个n阶距离矩阵来记录最短路径的长度。需要注意的是该算法不适合带负权的回路图。那...原创 2018-02-09 00:21:08 · 1361 阅读 · 0 评论 -
从背包问题优化详解动态规划思想
动态规划:所有的数据结构与算法的理解必须建立在题目的练习上,否则看多少理论都没有实际用处!!!所以下面这些理论文字看不懂通通没关系,跟随下面的背包问题还会跟深入的理解。一、基本概念:任何数学递推公式都可以直接转换成递归算法,但是基本现实是编译器常常不能正确对待递归算法,结果导致低效的程序。当怀疑很可能是这种情况是,我们必须给编译器提供一些帮助,将递归算法重新写成非递原创 2018-01-23 19:10:14 · 1026 阅读 · 0 评论 -
动态规划之背包问题(C语言)
动态规划动态规划(英语:Dynamic programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题 动态规划思想大致上为:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 由于通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算原创 2017-08-24 18:12:54 · 17747 阅读 · 4 评论 -
蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题
蛮力法在求解最优解问题中的应用1、TSP(旅行商问题)要求我们找出一条n个给定城市之间的最短路径,使我们再回到出发的城市之前,对欧每个城市都只访问一次。我们可以用赋权图来描述这个问题,那么算法的目的就是求解一个图的最短哈密顿回路问题。哈密顿回路同样可以定义为其中第一个顶点和最后一个顶点相同,其他n-1个顶点互不相同。那么我们就可以通过生成n-1个中间城市的组合来的到所哟逇旅行线原创 2018-02-04 10:31:57 · 4420 阅读 · 5 评论 -
蛮力法在求解凸包问题中的应用(JAVA)
凸包问题向来是计算几何中最重要的问题之一,许多各式各样的应用大多要么本身就是图凸包问题要么其中一部分需要按照凸包问题解决。凸集合定义:对于平面上一个点集合,如果集合中的任意两点p和q为端点的线段都属于该集合,那么称这个集合为凸集合。凸包定义:一个点集合S的凸包是包含S的最小凸集合。我们可以假设有一块板子,板子上面有许多钉子,用一根橡皮筋将所有的钉子都围住,凸包就是以橡皮筋圈为边界的区域。原创 2018-02-04 10:31:34 · 2393 阅读 · 1 评论 -
蛮力法在求解“最近对”问题中的应用(JAVA)
最近对问题是在计算几何问题中最简单的,是指在一个包含n个点的集合中,找到距离最近的两个点,我们这里只研究二维空间中的版本,高维计算基本类似,区别只在于计算两点之间距离的公式略有不同,下面是标准的欧几里得距离公式:class Point { int x; int y; public Point(int x, int y) { this.x =原创 2018-02-04 10:31:23 · 2369 阅读 · 0 评论 -
蛮力法在查找算法中的应用(JAVA)--顺序查找
蛮力法在查找算法中的应用对于查找算法来说,最简单的一个思路就是逐个匹配,直到找到目标元素顺序查找:public class Main { public static void main(String[] args) { int[] a = {89, 45, 68, 90, 29, 34, 17, 0}; int k = 45;原创 2018-02-04 10:27:51 · 356 阅读 · 0 评论 -
蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序
蛮力法在排序算法中的应用对于一个排序问题,我们能想到的最简单的排序方法就是选择和冒泡1、选择排序:时间复杂度O(n^2)public class Main { public static void main(String[] args) { int[] a = {89, 45, 68, 90, 29, 34, 17}; int min;原创 2018-02-04 10:27:33 · 1403 阅读 · 0 评论 -
动态规划在求解传递闭包问题中的应用(JAVA)--Warshell算法
动态规划在求解传递闭包问题中的应用:传递闭包:对于n个顶点有向图来说,如果第i个顶点到第j个顶点之间存在一条有效的有向路径(即长度大于0的路径),那么T(i, j) = 1,否则T(i, j) = 0。例如:求解传递闭包我们可以使用深度优先搜索和广度优先搜索,我们可以对每个顶点进行DFS/BFS,在对应的矩阵位置上置为1,遍历之后我们便得到整个图的传递闭包。但是这种方式并不是高效的算法,而Wars...原创 2018-02-08 20:32:01 · 1696 阅读 · 1 评论 -
图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )
一、Dijkstra算法问题描述:求一个点到任意个点的距离 思路:单源最短路径问题,使用Dijkstra算法 Input: 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4Output: 0 1 8 4 13 17import java.util.Scanner;...原创 2018-01-11 17:53:38 · 1843 阅读 · 0 评论 -
第六届省赛(软件类)真题----Java大学C组答案及解析
第六届省赛(软件类)真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子一、隔行变色Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,....现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。请你直接提交这个整数,千万不原创 2018-01-17 22:57:29 · 615 阅读 · 0 评论 -
深入浅出讲算法思想--蛮力法思想分析及应用
蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。虽然,用蛮力法设计的算法时间特性往往也是最低的,但是许多问题我们一开始并没有很优化的算法,而蛮力法则可以帮助我们从低效的算法结构中剖析低效的缘由,进而提炼出更为优化的算法。蛮力法在排序算法中的应用(选择,冒泡)蛮力法在查找算法中的原创 2018-02-01 20:20:20 · 10232 阅读 · 0 评论 -
减治法解决尼姆(Nim)游戏/拈游戏问题(JAVA)
尼姆游戏是一种两个人玩的回合制数学策略游戏。游戏者轮流从一堆棋子(一共有好几堆,一次只能从其中一堆拿。)(或者任何道具)中取走一个或者多个,最后不能再取的就是输家。当指定相应数量时,一堆这样的棋子称作一个尼姆堆。尼姆游戏有很多形式,也可以说很多游戏的原型都是尼姆游戏。单堆尼姆游戏:假设我们现在有一堆n枚棋子,两个玩家轮流从堆中拿走至少1枚,至多m枚棋子。每次拿走的棋子数都可以不同,原创 2018-02-03 21:38:35 · 2706 阅读 · 0 评论 -
减治法在查找算法中的应用(JAVA)--快速查找
减治法在查找算法中的应用快速查找:选择问题是求一个n个数列表的第k个最小元素的问题,这个数k被称为顺序统计量。对于k=1或k=n来说,这并没有什么意义,我们通常会要找出这样的元素:该元素比列表中一半元素大,比另一半元素小,这样的元素被称为中值。我们当然可以对列表进行排序,之后找出对应下标的值,但是!!!这样一个查找问题,反而要对整个列表排序,是不是有点多余了呢?这里引入划分的概念我们可原创 2018-02-03 17:24:56 · 1654 阅读 · 0 评论 -
分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)
分治法在排序算法中的应用--快速排序时间复杂度:平均O(nlogn),最坏O(n^2)如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分。划分方法由两种,本节将主要介绍Huare划分,这也是我们通常采用的划分方法。为了文章完整,下面只给出基于Lomuto划分的代码,详细分析请参考减治法在查找算法中的应用(JAVA)--快速查找。1、基于Lomuto...原创 2018-02-04 23:58:36 · 3664 阅读 · 0 评论 -
Dijkstra算法(c++版)
迪杰斯特拉算法最短路径(DP的应用)单源最短路径,不允许出现负环核心思想:更新估算距离时间复杂度与采用的数据结构有关Array O(v2v^2v2)Binary heap O((V+E)lgV(V+E)lgV(V+E)lgV)Fibonacci heap O(E+VlgVE+VlgVE+VlgV)δ(u,v)≤δ(u,x)+δ(x,v)\delta(u, v) \leq \delt...原创 2018-10-21 11:17:40 · 32181 阅读 · 6 评论 -
求最大公约数----辗转相除法
辗转相除法(求最大公倍数)一般写法:public class Main { public static void main(String[] args) { System.out.println(gcd(18, 2)); } private static int gcd(int a, int b) { // TODO Auto-ge...原创 2018-03-28 15:22:17 · 2699 阅读 · 0 评论 -
模式匹配算法----KMP算法以及next数组的解法
KMP算法:求字符串匹配(也叫模式匹配)的算法,即给定一个字符串,求其某一子串在其中出现的位置。普通模式匹配例如:给定字符串为abcabaaabaabcac,求其子串abaabcac在其中出现的位置。结果为7对于这种问题,没有经验的编程者通常会采用逐个匹配的方法,来得出结果。这就是最简单一种算法思想。1. 逐个进行比较,如果相同,就继续比较下一个,但是我们可以看到下图中,c与a...原创 2018-03-02 17:53:17 · 3124 阅读 · 2 评论 -
求解最长回文子串----Manacher 算法
最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果一个字符串正着读和反着读是一样的,那么我们称之为回文串。例如:abba、aaaa、abvcba、123321等暴力法:遍历字符串的所有子串,对每个字串进行判断。求字符串的所有子串时间复杂度为O(n^2),判断回文后,总的时间复杂度为O(n^3)。我们规定在判断回文的时候从最长的子串开始,一旦找到就返回。判断回文的时候,采用从外到内左右成...原创 2018-03-01 15:28:23 · 243 阅读 · 0 评论 -
回溯法在解决八皇后问题中的应用
回溯法:有这样一类题目,它们要求在相对问题的输入规模按照指数速度增长(或者更快)的域中,找出一个具有指定特性的元素。例如:在图顶点的所有排列中求一个哈密顿回路,在背包问题的一个实例中求其中最有价值的物品子集,等等。在原则上这类问题可以采用穷举法求解,穷举法通常需要我们求出所有的候选解,然后从中找出符合特征的元素。而回溯法确实一个聪明的改变。回溯的思想是每次只构造解的一部分,如果这部分构造解可以...原创 2018-02-28 15:39:24 · 570 阅读 · 0 评论 -
动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法
动态规划在求解背包问题中的应用背包问题向来是动态规划的典型问题,给定n个重量为w1,w2,...,wn,价值为v1,v2,...,vn的物品和一个称重量为W的背包,求这些物品中最优价值的一个子集,且能够装到背包中。之前用蛮力法做过背包问题蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题这篇文章中采用动态规划思想解决,我们首先要推导出一个关系,用较小子实例的解来表示背包问...原创 2018-02-07 23:56:51 · 519 阅读 · 0 评论 -
动态规划在求解硬币问题中的应用(JAVA)--币制最大化、找零问题、硬币收集问题
动态规划:这种算法思想多用来求解最优化问题,因此这里存在一个最优化法则,法则指出最优化问题任一实例的最优解,都是由其子实例的最优解构成的。一般来说,自底向上的动态规划更容易设计,但是带有记忆功能的自顶向下的动态规划跟能高效的解决问题(尤其是针对重叠子的问题)。1、币值最大化问题:给定一排n枚硬币,面值为正整数c1,c2,...,cn,面值可能相同,请问如何选取硬币,可以使得在其原始位置不相邻的...原创 2018-02-07 19:43:04 · 3115 阅读 · 2 评论 -
时空权衡在模式匹配算法中的应用(JAVA)--Horspool算法(简化版BM算法)
模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串。假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为文本。这篇文章介绍了蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法,没有基础的读者可以先参考这篇文章。上述的蛮力法求解的思路为:从左到右比较模式和文本中的每一对相应...原创 2018-02-12 22:07:10 · 899 阅读 · 0 评论 -
分治法在求解凸包问题中的应用(JAVA)--快包算法
分治法在求解凸包问题中的应用(JAVA)之前写过一篇蛮力法在求解凸包问题中的应用(JAVA)还算简单易懂,没有基础的读者最好先去阅读以下。这里用分治法来求解凸包问题,由于这个算法和快速排序十分相似,因此又被称为“快包”。在平面上有n>1个点构成的集合,定义为S,为简化思考,假定这些点按照x轴、y轴升序排列。有一个几何事实就是,最左边的一个点p1和最右边的一个点pn一定是集合的凸包顶点。原创 2018-02-06 23:32:32 · 4282 阅读 · 1 评论 -
蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法
蛮力法在字符串匹配问题中的应用字符串匹配问题通常是给定一个n个字符组成的串(称为文本),一个m(m<=n)个字符的串(称为模式),从文本中寻找匹配模式的子串。显然我们需要逐个匹配,这是蛮力算法的典型特点。蛮力匹配:时间复杂度O(n^2)public class Main { public static void main(String[] args) { String...原创 2018-02-04 10:28:03 · 1386 阅读 · 0 评论 -
素数筛法求十亿内所有质数的和(C++)
筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数temp,这个数是素数,而temp的倍数可以直接筛掉。逐步迭代,可求出指定范围内的素数。public class Main { public static void main(String[] args) { Scanner in = new ...原创 2018-02-12 11:22:56 · 1108 阅读 · 0 评论 -
分治法在求解“最近对”问题中的应用(JAVA)
分治法在求解“最近对”问题中的应用最近对问题在蛮力法中有过讲解,时间复杂度为O(n^2),下面将会采用分治法讲解这类问题,时间复杂度会降到O(nlogn)我们将笛卡尔平面上n>1个点构成的集合称为P。若23时,采用分治法或许是个更好的选择。假设这些点是按照x轴、y轴升序排列的,可以找出点集在x轴方向上的中位数m,做一条垂直x轴的分割线,由此点将点集划分为左右两个大小为n/2的子集P1和P2原创 2018-02-05 20:31:12 · 1711 阅读 · 0 评论 -
分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍
分治法在二叉树遍历中的应用二叉树本身就是由两个更小的部分组成--左子树和右子树,所以二叉树的问题非常适合用分治法来解决。二叉树的高度:从叶子到根之间的最长路径。我们可以理解为根的左子树高度和右子树高度加1(加1代表根所在的层)。定义空树的高度为-1private static int height(Node node) { if (node == null) {原创 2018-02-05 13:47:31 · 1267 阅读 · 0 评论 -
减治法在查找算法中的应用(JAVA)--二叉查找树的查找、插入、删除
减治法在查找算法中的应用二叉查找树的查找与插入:二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值;(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;(3)左、右子树也分别为二叉排序树。对于二叉查找树这里我们介绍查找、插入和删除操作:这些操作会将问题的规模变成一个更小的二原创 2018-02-03 17:29:00 · 973 阅读 · 0 评论 -
贪婪算法在解决哈夫曼树及编码问题中的应用
哈夫曼编码,是一种可变字长编码(VLC)的高效算法。该算法是Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码。相比定长编码来说,这种编码实现的压缩率(衡量压缩算法效率的重要指标)非常高,也就是说,哈夫曼编码比定长编码占用更少的存储空间。假设我们要对某个字母表创建一套二进制前缀码,那么我们一般都会讲字母表中的字符与二进制的叶子...原创 2018-02-09 16:39:07 · 482 阅读 · 0 评论 -
贪婪算法在求解最短路径中的应用(JAVA)--Dijkstra算法
最短路径问题最经典的算法就是Dijkstra算法,虽然不如Floyd算法能够求全源的最短路径,但是在效率上明显强于Floyd算法。想了解Floyd算法的读者可以参考动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法单源最短路径问题是对于加权连通图来说,我们给定一个起点,求出它到其他顶点之间的一系列最短路径。这个问题不同于从一个起点出发访问其他所有顶点的问题(TSP问题),这种问题所求...原创 2018-02-09 15:32:21 · 630 阅读 · 0 评论 -
减治法解决俄式乘法问题(JAVA)
以上是在《算法设计与分析基础》一书中给出的定义。这种算法只包括折半、加倍、相加这几个操作,在计算时,不需要用九九乘法表 。同时,这个方法每次都会将计算的规模减少,运用了减治的思想public class Main { public static void main(String[] args) { int result = RusseMul(24,32)...原创 2018-02-03 19:25:54 · 1040 阅读 · 0 评论 -
减治法解决约瑟夫斯问题(JAVA)
减治法在查找算法中的应用问题背景:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想原创 2018-02-03 17:19:57 · 1159 阅读 · 1 评论 -
搜素算法(基础)--DFS/BFS算法(JAVA)
DFS、BFS的定义及C语言算法实现请参照 连通图遍历策略之深度优先搜索(C语言) 连通图遍历策略之广度优先搜索(C语言)为了便于理解这里的数据是一个无向图,要求输出遍历顺序下面只给出用例和算法,之后可以根据后面的三个题目进行深入学习 Input: 5 5 1 2 1 3 1 5 2 4 3 5 Output: 1 2 4 3 5 DFSimport ja原创 2018-01-10 19:37:26 · 964 阅读 · 0 评论 -
排序算法(一)--桶排序、冒泡、快排(JAVA)
排序算法汇总参考书籍–《啊哈!算法》 作者:啊哈磊首先提出一个问题:班内有5名同学,成绩分别为5,8,2,4,2分(满分10分),需要将成绩从小到大排序简化版 桶排序 时间复杂度O(N)import java.util.Scanner;public class Bucket_sort { public static void main(String[] args)原创 2018-01-07 16:40:09 · 247 阅读 · 0 评论 -
图论算法(六)-- 二分图的最大分配问题(JAVA)
二分图:又称二部图,如果一个图的所有顶点可以被分为X和Y两个集合,并且所有边的两个顶点恰好一个属于一个集合X,另一个属于集合Y,即每个集合内的顶点没有边相连,那么这个图就是二分图。 二分图的最大分配问题就是,在所有的分配中,可以输出分配数最多的,但是这样的求解方式效率很低。下面我们引入“增广路”的概念 增广路的本质就是一条路径的起点和终点都是未被配对的点,增加一条增广路就是增加一条配对路线。而原创 2018-01-12 23:00:56 · 1844 阅读 · 0 评论