![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 55
介绍常用算法思想及实战应用
Lix_Demon
这个作者很懒,什么都没留下…
展开
-
折半查找Java语言描述
思路每一次查找,将查找的区间从中间分为两部分,若查找值大于中间的元素,则在右侧区间继续查找;若查找值小于中间的元素,则在左侧区间继续查找。特点折半查找的先决条件是查找表中的数据元素必须有序。代码public int binarySearch(Comparable[] a,Comparable findElem){ int low=0; int high=a.length()-1; int mid; while(low<=high) {原创 2020-07-19 16:07:28 · 387 阅读 · 0 评论 -
经典排序算法Java语言描述
经典排序算法选择排序思路特点代码插入排序思路特点代码希尔排序思路特点代码归并排序思路特点原地归并自顶向下的归并排序自底向上的归并排序快速排序思路特点代码选择排序思路首先,找到数组中最小的那个元素;其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。特点运行时间和输入无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息。一个已经有序的数组或是主键全部相等原创 2020-07-18 16:17:47 · 116 阅读 · 0 评论 -
动态规划法求解资源分配问题
问题描述资源分配问题是将数量一定的一种或若干种资源(原材料、资金、设备或劳动力等),合理地分配给若干使用者,使总收益最大。例如,某公司有3个商店A、B、C,拟将新招聘的5名员工分配给这3个商店,各商店得到新员工后,每年的赢利情况如下表所示,求分配给各商店各多少员工才能使公司的赢利最大?问题求解采用动态规划求解该问题。设置3个商店A、B、C的编号分别为1~3。这里总员工数为n=5,商店个数...原创 2020-03-28 20:16:23 · 5592 阅读 · 0 评论 -
动态规划法求解完全背包问题
问题描述有n种重量和价值分别为wi、vi(1≤i≤n)的物品,从这些物品中挑选总重量不超过W的物品,求出挑选物品价值总和最大的挑选方案,这里每种物品可以挑选任意多件。问题求解设置动态规划二维数组dp,dp[i][j]表示从前i个物品中选出重量不超过j的物品的最大总价值。显然有边界条件:dp[i][0]=0(背包不能装入任何物品时,总价值为0),dp[0][j]=0(没有任何物品可装入时,总...原创 2020-03-28 17:10:55 · 708 阅读 · 0 评论 -
动态规划法求解0/1背包问题
问题描述有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。问题求解对于可行的背包装载方案,背包中物品的总重量不能超过背包的容量。最优方案是指所装入的物品价值最高,即 v1x1+v2x2+...原创 2020-03-28 16:49:07 · 3456 阅读 · 0 评论 -
动态规划法求解编辑距离问题
问题描述设A和B是两个字符串。现在要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有3种:(1)删除一个字符。(2)插入一个字符。(3)将一个字符替换另一个字符。例如,A=“sfdqxbw”,B=“gfdgw”,结果为4。问题求解设字符串A、B的长度分别为m、n,分别用字符串a、b存放。设计一个动态规划二维数组dp,其中dp[i][j]表示将a[0…i-1](...原创 2020-03-28 14:45:31 · 1831 阅读 · 0 评论 -
动态规划法求解最长递增子序列问题
问题描述给定一个无序的整数序列a[0…n-1],求其中最长递增子序列的长度。例如,a[]={2,1,5,3,6,4,8,9,7},n=9,其最长递增子序列为{1,3,4,8,9},结果为5。问题求解设计动态规划数组为一维数组dp,dp[i]表示a[0…i]中以a[i]结尾的最长递增子序列的长度。对应的状态转移方程如下:求出dp后,其中最大元素即为所求。代码int a[] = { 2...原创 2020-03-28 14:33:46 · 2528 阅读 · 0 评论 -
动态规划法求解最长公共子序列问题
问题描述字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=(x0,x1,…,xm-1),序列Y=(y0,y1,…,yk-1)是X的子序列,存在X的一个严格递增下标序列(i0,i1,…,ik-1),使得对所有的j=0,1,…,k-1,有 =yj。问题求解若设A=(a0,a1,…,am-1)(含m个字符),B...原创 2020-03-26 16:31:13 · 2432 阅读 · 0 评论 -
动态规划法求解三角形最小路径问题
问题描述给定高度为n的一个整数三角形,找出从顶部到底部的最小路径和,只能向先移动相邻的结点。首先输入n,接下来的1~n行,第i行输入i个整数,输出分为2行,第一行为最小路径,第2行为最小路径和。例如,下图是一个n=4的三角形,输出的路径是2 3 5 3,最小路径和是13。问题求解将三角形采用二维数组a存放,前面的三角形对应的二维数组如下:从顶部到底部查找最小路径,那么结点(i,j)的...原创 2020-03-26 15:37:50 · 2743 阅读 · 1 评论 -
动态规划法求解最大连续子序列和问题
问题描述给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和。例如序列(-2,11,-4,13,-5,-2)的最大子序列和为20序列(-6,2,4,-7,5,3,2,-1,6,-9,10,-2)的最大子序列和为16规定一个序列最大连续子序列和至少是0,如果小于0,其结果为0。问题求解对于含有n个整数的序列a,设bj=MAX{ai+ai+1+…+aj} (1≤j≤n)...原创 2020-03-26 09:07:57 · 4093 阅读 · 0 评论 -
动态规划法求解整数拆分问题
问题描述求将正整数n无序拆分成最大数为k(称为n的k拆分)的拆分方案个数,要求所有的拆分方案不重复。问题求解设n=5,k=5,对应的拆分方案有:为了防止重复计数,让拆分数保持从大到小排序。正整数5的拆分数为7。采用动态规划求解整数拆分问题。设f(n,k)为n的k拆分的拆分方案个数:因此,f(n,k) = f(n-k,k) + f(n,k-1)状态转移方程:代码int d...原创 2020-03-26 08:38:47 · 4885 阅读 · 4 评论 -
贪心法求解流水作业调度问题
问题描述有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。可以假定任何作业一旦开始加工,就不允许被中断,直到该作业被...原创 2020-03-22 11:01:23 · 4880 阅读 · 0 评论 -
贪心法求解哈夫曼编码问题
问题描述设要编码的字符集为{d1, d2, …, dn},它们出现的频率为{w1, w2, …, wn},应用哈夫曼树构造最优的不等长的由0、1构成的编码方案。问题求解先构建以这个n个结点为叶子结点的哈夫曼树,然后由哈夫曼树产生各叶子结点对应字符的哈夫曼编码。哈夫曼树(Huffman Tree)的定义:设二叉树具有n个带权值的叶子结点,从根结点到每个叶子结点都有一个路径长度。从根结点到各个...原创 2020-03-22 10:42:49 · 6079 阅读 · 0 评论 -
贪心法求解多机调度问题
问题描述设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。问题求解贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,...原创 2020-03-22 10:19:08 · 2924 阅读 · 0 评论 -
贪心法求解田忌赛马问题
问题描述二千多年前的战国时期,齐威王与大将田忌赛马。双方约定每人各出300匹马,并且在上、中、下三个等级中各选一匹进行比赛,由于齐威王每个等级的马都比田忌的马略强,比赛的结果可想而知。现在双方各n匹马,依次派出一匹马进行比赛,每一轮获胜的一方将从输的一方得到200银币,平局则不用出钱,田忌已知所有马的速度值并可以安排出场顺序,问他如何安排比赛获得的银币最多。输入:输入包含多个测试用例,每个测试...原创 2020-03-22 09:33:57 · 2509 阅读 · 0 评论 -
贪心法求解最优装载问题
问题描述有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(1≤i≤n)的重量为wi。不考虑集装箱的体积限制,现要选出尽可能多的集装箱装上轮船,使它们的重量之和不超过W。问题求解这里的最优解是选出尽可能多的集装箱个数,并采用贪心法求解。当重量限制为W时,wi越小可装载的集装箱个数越多,所以采用优先选取重量轻的集装箱装船的贪心思路。对wi从小到大排序得到{w1,w2,…,wn},设最优...原创 2020-03-22 09:21:40 · 5128 阅读 · 0 评论 -
贪心法求解背包问题
问题描述设有编号为1、2、…、n的n个物品,它们的重量分别为w1、w2、…、wn,价值分别为v1、v2、…、vn,其中wi、vi(1≤i≤n)均为正数。有一个背包可以携带的最大重量不超过W。求解目标:在不超过背包负重的前提下,使背包装入的总价值最大(即效益最大化),与0/1背包问题的区别是,这里的每个物品可以取一部分装入背包。问题求解这里采用贪心法求解。设xi表示物品i装入背包的情况,0≤...原创 2020-03-22 09:06:10 · 6923 阅读 · 0 评论 -
贪心法求解蓄栏保留问题
问题描述农场有n头牛,每头牛会有一个特定的时间区间[b,e]在蓄栏里挤牛奶,并且一个蓄栏里任何时刻只能有一头牛挤奶。现在农场主希望知道最少蓄栏能够满足上述要求,并给出每头牛被安排的方案。对于多种可行方案,输出一种即可。问题求解牛的编号为1~n,每头牛的挤奶时间相当于一个活动,与前面活动安排问题不同,这里的活动时间是闭区间,例如[2,4]与[4,7]是交叉的,它们不是兼容活动。采用与求解活...原创 2020-03-22 08:52:46 · 4584 阅读 · 0 评论 -
贪心法求解活动安排问题
问题描述假设有一个需要使用某一资源的n个活动所组成的集合S,S={1,…,n}。该资源任何时刻只能被一个活动所占用,活动i有一个开始时间bi和结束时间ei(bi<ei),其执行时间为ei-bi,假设最早活动执行时间为0。一旦某个活动开始执行,中间不能被打断,直到其执行完毕。若活动i和活动j有bi≥ej或bj≥ei,则称这两个活动兼容。设计算法求一种最优活动安排方案,使得所有安排的活动个...原创 2020-03-22 08:42:28 · 4352 阅读 · 0 评论 -
贪心法
贪心法什么是贪心法贪心法求解的问题应具有的性质贪心选择性质最优子结构性质贪心法的一般求解过程什么是贪心法贪心法的基本思路是在对问题求解时总是做出在当前看来是最好的选择,也就是说贪心法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。人们通常希望找到整体最优解,所以采用贪心法需要证明设计的算法确实是整体最优解或求解了它要解决的问题。贪心法从问题的某一个初始解{}出发,采用逐步构造...原创 2020-03-22 08:19:41 · 539 阅读 · 0 评论 -
分枝限界法求解流水线作业调度问题
问题描述有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。可以假定任何作业一旦开始加工,就不允许被中断,直到该作业被...原创 2020-03-18 10:55:20 · 5738 阅读 · 3 评论 -
分枝限界法求解任务分配问题
问题描述有n(n≥1)个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务。第i个人执行第j个任务的成本是c[i][j](1≤i,j≤n)。求出总成本最小的分配方案。问题求解这里采用优先队列式分枝限界法求解。任务和人员的编号均为1~n,解空间每一层对应一个人员的分配。根结点对应人员0(虚结点),依次为人员1、2、…、n分配任务。叶子结点对应人员n。解向量为...原创 2020-03-18 10:07:41 · 5871 阅读 · 0 评论 -
分枝限界法求解图的单源最短路径
问题描述给定一个带权有向图G=(V,E),其中每条边的权是一个正整数。另外,还给定V中的一个顶点v,称为源点。计算从源点到其他所有顶点的最短路径长度。这里的长度是指路上各边权之和。采用队列式分枝限界法求解队列结点类型声明如下:struct NodeType //队列结点类型{ int vno; //顶点编号 int length; //路径长度};用dist数组...原创 2020-03-18 09:50:22 · 3335 阅读 · 0 评论 -
分枝限界法求解0/1背包问题
问题描述有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。假设一个0/1背包问题是,n=3,重量为w=(16,15,15),价值为v=(45,25,25),背包限重为W=30,解向量为x=(...原创 2020-03-18 09:26:20 · 6505 阅读 · 0 评论 -
分枝限界法
分枝限界法什么是分枝限界法分枝限界法与回溯法的主要区别分枝限界法的设计思想设计合适的限界函数组织活结点表队列式分枝限界法优先队列式分枝限界法确定最优解的解向量分枝限界法的时间性能什么是分枝限界法分枝限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。但在一般情况下,分枝限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分枝限界法的求解目标则是找...原创 2020-03-18 08:28:59 · 2092 阅读 · 1 评论 -
回溯法求解流水作业调度问题
问题描述有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。可以假定任何作业一旦开始加工,就不允许被中断,直到该作业被...原创 2020-03-17 20:25:20 · 5448 阅读 · 5 评论 -
回溯法求解活动安排问题
问题描述假设有一个需要使用某一资源的n个活动所组成的集合S,S={1,…,n}。该资源任何时刻只能被一个活动所占用,活动i有一个开始时间bi和结束时间ei(bi<ei),其执行时间为ei-bi,假设最早活动执行时间为0。一旦某个活动开始执行,中间不能被打断,直到其执行完毕。若活动i和活动j有bi≥ej或bj≥ei,则称这两个活动兼容。设计算法求一种最优活动安排方案,使得所有安排的活动个...原创 2020-03-17 15:12:34 · 6043 阅读 · 0 评论 -
回溯法求解任务分配问题
问题描述有n(n≥1)个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务。第i个人执行第j个任务的成本是c[i][j](1≤i,j≤n)。求出总成本最小的分配方案。问题求解这里采用回溯法求解。问题表示如下:int n=4;int c[MAXN][MAXN]={{0},{0,9,2,7,8},{0,6,4,3,7}, {0,...原创 2020-03-17 14:54:45 · 4159 阅读 · 1 评论 -
回溯法求解图的m着色问题
问题描述给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的两个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。第1行有3个正整数n、k和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有两个正整数u、v,表示图G的一条边(u,v)。...原创 2020-03-17 14:44:53 · 2266 阅读 · 0 评论 -
回溯法求解n皇后问题
问题描述在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。如下图所示是6皇后问题的一个解。q[1…6]={2,4,6,1,3,5}代码int q[MAX];bool place(int i)//检测当前行是否与原来的棋子有冲突{ int j = 1; if (i == 1) return true; while (j < i) { ...原创 2020-03-17 14:33:40 · 3271 阅读 · 0 评论 -
回溯法求解子集和问题
问题描述给定n个不同的正整数集合w=(w1,w2,…,wn)和一个正整数W,要求找出w的子集s,使该子集中所有元素的和为W。例如,当n=4时,w=(11,13,24,7),W=31,则满足要求的子集为(11,13,7)和(24,7)。问题求解该问题的解空间树是一棵子集树。设解向量x=(x1,x2,…,xn),这里是求所有满足目标条件的解,所以一旦搜索到叶子结点(即i>n),如果相应...原创 2020-03-16 19:17:49 · 5276 阅读 · 1 评论 -
回溯法求解装载问题
问题描述有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(1≤i≤n)的重量为wi。不考虑集装箱的体积限制,现要从这些集装箱中选出重量和小于等于W并且尽可能大的若干装上轮船。例如,n=5,W=10,w={5,2,6,4,3}时,其最佳装载方案是(1,1,0,0,1)或者(0,0,1,1,0),maxw=10。问题求解采用带剪枝的回溯法求解。问题的表示如下:int w[]={0,5,2...原创 2020-03-16 18:58:47 · 6456 阅读 · 1 评论 -
回溯法求解0/1背包问题
问题描述有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且满足重量限制具有最大的价值。求解思路用w[1…n]/v[1…n]存放物品信息,x[1…n]数组存放最优解,其中每个元素取1或0,x[i]=1表示第i个物品放...原创 2020-03-16 16:31:52 · 1965 阅读 · 0 评论 -
回溯法求解全排列问题
问题描述有一个含n个整数的数组a,所有元素均不相同,求其所有元素的全排列。例如,a[]={1,2,3},得到结果是(1,2,3)、(1,3,2)、(2,3,1)、(2,1,3)、(3,1,2)、(3,2,1)。求解思路代码void dfs(int a[], int n, int i){ if (i >= n) dispasolution(a, n); else { ...原创 2020-03-16 16:05:15 · 1060 阅读 · 0 评论 -
回溯法求解幂集问题
问题描述有一个含n个整数的数组a,所有元素均不相同,设计一个算法求其所有子集(幂集)。例如,a[]={1,2,3},所有子集是:{},{3},{2},{2,3},{1},{1,3},{1,2},{1,2,3}(输出顺序无关)。求解思路显然本问题的解空间为子集树,每个元素只有两种扩展,要么选择,要么不选择。采用深度优先搜索思路。解向量为x[],x[i]=0表示不选择a[i],x[i]=1表...原创 2020-03-16 16:00:53 · 2524 阅读 · 0 评论 -
回溯法
回溯法问题的解空间什么是回溯法问题的解空间一个复杂问题的解决方案是由若干个小的决策步骤组成的决策序列,解决一个问题的所有可能的决策序列构成该问题的解空间。应用回溯法求解问题时,首先应该明确问题的解空间。解空间中满足约束条件的决策序列称为可行解。一般来说,解任何问题都有一个目标,在约束条件下使目标达到最优的可行解称为该问题的最优解。问题的解由一个不等长或等长的解向量X={x1,x2,…,x...原创 2020-03-16 15:22:32 · 923 阅读 · 0 评论 -
蛮力法求解任务分配问题
问题描述有n(n≥1)个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务。第i个人执行第j个任务的成本是c[i][j](1≤i,j≤n)。求出总成本最小的分配方案。问题求解所谓一种分配方案就是由第i个人执行第j个任务,用(a1,a2,…,an)表示,即第1个人执行第a1个任务,第2个人执行第a2个任务,以此类推。全部的分配方案恰好是1~n的全排列。这里采用增量穷...原创 2020-03-16 08:23:15 · 4263 阅读 · 0 评论 -
蛮力法求解全排列问题
问题描述对于给定的正整数n(n≥1),求1~n的所有全排列。问题求解代码vector<vector<int>> ps;void Insert(vector<int> s, int i, vector<vector<int>> &ps1){ vector<int> s1; vector<int&...原创 2020-03-15 18:55:53 · 3245 阅读 · 0 评论 -
蛮力法求解0/1背包问题
问题描述有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。并对下表所示的4个物品求出W=6时的所有解和最佳解。问题求解对于n个物品、容量为W的背包问题,采用前面求幂集的方法求出所有的物品组合。对...原创 2020-03-15 18:43:24 · 2529 阅读 · 0 评论 -
蛮力法求解幂集问题
问题描述对于给定的正整数n(n≥1),求1~n构成的集合的所有子集(幂集)。解法1采用直接蛮力法求解,将1~n的存放在数组a中,求解问题变为构造集合a的所有子集。设集合a[0…2]={1,2,3},其所有子集对应的二进制位及其十进制数如下。对于含有n(n≥1)个元素的集合a,求幂集的过程如下:for (i=0;i<2^n;i++) //穷举a的所有子集并输出{ 将i转换为...原创 2020-03-15 18:28:33 · 1892 阅读 · 0 评论