算法
Jayphone17
这个作者很懒,什么都没留下…
展开
-
LeetCode141.环形链表【双指针】
一、题目给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。示例 3:输入:head = [1.原创 2020-09-01 16:56:33 · 142 阅读 · 0 评论 -
LeetCode26.删除排序数组中的重复项【双指针】
一、题目给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度...原创 2020-09-01 16:19:48 · 123 阅读 · 0 评论 -
C++模拟蚁群算法解决作业车间调度问题(Job-Shop Scheduling Problem,JSP)
一、作业车间调度问题描述作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一。其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加工流水线等。JSP问题描述:一个加工系统有M台机器,要求加工N个作业,其中,作业i包含工序数为Li。令,则L为任务集的总工序数。其中,各工序的加工时间已确定,并且每个作业必须按照工序的先后...原创 2019-12-07 13:42:10 · 9022 阅读 · 11 评论 -
回溯——用贝尔曼法则优化最优加工顺序问题
1.问题分析在之前的博客中https://blog.csdn.net/Jayphone17/article/details/102996649我们用回溯法解决了机器零件加工最优加工顺序问题我们分析一下那个情况的复杂度:(1)时间复杂度,如图所示:最坏情况下,除了最后一层外,有1+n+n(n-1)+…+n(n-1)(n-2)…≤ nn!个结点需要判断限界函数,判断限界函数需...原创 2019-11-15 18:58:34 · 2296 阅读 · 1 评论 -
回溯——机器零件加工最优加工顺序问题
1.问题分析有n个机器零件{j1,j2,j3,……,jn},每个零件必须先由机器1处理,再由机器2处理。零件ji需要机器1、机器2处理的时间为t1i,t2i。如何安排零件加工顺序使第一个零件从机器1上加工开始到最后一个零件在机器2上加工完成,所需的总加工时间最短?根据问题的描述,不同的加工顺序,加工完所有零件所需要的时间肯定不同。例如:现在有三个机器零件j1,j2,j3在机器1加...原创 2019-11-10 15:18:19 · 5935 阅读 · 3 评论 -
回溯——N皇后问题
1.问题分析在n X n的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之同一行,同一列,同一写线上的棋子。现在n X n的棋盘上放置n个皇后,使彼此不受攻击。如图所示,我们要在i行j列放置一个皇后,那么第i行的其他位置(同行),j列其他位置(同列),同一写线上的其他为止吗,都不能放置皇后。条件是这么要求的,但是我们也不能杂乱无章的尝试每个为止,我们可以以行...原创 2019-11-07 22:37:19 · 1129 阅读 · 0 评论 -
回溯、图论—— N色地图着色问题
1.问题描述如果我们把地图上的每一个区域都退化成一个点,相邻的区域用连线连接起来,那么地图就变成了一个无向连通图,我们给地图着色就相当于给该无向连通图的每个点着色,要求有连线的点不能有相同的颜色。这就是典型的图的m着色问题。给定无向连通图G m种颜色,找出所有不同的着色方案,使相邻区域有不同的颜色。如以下例子: 该图一共有7个区域,分别是ABCDEFG,我们分别编号1-7...原创 2019-11-07 22:16:34 · 3091 阅读 · 1 评论 -
回溯、图论——最大团问题(求最大完全子图)
1.问题分析要想解决最大团问题,也就是求最大完全子图。我们需要了解相关概念,现在有如下图:(1)完全子图:给定无向图G=(V,E),其中V是顶点集,E是边集。G'=(V',E')如果顶点集V'∈V,E'∈E,且G'种任意两个点有边相连,则称G'是G的完全子图。例如下面的几个图都是上图的完全子图:(2)团:G的完全子图是G的团,当且仅当G'不包含在G的更大的完全子图...原创 2019-11-07 21:41:53 · 11548 阅读 · 4 评论 -
回溯法基础知识
回溯法是一种选优搜索法,按照选优条件进行深度优先搜索(简单来讲就是遍历)。当搜索进行到某一步时,发现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术称为回溯法,而满足回溯条件的某个状态点称为“回溯点”。1.算法思想回溯法是从初始状态出发,按照深度优先搜索得到方式,根据产生子节点的条件约束,搜索问题的解。当发现当前结点不满足求解条件时,就回溯,尝试其他...原创 2019-11-05 10:48:16 · 2888 阅读 · 0 评论 -
图论——入门级二分图最大匹配Bipartite Matching
1.问题描述我们先来了解一下相关图论的概念:二分图:又称二部图。是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果结点集V可分割为两个互不相交的子集(V1,V2),并且图中的每条边(i,j),所关联的两个结点i和j分别属于这两个不同的结点集,则称G为一个二分图。 匹配:在图论中,一个匹配(matching)是一个边的集合,其中任意两条边都没有公共结点。如图所示就算是一个匹配:...原创 2019-11-01 17:12:56 · 11838 阅读 · 0 评论 -
图论基础——遍历图的BFS
1.问题分析续上一篇博客,用DFS遍历图:图论基础——遍历图的DFS同时我们也可以用BFS来对这个图进行遍历,遍历的时间戳标注在上面:2.算法设计利用广度优先搜索来遍历这个图的过程如下:首先以一个未被访问过的顶点作为起始顶点,比如1号顶点作为起点.再将一号顶点放入队列中,然后将1号顶点相邻的未访问过的顶点即2、3、5号顶点一次再放入队列中,如下图:接下...原创 2019-10-31 16:56:00 · 295 阅读 · 0 评论 -
图论基础——遍历图的DFS
1.问题分析:首先先介绍一下什么是图(graph):简单大白话地说,图就是由一些小圆点(顶点)和一些把这些小圆点连接起来的直线(边)组成的,如图所示:现在在我们要做的就是对这个图的所有顶点遍历一遍,也就是都访问一次。我们这里使用深度优先搜索来遍历这个图,会得到以下的结果:遍历这个图的访问顺序如下:每个顶点上面的红色数字代表这个顶点是第几个被访问的,我们称为时间戳...原创 2019-10-31 16:45:33 · 457 阅读 · 0 评论 -
DFS——炸弹人3
1.问题分析继续上两篇博客的内容,关于炸弹人问题,我们同样可以用DFS来求解,详细DFS解释例子在:https://blog.csdn.net/Jayphone17/article/details/102702960代码也类似,可以参考2.算法设计从开始点向右走。每走到一个新点就统计该点可以消灭的敌人数,并从该点继续尝试往下走,直到没路可走返回,再尝试其他方向,直到将...原创 2019-10-29 16:22:12 · 204 阅读 · 0 评论 -
BFS——炸弹人2
1.问题分析上一篇博客中关于炸弹人问题,我们还可以用广度优先搜索和深度优先搜索求解,这里先介绍用广度优先搜索BFS求解。下篇再介绍用DFS深度优先搜索求解。2.算法设计1.首先确定从(3,3)出发开始扩展,所以先将(3,3)入列,并且计算出炸弹放置在这点能够消灭的敌人数。2.然后通过(3,3)这个点可以扩展出(3,4),(4,3),(3,2),(2,3),并将这些点入...原创 2019-10-29 15:44:58 · 244 阅读 · 0 评论 -
简单枚举——炸弹人1
1.问题描述我们都直到小霸王游戏中的炸弹人。现在有一个特殊的关卡如下:只有一个炸弹,请问在哪里放置这个炸弹才可以消灭最多的敌人?我们先把这个地图模型化,用”#“表示墙,这种墙是不可以被炸掉的。敌人用“G“表示,用”.“表示空地:##############GG.GGG#GGG.####.#G#G#G#G##.......#..G##G#.###.#G#G##GG.G...原创 2019-10-29 11:28:32 · 448 阅读 · 0 评论 -
广度优先搜索BFS——迷宫解救2
1.问题分析在上一篇博客中A同学前往迷宫解救B同学的行动中,我们用了深度优先搜索方法,这里介绍另外一种可以使用的方法——广度优先搜索(Breadth First Search,BFS),也称为宽度优先搜索。依旧是用一个为数组存储这个迷宫。最开始的时候A同学在迷宫(1,1)处,他可以往右走或者往下走。上一篇博客使用DFS方法我们是先让A同学先向右走,然后一直尝试下去,知道走不通的时候...原创 2019-10-24 11:33:01 · 320 阅读 · 0 评论 -
深度优先搜索DFS——迷宫解救
1.问题分析有一天同学B到独自一人到迷宫玩,方向感不好的B同学果不其然在迷宫中迷路,现在同学A要去解救B同学。迷宫由n行m列的单元格组成,每个单元格要么是空地,要么是障碍物。任务就是帮助同学A找到一条从迷宫起点通往同学B的最短路径。注意,障碍物是不可以移走的,当然同学A也是不能走到地图之外。2.算法设计(1):首先我们可以用一个二维数组来存储这个迷宫,刚开始迷宫的入口在(...原创 2019-10-23 17:08:53 · 372 阅读 · 0 评论 -
动态规划DP——编辑距离DistanceEditting
1.问题分析我们经常听说过DNA亲子鉴定。那么到底是怎么回事呢?人类的DNA由四个基本字母(A,C,G,T)租场,包含了多达三十亿个字符。如果两个人的DNA序列相差0.1%,任然意味着有300万个温志不同,所以我们经常看到DNA亲子鉴定报告上有:相似度99.999%,不排除亲子关系。怎么判断两个基因的相似度呢?生物学上给出了一种编辑距离的概念。例如两个字符串FAMILY和FRAME...原创 2019-10-18 17:23:20 · 360 阅读 · 0 评论 -
动态规划DP——凸多边形最优三角剖分
1.问题分析我们可以把披萨饼看作是一个凸多边形,凸多边形是指多边形的任意两点的连线均落在多边形的内部或边界上。(1)什么是凸多边形?如下图所示,是一个凸多边形如下图所示,不是一个凸多边,因为v1v3连线落在了多边形的外部凸多边形不相邻的两个顶点的连线称为凸多边形的弦(2)什么是凸多边形的三角剖分?凸多边形的三角剖分是指将一个凸多边形分割成互不相交的三角形...原创 2019-10-16 11:16:00 · 5050 阅读 · 0 评论 -
动态规划DP——0-1背包问题
1.问题分析有n个物品每个物品的重量为我w[i],价值为v[i],购物车的最大容量是W。选若干个物品放进购物车,使价值最大。问题归结为求解满足约束条件,使目标函数达到最大值的解向量X{x1,x2,x3,x4,……,xn}。该问题是经典的0-1背包问题,而0-1背包使用贪心算法可能得不到最优解。因为物品的不可切割性,无法保证都能装满背包,所以采用每次装价值/重量比最高的贪心策略...原创 2019-10-14 19:00:38 · 1221 阅读 · 0 评论 -
动态规划DP——矩阵连乘的最小计算量
1.问题分析给定n个矩阵{A1,A2,A3,……,An},其中,Ai和Ai+1(i=1,2,3,……,n-1)是可乘的。矩阵乘法如图所示:用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量是不同的,找出一种加括号的方法,使得矩阵连乘的计算量最小。例如:A1是M(5×10)的矩阵A2是M(10×100)的矩阵A3是M(100×2)的矩阵那么有两种加括号的方法:...原创 2019-10-14 18:16:32 · 2793 阅读 · 1 评论 -
贪心——背包问题(非DP 01背包)
问题分析:假设山洞中有n中宝物,每种宝物都有一定的重量w和相应的价值v,马车运载能力有限,只能运走m重量的宝物,一种宝物只能拿走一件,宝物可以分割。那么怎么样才能让马车运走宝物的价值最大呢?我们可以尝试贪心策略:每次选价值最大的宝物装入背包。 每次选重量最小的宝物装如背包。 每次挑选单位重量价值最大的宝物(性价比最大)。算法设计:数据结构及初始化。将n中宝物的重量...原创 2019-09-26 11:35:46 · 482 阅读 · 0 评论 -
贪心入门——最优装载问题
问题描述:贪心算法最简单的就是用来解决最优装载问题,在确定最大装载容量的情况下,要求装载的物品的数量尽可能多,那么优先把重量小的物品放进去,在容量固定的情况下,装的物品最多。采用重量最轻者先装的岩心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。算法设计:当载重量为定值c时,Wi越小,可装载的物品数量n最大。只要依次按照选择最小的重量的物品,直到不能再装为止...原创 2019-09-26 10:48:13 · 365 阅读 · 0 评论 -
分治法——快速排序QuickSort
快速排序它的基本思想是通过一组排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终将所有数据变成一个有序数列。算法设计快速排序的基本思想是基于分治策略的,其算法思想如下:分解:先从数列中取出一个元素作为基准元素。以基准元素为标准,将问题分解为两个子序列,使小于或...原创 2019-09-25 11:11:28 · 1380 阅读 · 0 评论 -
分治法——合并排序MergeSort
合久必分,分久必合——合并排序在数列排序中,如果只有一个属,本身就是有序的。如果只有两个数字,那么只需要一次就可以简单地排完序。也就是说,数字越少,排序越简单。那么如果有一个有大量数据组成的数列,我们很难完成排序,那该怎么办呢?我们可以考虑将其一直分解,分解直至只剩下一个数字,本身即有序,然后再将这些有序的数组合并在一起,执行一个与分解相反的过程,从而完成整个数列的排序合并排序就是采用...原创 2019-09-24 21:54:40 · 882 阅读 · 0 评论 -
贪心——时间/事件/任务调度问题
问题分析:会议/课程/任务调度问题也是典型的贪心策略问题。比如说,会议安排没有的事能在有限的时间内召开更多的会议。(任何两个会议不能同时进行)算法设计:初始化:将n个会议的开始事件、结束时间存放在结构体数组中,如果需要知道选中了哪些会议,还需要在结构体中增加会议编号,然后按结束时间从小到大排序,结束时间相等时,按开始事件从大到小排序。 根据岩心策略就是选择一个具有最早结束...原创 2019-09-26 17:20:05 · 765 阅读 · 0 评论 -
操作系统——用C++模拟一个分段存储管理
一、需求分析 段式存储管理是基于为用户提供一个方便灵活的程序设计环境而提出来的。段式管理的基本思想是:把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。和页式管理时一样,段式管理也采用只把那些经常访问的段驻留...原创 2019-09-26 19:50:45 · 5524 阅读 · 2 评论 -
贪心、图论——单源最短路径Dijkstra算法
1.问题分析:单源最短路径问题。给定一个有向带权图G=(V,E),其中每条边的权是非负实数(Dijkstra不支持处理带负权边的)。此外给定V中的一个顶点,成为源点。现在要计算从源点到各顶点的最短路径长度,这里路径长度指路上各边的权之和。2.算法设计:Dijkstra算法是解决单源最短路径的贪心算法,它求出长度最短的一条路径,再参照最短路径求出长度次短的一条路径,直到求出从源...原创 2019-09-28 19:18:15 · 533 阅读 · 0 评论 -
图论、DP思想——多源最短路径Floyd-Warshall 算法
1.算法简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。 在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。...原创 2019-09-28 19:34:32 · 1246 阅读 · 0 评论 -
贪心——最小生成树Kruskal算法
构造最小生成树还有一种算法,Kurskal算法:设G=(V,E)是无向连通带权图,V={1,2,…,n};设最小生成树T=(V,TE),该树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),Kruskal算法将这n个顶点看成是n个孤立的连通分支。它首先将所有的边按权值从小到大排序,然后只要T中选中的边数不到n−1,就做如下的贪心选择:在边集E中选取权值最小的边(i,j),如果将边(i,j...原创 2019-10-04 13:52:46 · 1026 阅读 · 0 评论 -
动态规划DP——最长公共子序列Longest Common String
1.问题分析给定两个序列 X={x1,x2,x3,……,xm}和 Y={y1,y2,y3,……,yn},找出X和Y的一个最长公共子序列。例如:X={A,B,C,B,A,D,B},Y={B,C,B,A,A,C},那么最长公共子序列就是BCBA。如何找到最长公共子序列呢?如果使用暴力搜索方法,需要穷举X的所有子序列,检查每个子序列是否也是Y的子序列,记录找到的最长公共子序列。X的子序...原创 2019-10-10 11:27:05 · 486 阅读 · 0 评论 -
分治法——二分搜索BinarySearch
猜数游戏问题描述:给定一个数字,再给N个数字,要从这N个数找出这个给定的数字,最坏的情况,如果一个一个找,要猜N次才能成功。其实我们没有必要一个一个猜,因为这些数字是有限的而且是有序的(我们给它们排个序),这是一个典型的二分搜索问题。我们可以用折半查找的策略,每次和中间的元素比较,如果比中间的元素小,那么要查找的数字就在左半部分。反之,如果比中间的元素大,那么要查找的元素就在中...原创 2019-09-24 16:24:44 · 605 阅读 · 0 评论