算法设计与分析
yws_2973199368
这个作者很懒,什么都没留下…
展开
-
分支限界——最大团问题
分支限界——最大团问题问题:最大团问题。分析:类似装载问题,01子集树,上界为剩下所有未被选择的点全算上。代码:#include<bits/stdc++.h>using namespace std;#define MAXN 105#define INF 0x3f3f3fint m[MAXN][MAXN];int bestN = 0;struct Node{ int level; int cn; int upbound; Node*原创 2020-11-25 12:17:00 · 631 阅读 · 0 评论 -
分支限界——布线问题
分支限界——布线问题问题:印刷电路板将布线区域划分成n×m个方格如图a所示。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如图b所示。为了避免线路相交,已布了线的方格做了封锁标记,其它线路不允穿过被封锁的方格。分析:写了一万遍的二维图BFS,除了vis[]用以记录层数之外没有太多要注意的点,代码就不贴了。...原创 2020-11-23 19:23:33 · 394 阅读 · 0 评论 -
分支限界——TSP问题
分支限界——TSP问题问题:TSP问题。分析:排列树问题,和之前的子集树问题略有不同,因为活结点可供选择的子节点与前面选择的情况有关,因此如果按照前面子集树的记录每个节点父节点的方式,就很难知道有哪些节点是可选的,哪些节点是选过的。因此对于每个节点,都记录其选过的节点和没选的节点,同时记录其选的顺序,这样就可以直接构造出最优解,因此每个节点都需要有一个数组。另外需要确定的是其上界和下界。该问题是一个极小化问题,下界需要精确解,上界则仅需是其中一个解。因此确定上界就从当前点开始,每次选距离最近的点,原创 2020-11-17 23:35:45 · 1845 阅读 · 1 评论 -
分支限界——装载问题、0-1背包问题
分支限界——装载问题、0-1背包问题分支限界:分支限界相比于回溯,是广搜,相比深搜更加“精明”,深搜比较头铁,属于行动派,先认准一个方向实干下去,不会去挑拣方向;广搜则比较猥琐,先盘算一下所有的方向,去掉那些没有希望的(限界剪枝),然后还可能在剩下的有可能的方向中选取最有可能成功的那个(优先队列),才会去干。因此回溯法比较适合那种求出一个可行解就行,或者是把可行解全部找出来的问题,或者是那些深搜比广搜要好的问题,需要考虑的东西更少,单步计算也少;分支限界则比较适合求最优的那个解的问题,缺点是要考虑的东原创 2020-11-17 15:18:07 · 560 阅读 · 0 评论 -
回溯法——一个有趣的高精度数
回溯法——一个有趣的高精度数问题:一个有趣的高精度数据:构造一个尽可能大的数,使其从高到低满足前一位能被1整除,前2位能被2整除,…, 前n位能被n整除。代码:#include <bits/stdc++.h>using namespace std;#define MAXN 10005// 当前解int now[MAXN];// 最优解int best[MAXN];// 判断a和b的大小bool bigger(int a[],int b[]){ int a原创 2020-11-15 15:12:44 · 433 阅读 · 2 评论 -
回溯法——图的m可着色优化问题
回溯法——图的m可着色优化问题问题:给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。对于含有n个节点的图,问能否能用m种颜色着色,使得任意两个相邻的节点的着色不同?如果可以,给出所有的可行方案。分析:典型子集树问题。约束函数:每个顶点和其相原创 2020-11-15 14:14:21 · 1268 阅读 · 0 评论 -
回溯法——最大团问题
回溯法——最大团问题问题:给定无向图G=(V,E)。如果U∈V,且对任意u,v∈U有(u,v)∈E,则称U是G的完全子图。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。完全子图:任意两个顶点相连。团:不存在包含它的更大的完全子图。最大团:顶点数最多的团。如果U∈V且对任意u,v∈U有(u,v)∉E,则称U是G的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。G的最大独立集是G中所含顶点数最多的独立集。对于任一无向图原创 2020-11-15 13:17:16 · 1528 阅读 · 0 评论 -
回溯法——批作业调度问题
回溯法——批作业调度问题问题:给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案(给出作业的加工顺序),使其完成时间和达到最小。分析:所有可能的解为各个任务的一个全排列,因此是一个子集树问题。约束函数没有明确的要求,限界函数为当前已经完成的工件的总的完成时刻和小于最优解。关键是求出每种情况下对应的结果。工件i在机器2上的结束时间等于开原创 2020-11-14 21:46:02 · 581 阅读 · 0 评论 -
回溯法——装载问题与0-1背包问题
回溯法——装载问题与0-1背包问题问题:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且集装箱总重小于等于轮船总载重。装载问题要求确定是否有一个合理的装载方案可将这批集装箱装上这2艘轮船。如果有,找出一种装载方案。分析:假如要将集装箱装进两艘轮船,那么只需将第一艘轮船尽可能装满,剩下的尽量装进第二艘就可以了。因此原问题被分解为两个模式相同的问题:从所有集装箱中挑选出使得货轮1载重最大的那些,然后再从剩下的集装箱中选出使得货轮2载重最大的那些。这是价值等于重量原创 2020-11-14 19:32:43 · 1182 阅读 · 0 评论 -
回溯法——N皇后问题与TSP问题
回溯法——N皇后问题与TSP问题对于一般的问题而言,很多时候无法找到其最优子结构性质或者其不是一个最优化问题,这些问题都是NP的。我们无法采用像动态规划一样的技巧简化求出某个具体解的过程,唯一能做的就是蛮力遍历所有可能的解。在蛮力法的基础上,假如把求每个解的过程组织成一个树状结构,从根节点到叶节点的每次遍历就是一个可能解,那么就可以采用深搜+剪枝的方式来简化计算,在计算之前就知道某些解是不可行的,因此可以说回溯法是特殊情况下对蛮力法的优化。问题:N后问题:在N×N的棋盘中放置N个皇后,使得任何两个皇后原创 2020-11-14 16:04:56 · 857 阅读 · 0 评论 -
贪心法——硬币找零问题
贪心法——硬币找零问题问题:假设有n种硬币,其重量分别为w1, w2, …, wn,它们的面值分别为v1=1, v2, … , vn,现需要用这些硬币付款总钱数是y,问如何选取硬币使得付款的硬币总重量最轻?分析:——实际上就是0-N背包问题之前的一篇博客分析到0-1背包贪心法没有最优解,0-N背包也是一样。这里提供一个反例:反例:3种硬币,(价值,重量)分别为(3, 6),(2, 5),(1, 5),取价值为4。贪心选择:选硬币1,3,总重量为11;最优选择:选2个硬币2,总重量10;贪原创 2020-11-10 15:13:36 · 1094 阅读 · 0 评论 -
贪心法——多机调度问题
贪心法——多机调度问题问题:设有n个独立的作业{1, 2, … , n},由m台相同的机器进行加工处理,作业i的处理时间为ti,任何作业不可以拆分为更小作业,且作业未完工前不允许中断处理。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。分析:这个问题是NP完全问题,到目前为止还没有有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法——贪心得不到最优解的情形,但是可以得到近似最优解(即一种较优的解)。采用可以设计出解多机调度问题的原创 2020-11-10 14:45:05 · 797 阅读 · 0 评论 -
贪心法——单源最短路径问题——dijkstra算法
贪心法——单源最短路径问题——dijkstra算法单源最短路径给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。dijkstra算法思想: 初始顶点集合S为源点,每次扩充一个距离源点的特殊路径最短的点到该顶点集合S中,所谓特殊路径是指路径中的所有中间点都在集合S中的路径,S中的所有点都是已经找到最短路径的点,当所有点都加入S后,算法完成。为什么最原创 2020-11-10 14:33:33 · 1029 阅读 · 0 评论 -
贪心法——最小生成树问题——prime算法和kruskal算法
贪心法——最小生成树问题——prime算法和kruskal算法最小生成树图的最小生成树是一棵包含图的所有顶点的树,其具有MST性质:最小生成树一定包含最小的连接两个顶点的边(反证法可证)。由此可以得出两个结论:与某个节点相关的权值最小的边,一定在某个最小生成树中。权值最小的边,一定在某个最小生成树中。根据这两个结论,分别产生了prime算法和kruskal算法。prime算法思路:每次选取距离已选点集最近的那个未被选择的点,加入已选点集中,直到所有顶点都被选了为止。从源点开始,每次从原创 2020-11-09 21:48:09 · 1106 阅读 · 1 评论 -
贪心法——Huffman树
贪心法——Huffman树问题:给定字符集C={c1,c2,…cn}以及每个字符频率f(ci),求关于C的一个最优前缀编码(总码长最小)。分析:每次选择最小频率的两个子树合并为新的子树,进行n-1次操作即可。证明略。代码:#include<bits/stdc++.h>using namespace std;struct node{ node* leftChild; node* rightChild; char chara; float fre原创 2020-11-09 17:30:12 · 209 阅读 · 0 评论 -
贪心法——最优装载问题
贪心法——最优装载问题问题:有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。0-1背包在价值相同时的特例。分析:直管思路:先装最轻的。将所有物品从轻到重排序。贪心选择:选择第一个待选物品。父问题:给出待选物品的一个最优选择。子问题:给出选了第一个待选物品后的最优选择。贪心选择性质证明:利用数学归纳法,证明两点:1.原问题以贪心选择开始,也就是证明数学归纳法的归纳基础成立;2.对于任意规模的以贪心选原创 2020-11-09 14:24:10 · 2904 阅读 · 0 评论 -
贪心法——0-1背包问题与背包问题
贪心法——0-1背包问题与背包问题问题:0-1背包问题:给定n个物品和一个背包。物品i的重量为wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中的物品总价值最大?说明:同一物品不能装入多次,也不能装入物品的一部分。背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。问题分析:对于背包问题而言,执行尽量装入最大单位重量价值的贪心选择即可,其正确性证明略。对于0-1背包问题,则不可以用贪心算法,因为背包有可能留原创 2020-11-08 21:51:22 · 6006 阅读 · 0 评论 -
贪心法——活动安排问题
贪心法——活动安排问题贪心法贪心法的本质可以认为是动态规划在特定条件下的优化。贪心法满足两个性质,最优子结构性质和贪心选择性质。满足最优子结构性质意味着问题可以被层层分解为子问题,这些子问题构成树状结构,意味着贪心算法可以求解的问题可以使用动态规划算法求解。对应到树状结构的话,就是从底向上求解,需要预先求出所有子问题的解以期求出父问题的解,这就意味着要遍历所有的从叶节点到根节点的路径。贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的贪心选择来达到。满足贪心选择性质,意味着对于每个内节点处原创 2020-11-08 20:55:35 · 1987 阅读 · 0 评论 -
动态规划——序列匹配
动态规划——序列匹配问题:设S1 [1,m]和S2 [1,n]为两个字符序列,对这两个字符序列进行顺序扫描比较,比较时可以在某个序列的两个字符之间插入空格,以使他们局部相同区域对应。在比较中,如果两个对应字符相等,赋权值2,如果对应字符不等,赋权值-2,如果一个是字符一个是空格,赋权值-1。问题:寻找权值最大的匹配度(匹配权值和)与对准方式。分析:c[i][j]代表两序列从1分别到i,j的最大匹配值。对于每个序列的末端而言,有三种情况:1.字符对字符,二者相等,则两序列末端均-1;2.字符对字符,原创 2020-11-06 21:10:32 · 1236 阅读 · 0 评论 -
动态规划——最优二叉搜索树
动态规划——最优二叉搜索树问题:给定数据集合S与存取概率分布P,求一颗平均查找次数(平均查找长度)最小的二叉搜索树,即最优二叉搜索树。分析:对于一个给定的升序序列,如何构造其二叉搜索树呢?只要不断“断开”即可,换句话说,还是一个加括号问题。m[i][j]为i到j构成的一棵子树的平均查找长度w[i][j]为i倒j的所有节点的概率总和假设从k处断开,那么假设其被分为左子树、右子树和根节点。如果将左右子树放在其父树中,则其所有节点的深度都会增加1,换算过来,在树中的子树平均查找长度要在子树单独存在的原创 2020-11-06 18:27:20 · 426 阅读 · 0 评论 -
动态规划——背包问题(离散0-1、0-N)
动态规划——背包问题(离散0-1、0-N)0-1问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。在选择装入背包的物品时,对每种物品i只有两个选择,装入背包或不装入背包,也不能将物品装入背包多次(0-1)。分析:子结构:m(i,j):序号为i,i+1,…n的若干待装物品,背包容量为j,最大价值。递推结构:第i个物品,若装得下,有两种选择,选或者不选;若装不下,那就直接不选。m(i,j) = m(i+1,原创 2020-11-06 15:34:59 · 887 阅读 · 0 评论 -
动态规划——投资问题
动态规划——投资问题问题:m万元钱,n个投资项目,函数fi (x)表示将x元钱投入第i个项目所产生的效益,i=1,2,…n。如何分配这m元钱,使得投资的总效益最高?分析:F[x][k]:x万元投给前k个项目的收益f[xk][k]:xk万元投给第k个项目的收益F[x][k] = f[x][1],k = 1;max_0<=xk<=x_{f[xk][k]+F[x-xk][k-1]},k>1;初始化F[x][1] = f[x][1]代码:#include <bits/std原创 2020-11-06 11:25:21 · 820 阅读 · 0 评论 -
动态规划——最大子段和问题
动态规划——最大子段和问题问题:给定n个整数(可以为负数)的序列(a1 , a2 , …, an),求其最大子段和(连续的某个子串)。分析:蛮力法的话,O(n2)分治法,将序列分为左右两部分分别求最大子段和,从分界点开始向两边分别找最大子段和再合并,取最大即可。复杂度递推式:T(n) = 2T(n/2) + O(n) = O(nlogn)动态规划,最优子结构的构造有点小技巧。最优子结构:b[j],表示到j结束的所有子段中最大的那个,起始点从1到j都有可能,如果遍历一遍j,就可以覆盖所有子问题。原创 2020-11-05 22:42:46 · 2335 阅读 · 0 评论 -
动态规划——图像压缩问题
动态规划——图像压缩问题问题:图象压缩问题要求确定象素序列{p1 ,p2 ,…,pn}的最优分段,使得依此分段所需的存储空间最少。每个分段的长度不超过256位。问题描述比较复杂,复习时间比较紧张,此处不贴了。分析:s[i]:子结构。p1,p2,…pi在最优分段时所需的位数s[i]应该为所有划分方式中位数最少的那一种,为此需要遍历所有的划分方式。据此递推公式如下:s[i] = min_1<=k<=min{i,256}_{s[i-k] + k*bmax(i-k+1,i)} + 11原创 2020-11-05 22:42:12 · 1709 阅读 · 0 评论 -
动态规划——电路布线问题
动态规划——电路布线问题问题:在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱与下端接线柱相连,其中π(i)是{1,2,…,n}的一个排列。导线(i,π(i))称为该电路板上的第i条连线。对于任何1≤i<j≤n,第i条连线和第j条连线相交的充分且必要的条件是π(i)>π(j)。电路布线问题要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。换句话说,该问题要求确定导线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集。分析:原创 2020-11-01 11:56:29 · 1010 阅读 · 1 评论 -
实验1动态规划——小明打王者
实验1动态规划——小明打王者问题:小明想要在王者荣耀游戏里晋升一个段位,假设他一共需打了n场比赛,且必须成功赢得至少70%的场次才能成功晋升。假设每场比赛小明获胜的概率分别为p1,p2,…,pn,请帮他算出成功晋级段位的概率是多少?输入:参数1:整数num(0<=num<=1000),表示比赛的场数。参数2:整数数组p[num] = {p1,p2,…,pnum},其中pi表示小明有pi%的概率赢得第i场比赛。(0<=pi<=100)输出:成功晋级段位的概率,保留小数点后5原创 2020-10-30 15:42:45 · 1765 阅读 · 0 评论 -
动态规划——最长公共子序列
动态规划——最长公共子序列问题:问题:给定2个序列X={x1 ,x2 ,…,xm}和Y={y1 ,y2 ,…,yn},找出X和Y的最长公共子序列。子序列和子串的区别:是否连续。分析:首先考虑蛮力法,求X和Y的所有公共子序列,找出最长的。判断X一个子序列是否是Y子序列时间O(n),X有2m个子序列,最坏情况下时间复杂度O(n2m)。考虑使用动态规划算法求解:——分析最优子结构:子结构由原序列尝试减少最后一个元素得到。设序列X={x1 ,x2 ,…,xm}和Y={y1 ,y2 ,…,yn}的最长公共原创 2020-10-29 20:37:16 · 1708 阅读 · 0 评论 -
动态规划——凸多边形最优三角剖分问题——加括号问题
动态规划——凸多边形最优三角剖分问题——加括号问题问题:给定凸多边形P={v0,v1,… ,vn-1},以及定义在由凸多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分所对应的权,即三角剖分中诸三角形上权之和为最小。分析:该问题和矩阵连乘问题是同构的,矩阵连乘问题是该问题的特殊情形(子问题合并处不同)。矩阵连乘积中的每个矩阵Ai对应于凸(n+1)边形中的一条边vi-1vi。三角剖分中的一条弦vivj,i<j,对应于矩阵连乘积A[i+1:j]。若凸(n+1)原创 2020-10-29 18:38:30 · 353 阅读 · 0 评论 -
动态规划——矩阵连乘问题
动态规划——矩阵连乘问题动态规划动态规划问题与分治法类似,思路都是将大问题划分为小问题,求解可以求解的小问题并将其组合为原问题的解,二者都是自底向上计算(动态规划似乎也可以用具有记忆能力的递归自顶向下求解)。二者概念上十分相像,此时(初学)在我看来似乎并没有明显界限。不同的是,由于分治法的子问题之间没有重复的部分,所以分治法的较大子问题完全由组成其的较小子问题合并得到,在实际求解过程中往往不需要额外的空间来记录非其组成部分的子问题。而动态规划的子问题之间有重复部分,子问题之间具有最优子结构性质(即子问原创 2020-10-29 14:05:39 · 497 阅读 · 0 评论 -
分治法——平面最近点对问题
分治法——平面最近点对问题**问题:**寻找一个二维平面上的最近点对的距离思路:等分平面,分治左右,合并左右问题和跨分割线的解。首先考虑一维的情况,假如将所有的点在x轴的某个区间上从小到大排列,以中位数为基准点将该区间分为点数量基本等同的两部分p1,p2,那么最近点对有三种可能:p1中的最近点对,p2中的最近点对,跨p1p2的最近点对,分别对应了分治法中的子问题和子问题合并。对于子问题而言,最小的子问题是区间内仅有一个或者两个点,即最近点对的距离为无限或者是两点距离。对于跨p1p2的最近点对,假如采原创 2020-10-27 14:30:55 · 1145 阅读 · 3 评论 -
分治法——线性时间选择
分治法——线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,算法的复杂度为O(n)。思路分析:首先,假如我们要找最大或者最小的元素,那么只需遍历一遍序列即可,复杂度为O(n)。假如要找第k大的元素,k<=n/logn或者k>=n-nlogn时,利用堆排序,时间复杂度仍然可以达到O(n),具体为什么还没搞懂。无论如何,如果对于任意的k,(最坏)时间复杂度要想达到O(n),对整个序列进行排序都是不可行的(复杂度至少为nlogn)。那么如何将复原创 2020-10-21 18:37:09 · 1706 阅读 · 0 评论 -
分治法——排序问题
分治法——排序问题归并排序对于两个已经排序完成的序列,假设长度分别为m和n,那么将二者合并成为一个排序完成的序列,其实就是不断从两个序列中挑出最小的元素,放到新生成的序列中,当一个序列完了之后把另一个序列剩下的放在新生成的序列末端即可,为此需要开辟m+n的额外空间。根据此思路,为了将一个给定的序列排序,可以将其划分为两个子序列,然后对两个子序列分别排序,再按照此思路合并即可。当问题规模退化为1时,最小的问题显然是可解的。假设给定序列的长度为n,开辟大小为n的额外内存空间即可。const int ma原创 2020-10-18 18:47:39 · 1736 阅读 · 0 评论 -
分治法——矩阵乘法
分治法——矩阵乘法问题:给定两个n阶方阵相乘,对求解算法进行优化。首先,根据传统算法,两个n阶矩阵相乘,对于n2个元素,每个元素想要被计算出来,至少要进行n次乘法和n-1次加法,算法复杂度达到O(n3)。考虑将矩阵分块,分为4个n/2的方阵,那么每个两个小方阵相乘的复杂度为O(n3)/8,要想得出最终结果,一共需要8次小方阵相乘,复杂度没有减小。为了减小复杂度,必须减小相乘的次数。strassen乘法:通过数学构造,将8个不同的小方阵转化为7个不同的小方阵,从而减少相乘的次数。代码:#incl原创 2020-10-17 23:49:26 · 3458 阅读 · 0 评论 -
分治法——二分查找
分治法——二分查找问题:给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x,返回其(首次)出现的位置。虽说是老问题,但是并不可简单忽视,网上有人说“十个二分九个错”,还是要好好梳理一下。参考自:https://www.zhihu.com/question/36132386?sort=created思路分析问题一,区间开闭设查找区间左右端点为left与right,这两个点其实开闭均可,一般统一用闭合。问题二,中位数中位数有上位中位数和下位中位数之分,如序列1234原创 2020-09-29 14:11:30 · 2247 阅读 · 2 评论 -
分治法——整数划分问题
分治法——整数划分问题问题:将给定正整数n表示成一系列正整数之和n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。求正整数n的不同划分个数p(n)。思路分析——添加自变量,寻找递归关系有些问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。而有些问题递归关系却不明显。在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系:n = 1 或者m =1,这种情况下,原创 2020-09-28 19:53:39 · 980 阅读 · 0 评论 -
分治法——全排列问题
分治法——全排列问题分治法——可分可解可合独立分治法就是分而治之,其实现需要以下若干先决条件:可分:问题可以划分为若干规模相近的子问题(平衡子问题:子问题划分规模相近)可解:子问题可以求解可合并:求解后的子问题可以合并为原问题的解(覆盖原问题的所有情形)独立:子问题之间互相独立,没有重复(有重复一般使用动态规划)分治法可以使用递归实现也可以使用非递归实现,其中递归法有着大致类似的模板,非递归法则没有明确写法。分治法的递归模板:res dc(problem p){ if(|p|<原创 2020-09-28 15:37:49 · 2572 阅读 · 1 评论 -
蛮力法——平面最近点对问题与字符串匹配问题
蛮力法——平面最近点对问题与字符串匹配问题平面最近点对问题问题:找出一个包含n个点的集合中距离最近的两个点。暴力法求解所有点对之间的最近距离,为了避免同一点对计算两次,可以只考虑i<j的点对(P**i , P**j) 。//蛮力法求解平面中距离最近的两点//输入:待返回下标结果数组res,点集横纵坐标double数组x,y,数组大小n//输出:两个最近点的下标void closestPoints(int *res,double *x,double *y,int n){ double原创 2020-09-27 21:18:34 · 394 阅读 · 0 评论 -
蛮力法——排序问题
蛮力法——排序问题蛮力法就是暴力法,指基于问题所描述的内容直接建立算法求解。问题:给定一个可排序的n个元素序列(数字、字符 或字符串),对它们按照非降序方式重新排列。扫描排序扫描排序的基本思想:从左到右遍历序列找到最小的数字,和序列的首个位置交换,然后将序列的首个位置移出序列重复直到完成排序代码实现://用选择法对给定数组排序//输入:一个可排序数组A[0..n-1]//输出:升序排序的数组A[0..n-1]void selectSort(int *a,int n){原创 2020-09-24 08:55:47 · 732 阅读 · 0 评论 -
欧几里得算法求最大公约数
欧几里得算法求最大公约数欧几里得算法是一个非常经典的算法,它的基本步骤如下:给定两正整数m,n选取其中较小的数,假定为m若n%m非0,即存在余数,将n和m中较大的数n替换为余数,返回步骤2若n%m为0,则最大公约数为m直观上看,可以这样理解欧几里得算法:“辗转相除法的演示动画: 两条线段长分别可表示252和105,则其中每一小分段长代表最大公约数21。如动画所示,只要辗转地从大数中减去小数,直到其中一段的长度为0,此时剩下的一条线段的长度就是252和105的最大公因数。”“算法的演原创 2020-09-14 20:30:12 · 8347 阅读 · 2 评论