算法分析与设计
CRMLF
这个作者很懒,什么都没留下…
展开
-
最优前缀的贪心算法(第十一次作业)
1.问题 构造最优前缀的贪心算法,即哈夫曼算法(Huffman) 2.解析 我们可以用一个数据结构维护所有数字的最小两个值,每次取最小的两个值就是序列,把这两个值累加到结果上,那么结果就是WPL 3.设计 priority_queue<int,vector,greater >cmp; for(int i=0 ; i<n; ++i){原创 2021-06-23 21:40:34 · 150 阅读 · 2 评论 -
装载问题(0-1背包问题)(第十次作业)
1.问题 整数规划问题,0-1 背包问题 2.解析 思路:轻者先装,直到再装任何集装箱将使轮船载重量超过 C 时停止 定理:对于任何正整数 k,算法(轻者先装)对 k 个集装箱的实例得到 最优解。 3.设计 for(int i = 0; i < n; i++){ for(int j = m; j&n原创 2021-06-23 21:37:37 · 130 阅读 · 0 评论 -
矩阵链的乘法(第八次作业)
1.问题 设A1,A2,…An为n个矩阵的序列,其中Ai为Pi-1×Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,…,Pn>给出 给定向量P,确定一种乘法次序,使得基本运算的总次数达到最小 例如P=<40,20,30,50>,则A1:40×20,A2:20×30,A3:30×50 (1) (A1A2)A3=40×20×30+40×30×50=84000 (2)A1(A2A3)=40×20×50+20×30×50=190000 2.解析 蛮力法 枚举所有可能的乘法次序,针对每种次原创 2021-06-23 21:33:32 · 176 阅读 · 0 评论 -
二分归并排序(第四次作业)
1.问题 二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。 2.解析 二分归并排序是经典的分治算法,分而治之,将长度为n的数组不断划分成n/2的子数组,即将n规模的问题转化成为了n/2规模的子问题,不断划分,当问题规模为1时(长度为1的数组本身就是有序的),将每一个长度为1的子序列进行归并,不断归并就能够实现将长度为n/2的数组归并得到长度为n的数组,实现排序。 3.设计 void merge(int a[],int left ,int&n原创 2021-06-23 21:25:20 · 140 阅读 · 0 评论 -
LCS算法和背包算法(第九次作业)
1.问题 LCS算法和背包算法,特别要求举例时采用不同于讲义的数据进行推导。 2.解析 Xi=<x1,x2,…,xi> Yj=<y1,y2,…,yj> Zk=<z1,z2,…,zk> 如果Zk是Xi和Yj的最长公共子序列 (1)xi = yj,那么zk = xi = yj,Zk-1是Xi-1和Yj-1的最长公共子序列 (2)xi ≠ yj,那么zk ≠ xi,Zk-1是Xi-1和Yj的最长公共子序列 (3)xi ≠ yj,那么zk ≠ yi,Zk-1是Xi和Yj-1的最长原创 2021-06-23 21:16:48 · 82 阅读 · 0 评论 -
投资问题(第七次作业)
1.问题 设m 万元钱,n 项投资,函数 fi(x)表示将 x 万元投入第 i 项项目所产 生的效益,i=1,2,…,n.问:如何分配这 m 元钱,使得投资的总效益最高? 2.解析 设Fk(x)表示x万元投给前k个项目的最大效益,k=1,2,…,n, x=1,2,…,m。 设给第k个项目投资xk万元,故投资给前k-1的项目资金为(x-xk)万元 递推方程:Fk(x)=max{ fk(xk)+ Fk-1(x-xk)},k=2,3,…,n 边界条件:F1=f1(x),Fk(0)=0,k=1,2,…,n x F1原创 2021-06-23 21:13:34 · 108 阅读 · 0 评论 -
最近对问题(第五次作业)
1.问题 最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点。假设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面的n个点。 2.解析 1.暴力算法,遍历每一个点对的距离求出最小值 2.分治算法,根据中位点二分左右区间得到最短距离,然后对区间[mid - d, mid + d]求最短距离,两值取小,不断递归。 对于最近对问题最容易最直接想到的就是蛮力算法,我们可以得到每两个点的距离求最小值,但这样的时间复杂度较高。我们可以采用分治的想法解决这一问题,将复杂难问题转化为简单问原创 2021-06-23 21:11:00 · 170 阅读 · 0 评论 -
查找算法(第三次作业)
1.问题 写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。 2.解析 暴力查找,for循环遍历完一次数组 二分查找,每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为0 3.设计 暴力查找: int find(int n,int m){ int an原创 2021-06-23 21:07:57 · 177 阅读 · 0 评论 -
选第k小元素:特定分治策略(第六次作业)
1、问题 在一个数组S中查找第k小的元素并输出。 2、解析 3、设计 import java.util.Arrays; /** * @Description * @Author ZhengLing * @Date 2021/04/19 15:15 */ public class SmallK { static int r = 5; private static int select(int[] A, int low, int high, int k) { i原创 2021-04-19 16:09:16 · 116 阅读 · 0 评论 -
最近对问题(第五次作业)
1、问题 蛮力算法解决最近对问题 2、解析 用S中个点坐标的中位数作为分割点,则会得到一个平衡的分割点m,使得子集S1,S2中有个数大致相同的点。 选取垂直线x=c(中位线)来作为分割线。 递归地求出S1和S2中的最近对,假设D1、D2是最近距离。 距离最近的点,可能在线的俩边,所以,我们需要在以x=c为对称的、宽度为2D的(D为D1、D2中的最小值)的垂直带中。 在该范围中递归得出最近距离。 3、设计 import java.util.Scanner; /** * @Description 最近对原创 2021-04-12 16:24:21 · 69 阅读 · 0 评论 -
二分归并排序(第四次作业)
问题 二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k 解析 归并排序 是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 设计 public static int[] mergeSort(int[] numArr) { if (numA原创 2021-03-29 15:53:55 · 87 阅读 · 0 评论 -
MST的Prim与Kruskal算法(第一次作业)
一.问题 举一个实例,画出采用Prim算法构造最小生成树的过程,并按实验报告模板编写算法。 举一个实例,画出采用Kruskal算法构造最小生成树的过程,并按实验报告模板编写算法。 二.解析 Prim算法图解 Kruskal算法图解 3.设计 Prim算法 /** * @Description MST的Prim算法 * @Author ZhengLing * @Date 2021/03/15 21:36 */ import java.util.Arrays; import java.util.原创 2021-03-15 21:48:41 · 189 阅读 · 0 评论