- 博客(14)
- 收藏
- 关注
原创 图的m着色问题
1、问题图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2、解析可以通过回溯的方法,不断的为每一个节点着色,在前面n-1个节点都合法的着色之后,开始对第n个节点进行着色,这时候枚举可用的m个颜色,通过和第n个节点相邻的节点的颜色,来判断这个颜色是否合法,如果找到那么一种颜色使得第n个节点能够着色,那么说明m种颜色的方案是可行的。3、设计4、分析...
2020-06-16 21:08:44
325
原创 最优前缀编码
1、问题2、解析构造最优前缀码的贪心算法,就是哈夫曼算法(Huffman)3、设计4、分析O(nlogn)频率排序;for 循环 O(n),插入操作 O(logn),算法时间复杂度是 O(nlogn)
2020-06-16 20:51:26
365
原创 相容问题
1、问题相容问题,解析时给出其他几种贪心策略(如按开始时间从小到大、每个活动时间的占用时间等),并给出这些贪心策略无法实现最优的反例。有 n 项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。2、解析方法一、按照活动截止时间从小到大排序活动13102546789s i12(4>2与活动1不相容)2(4>2与活动1不相容)3(4>3与活动1不相容)4
2020-06-16 19:05:39
364
原创 矩阵链乘法
1、问题2、解析Ai…j:表示矩阵链相乘的子问题Ai,Ai+1…Aj; M[i…j]:表示得到乘积Ai…j所用的最少基本运算次数;假定最后一次相乘发生在矩阵链Ai…kAk+1…j之间m[i,j]=min{m[i,k]+m[k+1,j]+Pi=1PkPj}满足优化原则。也就是说,m[i,j]最小值时,m[i,k],m[k+1,j]也是最小的。对于矩阵链乘法问题,将所有对于1≤i≤j≤n确定A i A i+1 …A j 的最小代价括号方案作为子问题。令m[i,j]表示计算矩阵A i,j 所需要的标量
2020-05-27 00:00:28
195
原创 投资问题
1、问题设m元钱,n项投资,函数f;(x) 表示将x元投入第i项项目所产生的效益,i=1,2,…,n.如何分配这m元钱,使得投资的总效益最高?2、解析3、设计4、分析复杂度:W(n,m) =O(nm ^2)
2020-05-26 23:33:48
203
原创 选第k小元素
1、问题利用分治策略,在n个不同元素中找出第k个最小元素2、解析将数组五个一组划分,并计算出每组数的中位数。然后把各组中位数的中位数找出。统计数组中小于中位数的个数j,有三种情况。1、j=k,则中位数就是要查询的数。2、j>k,则第k个元素在区间j+1~n。3、j<k,则第k个元素在区间1~j。。3、设计int FindMinK(int data[], int l, int r, int k){ int m = data[l + k - 1], t = 0; int i,
2020-05-26 23:14:49
256
原创 分治法解最近对问题
1、问题在数组P中存储平面上的n>=2个点,并且按照这些点的x轴坐标升序排列,数组Q中存储与P相同的点,只是它按照这些点的y 轴坐标升序排序,得出最近点之间的欧几里得距离。2、解析1、分解对所有的点按照x坐标(或者y)从小到大排序(排序方法时间复杂度O(nlogn) O(nlogn)O(nlogn))。根据下标进行分割,使得点集分为两个集合。2、解决递归的寻找两个集合中的最近点对。取两个集合最近点对中的最小值3、合并最近距离不一定存在于两个集合中,可能一个点在集合A,一个点在集合B
2020-05-26 23:00:56
207
原创 二分归并排序
1、问题对n个不同的数构成的数组A[1…n]进行二分归并排序,其中n=2^k。2、解析对于每一个待排序的数组,拆分成左右两端,分别对左右两段进行排序,对于已经有序的两个数组把他们合并起来。3、设计void Merge(int *arr, int *temp, int start, int mid, int end){ int left_start = start; int left_end = mid; int right_start = mid + 1; int right_end
2020-05-26 22:39:12
84
原创 两种检索算法
1、问题写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.2、解析顺序查找:顺序查找是一种最简单和最基本的查找方法,它从顺序表的一端开始,依次将每个元素的关键字同给定值 K 进行比较,直到相等或比较完毕还未找到。二分查找:将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半
2020-05-26 22:12:56
212
原创 Dijkstra算法求最短路径
1、问题对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。2、解析Dijkstra算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。3、设计for (i = 1; i <= n - 1; i++) { min = inf; for (j = 1; j <= n; j++) { if (book[j] == 0 && d[j] < min) { min
2020-05-26 21:37:27
835
原创 Floyd算法求解各个顶点的最短距离
1、问题用Floyd算法求解下图各个顶点的最短距离,写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)。2、解析Floyd算法是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。3、设计//Floyd核心语句 for (k = 1; k <= n; k++) for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) if (e[i][
2020-05-26 21:12:48
573
原创 采用Kruskal算法构造最小生成树
1、问题画出采用Kruskal算法构造最小生成树的过程,并按实验报告模板编写算法。2、解析对于所有的边,每次取一条最短的边(不能重复取),判断它的两个端点是否已经在一个连通块中了(并查集维护),如果是,那么取下一条边;如果没在一个连通块中,则把两个连通块(不一定是两个点)连在一起,答案加上当前边的长度。直到所有的点都在一个连通块中结束。3、设计4、分析时间复杂度:O(nlogn) (n为边数)...
2020-05-26 01:39:04
1109
原创 prim算法构造最小生成树
1、问题画出采用Prim算法构造最小生成树的过程,并按实验报告模板编写算法解析2、解析在带权连通图中,每次找与之连线权值最小的顶点,将该点加入最小生成树集合中并构造,直到最后得到一颗最小生成树。3、设计void Prim(int graph[][MAX], int n){ int lowcost[MAX]; int mst[MAX]; int i, j, min, minid, sum = 0; for (i = 2; i <= n; i++) { lowcost[i] =
2020-05-26 00:55:56
1350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人