1、算法分析与设计实验指导书学时数理学院算法分析与设计实验报告姓名:学号:班级:实验一 分治策略排序.3实验二 减治策略查找顺序表.5实验三 动态规划求解0/1背包问题.8实验四 贪心算法求解最短路径问题.10实验一 分治策略排序实验目的1)以排序问题为例,掌握分治法的基本设计策略;2)熟练掌握合并排序算法的实现;3)熟练掌握快速排序算法的实现;4) 理解常见的算法经验分析方法。实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1. 准备实验数据要求:编写一个函数data-generate,生成2000个在区间1,10000上的随机整数,并将这些数输出到外部文件data.txt中。这些
2、数作为本算法实验的输入数据。2. 实现合并排序算法要求:实现mergesort算法。输入:待排数据文件data.txt;输出:有序数据文件resultsMS.txt(注:建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeMS。合并排序算法(类C语言):/* 数组A 中包含待排元素;array B is a work array */TopDownMergeSort(A, B, n) TopDownSplitMerge(A, 0, n, B);/ iBegin is inclusive; iEnd is exclusive (即:AiEnd不是待排元素)TopDownSplitMe
3、rge(A, iBegin, iEnd, B) if(iEnd - iBegin 2) / 如果只有1个待排元素,返回。 return; / recursively split runs into two halves until run size = 1, / then merge them iMiddle = (iEnd + iBegin) / 2; / 划分 TopDownSplitMerge(A, iBegin, iMiddle, B); TopDownSplitMerge(A, iMiddle, iEnd, B); TopDownMerge(A, iBegin, iMiddle, i
4、End, B); / 合并;元素放到数组B中。 CopyArray(B, iBegin, iEnd, A); / copy the merged runs back to A/ left half is AiBegin : iMiddle-1/ right half is AiMiddle : iEnd-1TopDownMerge(A, iBegin, iMiddle, iEnd, B) i0 = iBegin, i1 = iMiddle; / While there are elements in the left or right runs for (j = iBegin; j iEnd;
5、 j+) / If left run head exists and is = existing right run head. if (i0 = iEnd | Ai0 = Ai1) Bj = Ai0; i0 = i0 + 1; else Bj = Ai1; i1 = i1 + 1; CopyArray(B, iBegin, iEnd, A) for(k = iBegin; k iEnd; k+) Ak = Bk;3. 实现快速排序算法要求:实现QuickSort 算法。输入:待排数据文件data.txt;输出:有序数据文件resultsQS.txt(注:建议将此排好序的数据作为实验二的算法输
6、入);程序运行时间TimeQS。快速排序算法(伪码):Procedure QuickSort(p, q)integer p, q;global n, A(1:n)if p=v repeatloop p=p-1 until A(p)=v repeatif Ipthen A(i) A(p)else exitend ifrepeatA(m)=A(p); A(p)=v;end partition实验报告:实验报告应包括以下内容:(1)题目;(2)2个算法的基本思想描述;(3)程序流程图;(4)给出data.txt、resultsMS.txt、resultsQS.txt三个数据文件;给出TimeMS、T
7、imeQS的数值结果;(5)实验分析;以表或者图的形式给出这两个算法效率的经验分析结果;并和理论分析结论进行对比。(6)说明本次实验的心得体会、经验等。如果程序未通过,应分析其原因。实验二 减治策略查找顺序表实验目的1)以顺序表查找问题为例,掌握减治法的基本设计策略;2)熟练掌握折半查找算法的实现;3)掌握插值查找算法的实现;4) 分析实验结果。实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1. 准备实验数据通过实验一获得的排好序的数据可作为本算法实验的输入数据。2. 实现折半查找算法要求:实现binary_search算法。输入:已排序数据序列A、待查找的数据元素key;输出
8、:数据元素key在数据序列A中的位置。折半查找算法(类C语言):int binary_search(int A, int key, int imin, int imax) while (imin = imax) int imid = midpoint(imin, imax); / 找中点 if(Aimid = key) return imid; else if (Aimid = Alow & key = Ahigh) mid = low + (high - low) * (key - Alow) / ( Ahigh - Alow) ; if (Amid key) low = mid + 1 ;
9、 else if (key Amid) high = mid - 1; else return mid; if (key = Alow) return low ; else return -1;实验报告:实验报告应包括以下内容:(1)题目;(2)2个算法的基本思想描述;(3)程序流程图;(4)程序输入和输出结果;(5)实验分析;以表或者图的形式给出这两个算法效率的经验分析结果;并和理论分析结论进行对比。(6)说明本次实验的心得体会、经验等。如果程序未通过,应分析其原因。实验三 动态规划求解0/1背包问题实验目的1)以0/1背包问题为例,掌握动态规划算法的基本设计策略;2)掌握并实现求解0/1背
10、包问题的动态规划算法;3) 分析实验结果。实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1. 理解0/1背包问题0/1背包问题的描述:已知有n个物品和一个承重为M的背包,物品i的重量为wi、价值为pi。现在的问题是:如果一个物品不能被分割以后部分放进背包,那么该如何装包,才能使背包中物品的价值之和为最大?这个问题可形式化地表述如下:极大化目标函数 约束条件: 2. 准备实验数据确定物品数目n的值,确定各物品的重量(取正整数)和价值;确定背包的承重值M(取正整数)。3. 实现动态规划算法要求:实现MFKnapsack算法。输入:参数i(初次调用时为物品总数n),j(初次调用时为空
11、包承重M);全局变量:物品重量Weights1.n,价值Values1.n;输出:这i个物品的最优子集的价值。算法 MFKnapsack(i, j)(伪码):/ 另有全局变量V0.n, 0.M存放已经解决的子问题的结果;V初始化:V0,*=0、V*,0=0,其他元素值初始化为负数。if Vi,j 0 / 此问题还没有解if j Weightsivalue MFKnapsack(i-1, j)elsevalue maxMFKnapsack(i-1, j), Valuei+MFKnapsack(i-1, j-Weightsi)Vi,j valuereturn Vi,j4. 修改以上算法,以输出最大
12、装包价值对应的那些装包物品。实验报告:实验报告应包括以下内容:(1)题目;(2)算法的基本思想描述;(3)程序流程图;(4)给出实验内容4所要求的算法伪码或程序清单;(5)实验分析:分析算法效率;(6)说明本次调试实验的心得体会、经验等。如果程序未通过,应分析其原因。选做实验 动态规划求解最短路径问题实验目的:1)以解决最短路径问题为例,掌握动态规划的基本设计策略;2)掌握Floyd动态规划算法求解完全最短路径问题并实现;3)分析实验结果。实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1. 准备实验数据假设算法要处理下图,需要把图数据组织存放到相应的数据结构中,如:权值矩阵float graphmaxsizemaxsize。2实现Floyd算法用Floyd算法求一个图中所有点对之间的最短距离。输入:存储图数据的权值矩阵float graphmaxsizemaxsize;输出:保存到文件floyd-out
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1