![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法分析课作业
文章平均质量分 64
文亘习丶
这个作者很懒,什么都没留下…
展开
-
算法分析与设计——图的M着色问题
文章目录一、问题二、解析三、设计四、分析五、代码一、问题给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”二、解析三、设计四、分析五、代码#include<iostream>#include<vector>#include<cmath>#include<time.h>#include<cstring>#in原创 2021-06-23 05:56:58 · 329 阅读 · 0 评论 -
算法分析与设计——哈夫曼树
文章目录一、问题二、解析三、设计四、分析五、代码一、问题二、解析哈夫曼树构造:根据给定的n个权值{w1,w2,…,wn}构成二叉树集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树为空.在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和.在F中删除这两棵树,同时将新的二叉树加入F中.重复2、3,直到F只含有一棵树为止.(得到哈夫曼树)三、设计void SetHuffTree原创 2021-06-23 05:44:35 · 812 阅读 · 0 评论 -
算法分析与设计——过载问题(0-1背包)
文章目录一、问题二、解析三、设计四、分析五、代码一、问题二、解析有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品都只有一件。令dp[i][j]来表示前i件物品装入容量为j的背包所能得到的最大总价值。对于dp[i][j]来说,i指的是前i件物品,j指的是还剩下多少背包空间。对于一件物品,我们有放进或者不放进背包两种选择:假如我们放进背包,f[i][j] = f[i - 1][j - weight原创 2021-06-23 05:30:58 · 164 阅读 · 0 评论 -
算法分析与设计——矩阵链乘法
文章目录一、问题二、解析三、设计四、分析五、代码一、问题二、解析三、设计设A[i][j] 为 ∏jk = ia[k]设cnt[i][j]为A[i][j]的最少运算次数cnt[i][j] = min(cnt[i][k] + cnt[k + 1][j] + p[i - 1] * p[k] * p[j]) for (int len = 2; len <= n; ++len) { for (int i = 1; i + len - 1 <= n; ++i原创 2021-06-23 05:15:48 · 278 阅读 · 0 评论 -
算法分析与设计——字符串编辑距离问题
文章目录一、问题二、解析三、设计四、分析五、代码一、问题给定一个源串和目标串,能够对源串进行如下操作:在任意位置上插入一个字符;替换任意字符;删除任意字符。写一个程序,实现返回最小操作次数,使得对源串进行上述这些操作后等于目标串(源串和目标串的长度都小于2000)二、解析假设目标串为s1,源串为s2,如果把源串s2的每个字符一个个对照目标串s1进行操作拟合,若 认 为s1的第i个字符为s1[i],s2的第j个字符为s2[j],那么随着i和j的分别推移,可以把思路分成以下几种情原创 2021-06-23 04:51:46 · 411 阅读 · 0 评论 -
算法分析与设计——LCS最长公共子串问题和完全背包问题
文章目录一、问题二、解析三、设计四、分析五、代码一、问题LCS(最长公共子序列问题):给定序列X=<x1,x2,…,xm>, Y=<y1,y2,…,yj>,求X和Y的最长公共子序列基础背包问题:一个旅行者随身携带一个背包,可以放入n种物品,其中物品j的重量和价值分别是wj,vj,j=1,2,…,n,如果背包最大重量限制是b,怎么选择放入背包的物品使得背包的价值最大?二、解析LCS(最长公共子序列问题):综上,状态转移方程如下:如果xi=yi,c[i][j] c[i原创 2021-06-22 00:39:37 · 209 阅读 · 0 评论 -
算法分析与设计——投资问题(动态规划)
文章目录一、问题二、解析三、设计四、分析五、代码一、问题设有m万元,n项投资,函数f(x)表示将x万元投入第i项项目所产生的效益,i=1,2,3……,n,问:如何分配这m元钱,使得投资总效益最高?即:目标函数max{f1(x1)+ f2(x2)+…+ fn(xn)},约束条件x1+x2+…+xn=m,x∈N实例:二、解析设dp[i][t]为前i个项目总共花费t元能得到的最大收益,那么假设分配给第i个项目k元取得了最大收益,则实际上前i-1个项目共得到了j=t-k元,所以dp[i][t]的最原创 2021-06-21 02:52:49 · 2535 阅读 · 0 评论 -
算法分析与设计——选第k小的数
文章目录一、问题二、解析三、设计四、分析五、代码一、问题设L是n个元素的集合,从L中选取第k小的元素,即L按从小到大排序之后,排在第k个位置的元素,其中1<=k<=n,二、解析随意取一个子分治过程如下:假设m*表示当前集合中从小到大排列的中位数,|s| 表示s集合中的元素个数,则:若k=|s1|+1,那么此时的m*(即中位数)就是要找的第k小的数,因为按照m划分之后,比m小的有|s1|个,如果恰巧k=|s1|+1,则m*就是要找的第k小的数;若k<=|s1|,则说明第k小原创 2021-06-21 01:47:27 · 846 阅读 · 0 评论 -
算法分析与设计——最近点对问题分治算法
文章目录一、问题二、解析三、设计四、分析五、代码一、问题最近点对问题要求在一个包含n个点的集合中,找出距离最近的两个点,本题只考虑二维平面上的最近点对问题。二、解析假设点在二维平面上以笛卡尔直角坐标系给出坐标pi(xi,yi),那么两点间的距离是标准欧几里得距离,即d(pi,pj)=sqrt((xi-xj)2+(yi-yj)2);最直接的思路是暴力求解所有点对之间的距离,找出最小的那一对,当然d(pi,pj)= d(pj,pi),而且平方根函数是单调增的,所以我们可以只计算i<j的那部分点原创 2021-04-21 14:57:52 · 943 阅读 · 0 评论 -
算法分析与设计——二分归并算法
文章目录一、问题二、解析三、设计四、分析五、代码一、问题二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k二、解析二分归并排序是一种很经典的分治思想的排序算法,过程可以分为二分分解和归并两个过程:二分:为了让一个长序列有序,可以将长序列从中间拆分成两个子序列,让两个子序列有序,两个子序列又可以单独看成一个长序列,每个都可以继续分成两个子序列,以此类推,不断用同一个规则缩小子序列的长度,直到最后子序列只有两个数时进行比较排序,使其有序;归并:回溯上一个拆分的过程,把有序的原创 2021-04-09 19:38:49 · 843 阅读 · 0 评论 -
算法分析与设计——线性检索和二分检索算法
文章目录一、问题二、解析三、设计四、分析五、代码一、问题写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.二、解析因为条件给出的是有序数组,所以检索思路相对清晰;第一种方法可以暴力检索,以线性的思路根据下标增长从头到尾搜索一遍,找到x即输出下标;第二种方法是二分查找,因为数组有序,所以根据大小进行二分比较是可行的。三、设计方法一:从下标0开始遍历数组,不断对比当前下标对应的值和需要找的x,若有则输出下标j,没有则最后输出原创 2021-03-28 03:48:48 · 442 阅读 · 0 评论 -
算法分析与设计——任意两点间最短路Floyd算法
文章目录一、问题二、解析三、设计四、分析五、代码一、问题用Floyd算法求解下图各个顶点的最短距离,给出距离矩阵(顶点之间的最短距离矩阵)二、解析要求得任意两点之间的最短路,可以采用松弛操作,对在i和j之间的所有其他点进行一次松弛,即访问从i到j的所有可能路径,把i到经过若干个编号不超过k的点再到j的多种路径做对比,更短的路径保留。这本质上是一种动态规划,把从i到j的最短路问题分成:i经过编号不超过k-1的节点到j,以及i先到k再到j,两个子问题。这样k不断加大,就可以不断的通过子问题找到原创 2021-03-15 20:46:02 · 1004 阅读 · 0 评论 -
算法分析与设计——单源正权最短路Dijkstra算法
文章目录一、问题二、解析三、设计四、分析五、代码一、问题对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。二、解析由顶点a到顶点h可以看出这是在一个有向图内从一个固定源点出发,找到其他任意一点的最短距离的问题,即单源最短路问题。可以把a到h的各个顶点映射成1-8的编号,(x, y, z)表示从x出发到y的距离是z的边。维护一个记录a到任意一点i的最短路径的数组,初始默认都是无穷远。从a点开始,找到它出边到达的点中离a最近的一个点x去访问,并标记x,再以此从x点往它的出边到达的原创 2021-03-15 16:28:34 · 163 阅读 · 0 评论 -
算法分析与设计——最小生成树Kruskal算法
文章目录一、问题二、解析三、设计四、分析五、实例六、代码一、问题给定一张带边权的无向图G=(V,E),n=|V|,m=|E|。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为一颗生成树,而其中边权之和最小的生成树则是该无向图G的最小生成树,应该如何得到一张图G的最小生成树?二、解析首先,任意一颗最小生成树一定包含无向图中权值最小的边。否则通过反证法,最小生成树不含权值最小的边,则可以把这条最小边加到树上,n点n条边必定会构成一个环,把该环上任意另一条边去掉,剩下的仍是联通的生成树,且树原创 2021-03-14 17:27:56 · 702 阅读 · 0 评论 -
算法分析与设计——最小生成树Prim算法
文章目录一、问题二、解析三、设计四、分析五、实例六、代码一、问题给定一张带边权的无向图G=(V,E),n=|V|,m=|E|。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为一颗生成树,而其中边权之和最小的生成树则是该无向图G的最小生成树,应该如何得到一张图G的最小生成树?二、解析首先,任意一颗最小生成树一定包含无向图中权值最小的边。否则通过反证法,最小生成树不含权值最小的边,则可以把这条最小边加到树上,n点n条边必定会构成一个环,把该环上任意另一条边去掉,剩下的仍是联通的生成树,且树原创 2021-03-14 16:40:44 · 1152 阅读 · 0 评论