
算法
各类算法典型例题详解
hnu哈哈
湖南大学2022届毕业本科生
展开
-
单源最短路径(分支限界)
优先级:当前路径长度剪枝函数:由于图G中各边的权均非负,所以结点所对应的当前路长也是解空间树中以该结点为根的子树中所有结点对应的路长的一个下界。扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。数据的存储:①二维数组Type G[n][n]存储邻接矩阵②数组Type dist[n]记录源点到各顶点的距离③数组int prev[n]记录从源到各顶点路径上的前驱顶点Graph:template <class Type>.原创 2020-06-09 09:34:40 · 3254 阅读 · 0 评论 -
分支限界法概述
1.什么是分支限界法?搜索解空间树:广度优先/最小消费(最大效益)优先特点:每个活结点只有一次机会成为扩展结点 成为扩展结点的活结点一次性产生所有子节点 子节点中导致不可行解/非最优解的舍去,其余加入活结点表 不断从活结点表中取下一结点进行处理,直到表空/找到所需的结点取下一结点的方式:队列式 优先队列式2.队列式分支限界法类似层次遍历,广度优先搜索3.优先队列式分支限界法优先队列中规定的结点优先级,是与结点相关的数值p 实现:最大堆、最小堆 上界函数的作用:①剪原创 2020-06-09 08:30:57 · 3246 阅读 · 0 评论 -
无向图的最大割问题(分支限界)
一、需求分析0.问题描述给定一个无向图G=(V, E),设是G的顶点集。对任意(u, v)∈E,若u∈U,且v∈V-U,就称(u, 1)为关于顶点集U的一条割边。顶点集U的所有割边构成图G的一个割。G的最大割是指G中所含边数最多的割。对于给定的无向图G,设计一个优先队列式分支限界法,计算G的最大割。1.问题分析①解向量:(x1,x2,……xn)是一个01序列,其中xi=1表示点xi在割集,0表示不在割集②解空间:完全二叉树,子集树③约束条件:只有考察右子结点的时候,需要判断是原创 2020-06-04 12:37:08 · 10909 阅读 · 10 评论 -
舍伍德算法解决线性时间选择
一、需求分析0.问题描述元素选择问题的一般提法是:给定线性序集中n个元素和一个整数k (1≤k≤n), 要求找出这n个元素中第k小的元素,即如果将这n个元素依其线性序排列时,排在第k个位置的元素即为要找的元素。当k=1时,就是要找的最小元素:当k=n时, 就是要找最大元素;当k=(n+1)/2 时,称为找中位数。1.问题分析要分析问题描述,分析问题中的需求,通过分析,提取、设计和总结要实现的功能。即要准确描述和定义要做什么。还要分析问题具有什么样的性质。例如最优子结构性质等,如果能证明.原创 2020-06-04 08:38:54 · 3833 阅读 · 3 评论 -
随机化算法
简介:一个随机化算法( randomized algorithm) 是指需要利用随机数发生器的算法,算法执行的某些选择依赖于随机数发生器所产生的随机数。随机化算法有时也称概率算法( probabilisticalgorithm),但也有人对两者这样区分:如果取得结果的途径是随机的,则称为随机算法,如拉斯维加斯算法;而如果取得的解是否正确存在随机性,称为概率算法,如蒙特卡罗算法。分治、动态规划、贪心法、回溯和分支限界等算法的每一计算步骤都是确定的,概率算法允许执行过程中随机选择下一计算步骤。 在原创 2020-06-04 09:33:16 · 5909 阅读 · 1 评论 -
0-1背包问题(分支限界法)
1.优先级如何确定?在优先队列分支限界法中,节点的优先级由已装袋的物品价值加,上剩下的最大单位重量价值的物品装满剩余容量的价值和。2.如何实现?对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。算法首先检查当前扩展结点的左儿子结点的可行性。 如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。 当前扩展结点的右儿子结点一定是可行结点。 仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。 当扩展到叶节点时为问题的最优值。优先队列里面的元素包装成原创 2020-05-27 10:09:24 · 19602 阅读 · 2 评论 -
电路布线问题(分支限界法)
一.问题描述印刷电路板将布线区域划分成n*m个方格阵列。 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。 在布线时,电路只能沿直线或直角布线。 为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。二.算法设计与分析1.回溯vs分支限界①深度优先:搜索到可行解不一定是最优解,需要将所有可行解搜索出来进行比较。②广度优先:一层一层搜索,只要搜索到可行解那么必定是最优解,进入树的深度就是路径的长度。原本是一个图,但是由..原创 2020-05-25 11:29:08 · 11175 阅读 · 0 评论 -
0-1背包问题(回溯)
一、问题1.问题描述给定一个背包,容量为c,对于n件物品,每件物品i的价值v[i],重量w[i],每件物品可以放入一部分,求在不超过背包容量的情况下能放进背包的物品最大价值2.问题分析问题分析对于每一个物品可以选择放或不放 解空间是一颗完全二叉树(子集树) 搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入其左子树。当右子树中有可能包含最优解时才进入右子树搜索;否则将右子树剪去。约束函数背包剩余容量不为0时可以继续放入物品 设r是当前剩余物品价值总和;cp是当前价原创 2020-05-23 19:52:19 · 964 阅读 · 0 评论 -
子集合问题(回溯)
子集和问题的一个实例为<S, t>。其中,S={x, x2, .. xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得原创 2020-05-23 19:50:15 · 3173 阅读 · 0 评论 -
直线K中值问题(动规)
在一个按照南北方向划分成规整街区的城市里,n个居民点分布在一条直线上的n个坐标点x<x1<...<xn处。居民们希望在城市中至少选择一一个, 但不超过k个居民点建立服务机构。在每个居民点xi处,服务需求量为wi≥0,在该居民点设置服务机构的费用为ci≥0。假设居民点xi到距其最近的服务机构的距离为di,则居民点xi的服务费用为wi*di。建立k个服务机构的总费用为A+B。A是在k个居民点设置服务机构的费用的总和; B是n个居民点服务费用的总和。原创 2020-05-23 19:44:00 · 1918 阅读 · 0 评论 -
Dijkstra单源最短路径(可用贪心法解决的三步证明)
一、问题1.问题描述给定一个带权有向图G=(V, E),其中每条边的权是非负实数。另外,给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。2.问题分析算法描述:输入的带权有向图是G=(V, E),点集V={1,2, ……,n},顶点v是源。 c是一个二维数组,c[i][i]表示边( i ,j )的权。 当( i ,j )不在E 时,c[i][j]是一个大数。 dist[i]表示当前从源到顶点i的最短特殊路径长度。原创 2020-05-22 22:23:31 · 5547 阅读 · 0 评论 -
装载问题(分支限界法)
装载问题(分支限界法)问题定义:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为w,且Ew≤c1+c2装载问题要求确定是否有一个合理的装载方案,可将这n个集装箱装E这2艘轮船。如果有,找出一种装载方案。方案将第一艘船尽可能装满剩余物体装上第二艘轮船...原创 2020-05-18 12:41:39 · 7952 阅读 · 0 评论 -
分支限界法概述
1.求解目标:找出满足条件的一个解,或满足条件的最优解。2.搜索方式:广度优先或以最小消耗(最大收益)优先的方式搜索解空间树。3.基本思想:原创 2020-05-13 09:34:06 · 4254 阅读 · 0 评论 -
圆排列问题(回溯)
圆排列问题(回溯)1.问题描述给定n个大小不等的圆C1,C2, ……,Cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3个圆的半径分别为1、1、2时,这3个圆的最小长度的圆排列如图5-8所示,其最小长度为2+sqrt(2)2.问题分析①解的表示解向量(r1,r2,……rn)为圆的一个排列对应的圆半径,(x1,x2,……,xn)是对应的圆心坐标的排列。②解空间排列树③约束函数要注意原创 2020-05-13 09:20:26 · 2854 阅读 · 0 评论 -
回溯法总结
1.影响回溯算法的效率的因素:(1)产生x[k]的时间(2)满足显约束的x[k]值的个数(剪枝的多少)(3)计算显约束函数constraint的时间(4)计算上界函数bound的时间(5)满足约束函数和上界函数的所有x[k]的个数2.最坏情况时间复杂度:O(p(n) n! ) 或O(p(n) 2^n ) 或O(p(n) n^n )3.重排原理:x[i]的顺序通常随意,有时最小的排前比较好。4.概率方法蒙特卡罗方法估算结点数目该方法的基本思想是:在解空间树上产生一条随机的路径,沿此原创 2020-05-13 09:00:36 · 3596 阅读 · 0 评论 -
图的m着色问题(回溯)
图的m着色问题(回溯)1.问题描述:给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法,使G中每条边的2个顶点着有不同颜色?这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。2.问题分析:●图着色问题描述为: 给定无向连通图G=(V, E)和正整数m,求最小的整数m,使得用m种颜色对G中的顶点着色.使得任.原创 2020-05-11 11:43:00 · 3498 阅读 · 0 评论 -
n后问题(回溯)
n后问题(回溯)1.问题描述在nxn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线 上的棋子。n后问题等价于,在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。2.构建解空间:①怎么表示解:(x1,x2,x3……,xn) xi表示(i,xi)即第i个皇后放在第i行的第xi列。②显约束:xi=1,2,……n③隐约束:不在同一列:xi ≠ xj 不在同一正、反对角线:| xi - xj | ≠ .原创 2020-05-11 11:01:00 · 2758 阅读 · 0 评论 -
符号三角形(回溯)
符号三角形(回溯)一、问题描述图5-4是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和、“-”的个数相同。二、算法分析1.解向量:x[1:n]表示第一行2.可行性的约束函数:当前三角形"+"和“-”都...原创 2020-04-29 10:32:03 · 5030 阅读 · 2 评论 -
批处理作业调度(回溯)
批处理作业调度(回溯)一、题目描述:给定n个作业的集合J=(J1,J2, .. Jn)。每个作业J都有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业i需要机器j的处理时间为tji(i=1,2, ..n; j=1,2)。 对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间,则所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。...原创 2020-04-29 09:18:00 · 3899 阅读 · 0 评论 -
装载问题(回溯法过程和方案选取)
装载问题(回溯法过程和方案选取)一、问题描述有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。二、问题分析主要思想:将第一艘船尽可能装满,剩余的装入第二艘船。1.n和t是什么?n是解向量的分量的个数,t指的是当前要确定第t个分量...原创 2020-04-27 11:44:40 · 6690 阅读 · 3 评论 -
回溯法概述
回溯法概述——通用的解题方法、优化的穷举法。一、针对问题:需要找出它的解集,或者要求回答什么解时满足条件的最佳解时。基本做法:搜索,或者时一种组织的井井有条的,能避免不必要搜索的穷举式搜索法(剪枝)。主要利用:深度游先搜索策略(1)递归回溯(2)迭代回溯(3)子集树算法框架(4)排列树算法框架二、直观印象:(1)“通用的解题方法”,可以搜索所有解或...原创 2020-04-26 11:41:22 · 775 阅读 · 0 评论 -
To the Max(ACM)最大和矩阵
TotheMax Time Limit:1000ms,Special Time Limit:2500ms,Memory Limit:32768KB Total submit users:926,Accepted users:794 Problem 10102 :No special judgement Problem description Given a t...原创 2020-04-25 11:03:17 · 369 阅读 · 0 评论 -
Beautiful Natural Number(ACM)
You are given two integer numbers N and M, and your task is to calculate how many integer numbers satisfy the following two conditions.1): This integer number is not less than 0, and is not great than N;2): The sum of the digit of this integer number is原创 2020-04-25 10:59:00 · 419 阅读 · 0 评论 -
马的哈密顿周游(分治)
马的哈密顿周游(分治)需求分析0.问题描述8x8 的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点。这条路线称为马的一条Hamiton周游路线。对于给定的mxn的国际象棋棋盘, m和n均为大于5的偶数,且|m-n|≤2,试设计一个分治算法找出马的一条Hamilton周游路线。算法设计:对于给定的偶数m, n≥6,且m n1≤2,计算mxn的国际象棋棋...原创 2020-04-25 10:54:55 · 5696 阅读 · 0 评论 -
集合划分问题(分治)
集合划分问题(分治)二、问题分析:1.将n个元素分成m个非空集合有f(n,m)种不同的分法。2.问题分解,考虑第一个元素,它只有两种情况:①第1个元素放入其余n-1个元素组成的m个集合中,有m种不同的放法。②第1个元素组成一个子集,其余n-1个元素组成m-1个集合。3.递推方程:f(n,m)=m*f(n-1,m)+f(n-1,m-1)代码:int Di...原创 2020-04-22 20:48:48 · 2116 阅读 · 0 评论 -
贪心法解决着色类问题的三步证明(会场安排问题为例)
贪心策略:每次选择与前一个活动相容的开始时间最早的活动。令原问题为:在第一个房间的时间限制为limit的条件下,对于活动集合S,需要增加的最少房间数。(时间限制指的是选择放在第一个房间的活动开始时间t必须>=limit)全部活动的集合为S。原创 2020-04-22 13:34:10 · 1228 阅读 · 0 评论 -
背包问题贪心法可解的证明
(最优子结构性质&贪心选择性质&假设归纳法证明每一步贪心得到最优解)原创 2020-04-21 20:34:23 · 4482 阅读 · 2 评论 -
动态规划解0-1背包问题
动态规划解0-1背包问题&贪心法解背包问题一、0-1背包问题:1.问题概述:给定一个背包,容量为c,给定n件物品{1,2……n},第 i件物品的体积为 wi ,价值为 vi,现在求一种方案,将价值尽可能大的物品装入背包。2.问题分析:①这是一个求最优解的问题., 即求②最优子结构性质:t ( i, j ) = max{ vi+ t (i-1, j-wi),t(...原创 2020-04-21 16:59:56 · 1042 阅读 · 0 评论 -
会场安排问题(图的Werch Powell着色问题)
会场安排问题(图的Werch Powell着色问题)1.题目概述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相当于要找的最小会场数。)算法设计:对于给定的k个待安排的活动,计算使用最少会场的时间表。数据输入:由文件...原创 2020-04-20 18:15:21 · 1247 阅读 · 0 评论 -
什么问题适合贪心法?
1.贪心和动态规划:①贪心: 根据当前状态,作出局部最优的选择解决作出选择后产生的子问题。(问题规模:大小)②动态规划: 根据子问题的解,结合当前问题 作出选择。(问题规模:小大)2.性质①贪心选择性质:所求问题的整体最优解可以由一系列的局部最优选择达到。②最优子结构性质:一个问题的最优解包含其子问题的最优解。3.如何证明一个问题可以用贪心法解决从三个方面:①贪心选择性质...原创 2020-04-20 11:21:42 · 2925 阅读 · 0 评论 -
最优批处理问题
最优批处理问题1.问题描述:在一台超级计算机上,编号为1,2……n的n个作业等待批处理。批处理的任务就是将这n个作业分成若干批,每批包含相邻的若干作业。从时刻0开始,分批加工这些作业。在每批作业开始前,机器需要启动时间s,而完成这批作业所需的时间是单独完成批中各个作业需要时间的总和。单独完成第i个作业所需的时间是ti,所需的费用是它的完成时刻乘以一一个费用系数fi。同一批作业将在同一时刻完成。...原创 2020-04-19 19:12:11 · 2614 阅读 · 0 评论 -
最大k乘积问题(动态规划)
设I是一个 n 位十进制整数。如果将 I 划分为 k 段,则可得到 k 个整数。这 k 个整数的乘积称为I的一个 k 乘积。试设计一个算法,对于给定的 I 和 k,求出 I 的最大k 乘积。原创 2020-04-19 14:22:01 · 6363 阅读 · 1 评论 -
最小m段和问题(动态规划)
最小m段和问题1.问题描述:问题描述:给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?算法设计:给定n个整数组成的序列,计算该序列的最优m段分割,使m段子序列的和的最大值达到最小。数据输入:由文件input.txt提供输入数据。文件的第1行中有2个正整数n和m。正整数n是序列的长度;正整数m是分割的段数。...原创 2020-04-19 13:17:40 · 6205 阅读 · 1 评论 -
数字三角形问题(动态规划)
数字三角形问题1.题目描述:给定一个由n行数字组成的数字三角形,如图3-7所示。设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。算法设计:对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。2.最优子结构:从第x点到底层有一条最优的路径lx,路径上一点k,那么从k到底层的最有路径lk, 则lk包含于lx。3.状态转...原创 2020-04-19 10:23:04 · 1961 阅读 · 0 评论 -
最长单调递增子序列(动态规划)
最长单调递增子序列给定一个int序列,求它的最长单调递增子序列。1.算法思想:问题转换: a为原始序列,b为a的升序排序后的序列,求a和b的最长公共子序列。2.最优子结构:a序列的前 i个元素和b序列的前j个元素的最长公共子序列一定是a,b的最长公共子序列的一部分。3.状态转移方程:对于 a 的前 i 个元素和 b 的前 j 个元素, t [i] [j]是公共子序列...原创 2020-04-19 08:57:36 · 4738 阅读 · 0 评论 -
动态规划-凸多边形最优三角形剖分
最优子结构:假设 v0 vn vk 是包含在最优解中,t [ i ] [ j ] { vi-1, vi ……vj }的最优解原问题: t [1] [n]原创 2020-04-17 00:02:59 · 2124 阅读 · 1 评论 -
动态规划-最大子段和
1.题目描述2.算法思想方法1:枚举将所有的(i,j)对找出来,计算对应子段和,最后得到最大的。int MaxSum(int*a ,int *besti,int &bestj){ int sum=0,T; for(int i=1;i<=n;i++) for(int j=i;i<=n;j++){ T=0; for(int k=i;k<=j;k++...原创 2020-04-13 10:56:41 · 1218 阅读 · 1 评论 -
分治法实现合并排序(含数据测试和分析)
1.算法思想:①将待排序的序列一分为二②对左右子序列排序③子序列合并,使原序列有序主要函数代码:public static void mergeSort(int[ ] a, int left, int right) { if (left<right) {//至少有2个元素 int i=(left+right)/2; //计算中...原创 2020-04-09 23:04:36 · 1532 阅读 · 1 评论 -
分治法查找最大值最小值实验
1.问题描述:输入一组数据,找出其中的最大值最小值2.分治思想: 找数组a范围l~R的最值=> ①范围一分为2 mid=(l+r)/2 ②最大值=max(l~mid最大值,mid+1~r最大值); ③最小值=min(l~mid最小值,mid+1~r最小值); 3.代码实现:①主函数:时间复杂度分析:search函数:递推...原创 2020-04-09 21:19:49 · 3819 阅读 · 0 评论 -
动态规划求树的最大连通分支问题
给定一棵树T,树中每个顶点u都有权值w(w),可以是负数。现在要找到树T的一个连通子图使该子图的权之和最大。对于给定的树T,计算树T的最大连通分支。原创 2020-04-08 14:33:44 · 2609 阅读 · 0 评论