算法
总结一些重要的算法
WWWWW~~
这个作者很懒,什么都没留下…
展开
-
回溯法求解图的m着色问题
一、求解图的m着色问题1、问题描述2、问题分析第1步: 问题的状态表示及解空间树结构第2步:确定结点的扩展搜索规则第3步:约束条件——剪枝函数第4步:以深度优先方式搜索解空间树,并用剪枝策略避免无效搜索。第5步 算法设计(递归子集树)采用递归框架第5步 算法设计(迭代回溯)3、算法分析...原创 2020-05-12 10:42:41 · 4117 阅读 · 0 评论 -
回溯法基本知识
一、回溯法概述回溯法和分枝限界法都是基于搜索的算法,是对枚举法的改进,避免无效的搜索。回溯法实际上是一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”(即回退),尝试别的路径。 回溯法有“通用解题法”之称。 它适合于解一些组合数较大的最优化问题。二、问题的解空间1、解空间概念一个问题可能解的表示方式和它相应的解释隐含了解空间及其大小。比如:0/1背包问题可能解的表示为一个向量{x1, x2, …, xn},其中xi={0,1}则当n=3时原创 2020-05-12 10:36:47 · 14868 阅读 · 5 评论 -
贪心法求解最小生成树问题
一、最小生成树1、问题描述2、Prim算法(1)(2)算法(3)算法设计(4)贪心选择性质证明3、Kruskal算法(1)(2)算法(3)算法实现(4)Kruskal算法正确性证明原创 2020-05-09 16:27:21 · 440 阅读 · 0 评论 -
贪心法求解Dijkstra算法(单源最短路径)
一、Dijkstra算法(单源最短路径)1、问题描述给定带权有向图G = (V, E),其中每条边的权是非负实数。另外,还给定V中的一个顶点v,称为源点。现在要计算从源到所有其它各顶点的最短路径长度,假设从源可以到达任何一个顶点。这里路径的长度是指路径上各边权之和。这个问题通常称为单源最短路径问题。输入:多组测试数据。每组测试数据的第一行输入图G中顶点的个数n( n<1000);后续n行n列输入图G的权值矩阵C,其中第i行第j列的值表示从第i个顶点到第j个顶点的有向边的权值,如果为-1表示从第i原创 2020-05-09 16:14:43 · 1509 阅读 · 0 评论 -
贪心法求解Huffman编码
一、Huffman编码1、问题描述设要编码的字符集为{d1, d2, …, dn},它们出现的频率为{w1, w2, …, wn},应用哈夫曼树构造最优的不等长的由0、1构成的编码方案。2、问题求解3、举例4、算法设计int n;struct HTreeNode //哈夫曼树结点类型{ char data; //字符 int weight; //权值 int parent; //双亲的位置 int lchild; //左孩子的位置原创 2020-05-09 16:11:42 · 928 阅读 · 0 评论 -
贪心法求解部分背包问题
一、求解部分背包问题1、问题描述2、贪心策略选取(1)价值最大①选择价值最大的物品,因为这可以尽可能快地增加背包的总价值。②背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。(2)重量最轻①选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。②背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大。(3)单位重量价值最大选择单位重量价值最大的物品,在背包价值增长和背包容量消耗两者之间寻找平衡。贪心策略:选择单位重量价值最大的原创 2020-05-09 16:04:32 · 1787 阅读 · 1 评论 -
用贪心法解决活动安排问题
一、 求解活动安排问题1、问题描述原创 2020-05-09 15:56:37 · 3645 阅读 · 0 评论 -
用贪心法解决TSP问题
一、求解TSP问题1、问题描述TSP问题是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。2、最近邻点策略(1)思想:从某城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。(2)算法设计设图G有n个顶点,边上的代价存储在二维数组w[n][n]中,集合V存储图的顶点,集合P存储经过的边,最近邻点策略求解TSP问题的算法如下:(3)算法原创 2020-05-09 15:42:20 · 5950 阅读 · 0 评论 -
贪心法解决图着色问题
一、求解图着色问题1、起源①地图的着色----用不同的颜色为地图着色,使得地图上每个区域着一种颜色,且相邻区域颜色不同。②四色猜想一任何一张地图只用四种颜色就能使具有共同边界的区域着上不同的颜色。2、问题描述(1)起源如果将地图上的每个区域看做"图”中的一个顶点,把相邻的区域用一条边连接,那么图着色问题就变成了顶点涂色问题了。(2)图着色问题(3)3、问题分析(1)任选一顶点着颜色1,在图中寻找尽可能多的顶点用颜色1着色;(2)任选未被颜色1着色的顶点,用颜色2着色,在图中寻找尽可原创 2020-05-09 15:33:41 · 10069 阅读 · 0 评论 -
贪心法概述
一、贪心法概述1、贪心算法是一个分阶段决策过程, 在每个局部阶段,贪心法都做出一个当前最优的局部决策,并期望通过每次所做的局部最优决策产生一个全局最优解。2、贪心法的基本思路是在对问题求解时总是做出在当前看来是最好的选择,也就是说贪心法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优选择。这种局部最优选择并不总能获得全局最优解(Optimal Solution),但通常能获得近似最优解。...原创 2020-05-09 15:20:26 · 5017 阅读 · 0 评论 -
动态规划法求解矩阵链乘问题
一、求解矩阵链乘问题1、问题描述2、穷举法如此之大的解空间是无法用枚举方法求出最优解的!3、求解最优矩阵链乘问题的Dynamic Programming算法(1)第1步 问题结构分析(2)第2步 建立动态规划函数...原创 2020-04-19 22:15:49 · 211 阅读 · 0 评论 -
动态规划法求解0/1背包问题
一、求解0/1背包问题1、问题描述有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为C的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品的总重量不能超过背包的容量,求具有最大的价值的装载方案。2、蛮力法求解3、证明0/1背包问题满足最优性原理4、问题分析(1)第1步 问题结构分...原创 2020-04-19 21:39:14 · 13587 阅读 · 6 评论 -
动态规划法求解最长递增子序列问题
一、求解最长递增子序列问题1、问题描述给定一个无序的整数序列a[0…n-1],求其中最长递增子序列的长度。例如,a[]={2,1,5,3,6,4,8,9,7},n=9,其最长递增子序列为{1,3,4,8,9},结果为5。例如,a[]={5, 2, 8, 6, 3, 6, 9, 7},n=8,其最长递增子序列分别是{2, 3, 6, 9}和{2, 3, 6, 7},结果为4。2、问题分...原创 2020-04-19 21:20:34 · 3725 阅读 · 0 评论 -
动态规划法求解最长公共子序列问题
一、求解最长公共子序列问题1、问题描述2、问题分析(1)划分子问题(2)确定动态规划函数(3)填表(4)回溯法求最优解算法原创 2020-04-19 21:08:07 · 340 阅读 · 0 评论 -
用动态规划法求解TSP问题
一、求解TSP问题1、问题描述TSP问题(担货郎问题,旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短各个城市间的距离可以用代价矩阵来表示。2、【应用】例如:校车怎样以最短的路线行走而接送到所有学生?报纸和牛奶的配送路线怎样最优?循环旅游怎样选取才能实现开支最少?公司视察子公司怎样出差更高效?3、【蛮力法求解】用蛮力法解决T...原创 2020-04-19 18:04:30 · 9235 阅读 · 2 评论 -
用动态规划法求解数塔问题(三角形最小路径)
一、求解数塔问题(三角形最小路径)1、问题描述2、递归求解(1)分析(2)问题求解(3)算法#define MAX 101int a[MAX][MAX];int n;int MaxSum(int i, int j){ if(i==n) return a[i][j]; int x = MaxSum(i+1,j); int y = MaxSum(i+1,j+1); r...原创 2020-04-19 17:32:08 · 2827 阅读 · 0 评论 -
动态规划法的基本知识
一、动态规划方法相关概念1、20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优性原理(principle of optimality),同时,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决多阶段决策问题的优化方法------动态规划法。比如:...原创 2020-04-19 16:57:13 · 3904 阅读 · 0 评论 -
用分治法找俩个等长数组的中位数问题
1、问题描述设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数。找出X和Y的2n个数的中位数。 利用分治策略试设计一个O (log n)时间的算法求出这2n个数的中位数。由文件input.txt提供输入数据。文件的第1行中有1个正整n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。程序运行结束时,将计算出的中位数...原创 2020-04-19 15:57:38 · 1962 阅读 · 0 评论 -
用分治法解决青蛙跳问题(斐波那契数列)
1、问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?(先后次序不同算不同的结果)2、基本思想1)如果只有1级台阶,那显然只有一种跳法2)如果有2级台阶,那么就有2种跳法,一种是分2次跳。每次跳1级,另一种就是一次跳2级3)如果台阶级数大于2,设为n的话,这时我们把n级台阶时的跳法看成n的函数,记为f(n)寻找问题与子问题之前的关系:...原创 2020-03-28 22:27:01 · 673 阅读 · 0 评论 -
数组循环p个位置
1、问题描述设将n (n>1) 个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p (0<p<n) 个位置,即将R中的数据序列由(x0, x1,……,xn-1)变换为(xp,xp+1,……,xn-1,x0,x1,……,xp-1)。2、算法基本思想先将这n个元素的数据序列(x0, x1,…xp,xp+1,……,xn-1) 原地...原创 2020-03-28 22:10:47 · 202 阅读 · 0 评论 -
找数组中未出现的最小正整数
1、 问题描述给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。2、 算法思想要求算法时间上尽可能高效,因此采用空间换时间的办法。分配一个用于标记的数组B[n],用来记录A中是否出现了1~n中的正整数,B[0]对应正整数1,B[...原创 2020-03-28 22:01:21 · 4426 阅读 · 0 评论 -
用分治法求解最近点对问题
一、求解最近点对问题【问题描述】给定平面S上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。(1)蛮力法求解最近点对问题double ClosestPoints(vector<Point> a,int leftindex,int rightindex) { int i,j; double d,mindist =INF; for (i=le...原创 2020-03-28 21:32:49 · 6384 阅读 · 1 评论 -
用分治法求解组合问题(最大子段和问题、棋盘覆盖问题)
一、求解最大子段和问题(1)问题描述(2)蛮力法求解long maxSubSum1(int a[],int n){ int i,j,k; long maxSum=a[0],thisSum; for (i=0;i<n;i++) //两重循环穷举所有的连续子序列 { for (j=i;j<n;j++) { thisSum=0; ...原创 2020-03-28 21:12:23 · 1758 阅读 · 0 评论 -
用分治法求解查找问题(折半查找、查找第k小元素)
一、折半查找针对的是有序的数组(1)基本思想(2)算法int BinSearch(int a[],int low,int high,int k) //拆半查找算法{ int mid; if (low<=high) //当前区间存在元素时 { mid=(low+high)/2; //求查找区间的中间位置 if (a[mid]==k) //找到后返回其物理下标...原创 2020-03-28 20:48:41 · 2968 阅读 · 0 评论 -
用分治法来解决排序问题(快速排序,归并排序)
一、快速排序(1)基本思想在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终位置后,整个数据序列被基准值分割成两个子序列,所有小于基准值的元素放置在前子序列中,所有大于基准值的元素放置在后子序列中,并把基准值排在这两个子序列的中间,这个过程称作划分。然后对两个子序列分别重复上述过程,直至每个子序列内只有一个记录或空为止。关键在于划分(2)算法int ...原创 2020-03-28 20:31:55 · 4178 阅读 · 0 评论 -
分治法的基本知识
一、分治法的设计思想将一个难以直接求解的大问题,分解成若干个规模较小的子问题,递归地求解这些子问题,然后合并子问题的解得到原问题的解。注意:1.子问题与原问题形式相同2.子问题可以彼此独立的求解,即子问题之间不包含公共的子问题3.子问题的规模缩小到一定程度就可以容易地直接求解二、分治法的求解过程划分子问题:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。求解...原创 2020-03-28 19:16:54 · 3470 阅读 · 0 评论 -
算法基础知识
一、算法的定义算法:对特定问题求解步骤的一种描述,是为解决一个或一类问题给出的一个确定的、有限长的操作序列。二、算法与程序的区别与联系区别:程序:与某种编程语言有关,能直接在机器上运行。算法:与特定的语言无关,可用任何语言实现 ,甚至可以用自然语言实现。联系:程序=算法+数据结构三、算法的基本特点1)输入:有零个或多个输入。2)输出:有一个或多个输出。3)有穷性:在执行有穷步...原创 2020-03-28 19:07:05 · 5747 阅读 · 0 评论