
算法分析与设计
文章平均质量分 52
Tryna1
这个作者很懒,什么都没留下…
展开
-
算法分析与设计 实验12图的m着色问题
1、问题:图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2、解析:3、设计(核心伪代码):bool judge(int x) //判断x结点染色方案是否正确{ for (int i = 1; i < x; i++) if (mp[i][x] && color[x] == color[i])//两结点相连,且颜色一样,则原创 2021-06-03 16:09:15 · 413 阅读 · 0 评论 -
算法分析与设计 实验11 最优前缀码
1、问题:2、解析:3、设计(核心伪代码):void CreateHuffmanTree(HuffmanTree T) {//构造哈夫曼树,T[m-1]为其根结点 int i, p1, p2; InitHuffmanTree(T); InputWeight(T); for (i = n; i < m; i++) { SelectMin(T, i - 1, &p1, &p2); T[p1].parent = T[原创 2021-05-31 08:40:36 · 221 阅读 · 0 评论 -
算法分析与设计 实验10 01背包问题
1、问题:2、解析:3、设计(核心伪代码):①、确认子问题和状态 01背包问题需要求解的就是,为了体积VVV的背包中物体总价值最大化,NNN件物品中第iii件应该放入背包中吗?(其中每个物品最多只能放一件) 为此,我们定义一个二维数组,其中每个元素代表一个状态,即前i个物体中若干个放入体积为VVV背包中最大价值。数组为:f[N][V]f[N][V]f[N][V],其中f[i][j]f[i][j]f[i][j]表示前i件中若干个物品放入体积为jjj的背包中的最大价值。②、初始状态 初始原创 2021-05-17 15:23:43 · 493 阅读 · 0 评论 -
算法分析与设计 实验9 LCS问题和背包问题
1、问题:LCS算法和背包算法,特别要求举例时采用不同于讲义的数据进行推导。2、解析:LCS算法:背包算法:设价格数组v = {8, 10, 6, 3, 7, 2};重量数组w = {4, 6, 2, 2, 5, 1}背包容量为12时对应的dp数组3、设计(核心伪代码):LCS: for(i=1;i<=lena;++i) { for(j=1;j<=lenb;++j) {原创 2021-05-10 16:30:25 · 275 阅读 · 0 评论 -
算法分析与设计 实验8 矩阵链乘法
1、问题:2、解析:举个例子:3、设计(核心伪代码): for (int i = 1; i <= mm; i++){ for (int j = 0; j <= money; j++){ F[i][j] = 0; m[i][j] = 0; for (int k = 0; k <= j; k++){ if (F[i][j] < f[i][k] + F原创 2021-04-29 21:39:46 · 197 阅读 · 0 评论 -
算法分析与设计 实验7 投资问题
1、问题:设m元钱,n项投资,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,…,n。问:如何分配这m元钱,使得投资的总效益最高?2、解析:1、问题分析假设分配给第i个项目的钱数是xi,问题描述为:目标函数:max{f1(x1)+ f2(x2)+…+ fn(xn)}约束条件:x1 +x2 +…+xn=m,xi∈N实例:这就是一个典型的背包问题2、问题拆解设Fk(x)表示x万元投给前k个项目的最大效益,k=1,2,…,n, x=1,2,…,m。设给第k个项目投资xk万原创 2021-04-25 23:41:57 · 899 阅读 · 0 评论 -
算法分析与设计 实验6 选第k小元素:特定分治策略
1、问题:设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。这里第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。利用特定分治策略选出第k小的元素。2、解析:3、设计(核心伪代码):void Closest_Pair(int left, int right, int flag) { //最近点对距离 先对x排序,flag表示禁用的点 if(left == right) return ; //只剩1个点 if(le原创 2021-04-19 16:16:59 · 258 阅读 · 0 评论 -
算法分析与设计 实验5 平面最近点对
1、问题:求平面中距离最近的两个点2、解析:可以通过枚举两两顶点来得到结果,但是时间复杂度来到了O(n2)O(n^2)O(n2),显然是很慢的,所以我们采用分治的策略来分析这个问题。这里的分治算法的主要思路是将平面上的n个点分为两个子集S1,S2。每个子集中有n/2个点,然后递归的在每个子集中求解最近点对。算法步骤:把所有的点按照横坐标排序将所有点分成左右两部分递归分别算出左右部分的最近点对,设为d1和d2求出一个点在左部分,一个点在右部分的最近点对,设为d3结果就是min(d1, d原创 2021-04-12 15:50:48 · 460 阅读 · 0 评论 -
算法分析与设计 实验4 二分归并排序
1、问题:对nnn个不同的数构成的数组A[1..n]A[1..n]A[1..n]进行排序,其中n=2kn=2^kn=2k2、解析:二分归并排序是经典的分治算法。算法的思路是将长度为n的数组不断划分成n2\frac{n}{2}2n的子数组,即将nnn规模的问题转化成为了n2\frac{n}{2}2n规模的子问题,不断划分,当问题规模为111时(长度为111的数组本身就是有序的),将每一个长度为111的子序列进行归并(归并有序表),不断归并就能够实现将长度为n2\frac{n}{2}2n的有序表归并原创 2021-03-29 15:37:10 · 255 阅读 · 0 评论 -
算法分析与设计 实验3 检索算法
1、问题:写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。2、解析:第一种检索算法就是遍历一遍这个数组,如果x在T中就输出下标,不在T中就输出j第二种检索算法就是二分,这里我们可以用c++自带的lower_bound函数,去查找第一个大于等于出现x的位置的下标3、设计(核心伪代码):For(i : 1 ~ n) If( T[i] == x) ... Index原创 2021-03-22 15:40:23 · 300 阅读 · 0 评论 -
算法分析与设计 实验2-2 Dijkstra算法
1、问题:对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。2、解析:算法思路:从已确定最短路径的节点Vi出发,找到其中权值最小的边,如果原点到Vi的权值和加Vi到Vj的权值小于已知原点到Vj的权值和,则将原点到Vi的权值和加Vi到Vj的权值作为原点到Vj的最小权和。可能不是很清楚,附上图解:3、设计(核心伪代码): d[s]=0; while(1){ int min1= inf , z = -1; for(int i=0;i<n;i++){原创 2021-03-15 16:38:51 · 247 阅读 · 0 评论 -
算法分析与设计 实验2-1Floyd算法
1、问题:用Floyd算法求解下图各个顶点的最短距离。2、解析:任意两点间的最小距离要么直接相连,要么通过另外一个点相连。用每个点去更新两两点之间的距离即可。Floyd优点是代码简单,能够求任意两点的最短路;缺点是暴力带来的时间复杂度较大,不适合用在点较多的图中。3、设计(核心伪代码):for(k : 1 ~ n){ for(i : 1 ~ n){ for(j : 1 ~ n){ e[i][j]=min(e[i][j],e[i][k]+e[k][j]); }原创 2021-03-15 16:35:21 · 170 阅读 · 0 评论 -
算法分析与设计 实验1-2Prim算法
1、问题:用Prim算法来构造最小生成树2、解析:Prim算法从任意一个顶点开始生成最小生成树,每次选择一个与当前小树最近的一个顶点,并将这个顶点加入到小树中。然后更新这棵小树到其他点的最近距离。附上图解:至此一棵最小生成树构造完成。3、设计(核心伪代码):For(i: 1 ~ n) { Minn = ∞; For(j: 1 ~ n) { If(!vis[j] && d[j] < minn) { Minn = d[j]; Index = j;原创 2021-03-08 17:11:50 · 174 阅读 · 0 评论 -
算法分析与设计 实验1-1Kruskal算法
1、问题:用Kruskal算法来实现最小生成树2、解析:Kruskal算法在找最小生成树结点之前,需要对边权重从小到大进行排序。将排序好的权重边依次加入到最小生成树中(如果加入时产生回路就跳过这条边,加入下一条边),当加入的边数为n - 1条后,就找到了这个连通图的最小生成树。对于如何判断有无回路产生,采用并查集来判断。附上选择边的过程:至此一棵最小生成树就构建完成了。3、设计(核心伪代码):Sort(E + 1, E + 1 + m);For(E : 1 ~ m) { If(find原创 2021-03-08 17:06:21 · 282 阅读 · 0 评论