ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:23.77KB ,
资源ID:7305101      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-7305101.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析实验指导书Word文件下载.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析实验指导书Word文件下载.docx

1、 cout 0) hanoi(n-1, a, c, b); move(a,b); hanoi(n-1, c, b, a);实验二 分治算法(4学时)1、熟悉二分搜索算法和快速排序算法;2、初步掌握分治算法;二、实验题1、设a0:n-1是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。设有n个不同的整数排好序后存放于t0:n-1中,若存在一个下标i,0in,使得ti=i,设计一个有效的算法找到这个下标。要求算法在最坏的情况下的计算时间为O(logn)。2、在快速排序

2、中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。三、实验提示1、用I,j做参数,且采用传递引用或指针的形式带回值。bool BinarySearch(int a,int n,int x,int& i,int& j) int left=0; int right=n-1; while(leftamid) left=mid+1; right=mid-1; i=right; j=left; return false;int SearchTag(int a,int n,int x

3、) if(x=amid) return mid; return -1;2、templatevoid QuickSort (Type a, int p, int r) if (pr) int q=Partition(a,p,r); QuickSort (a,p,q-1); /对左半段排序 QuickSort (a,q+1,r); /对右半段排序int Partition (Type a, int p, int r) int i = p, j = r + 1; Type x=ap; / 将 x的元素交换到右边区域 while (true) while (a+i if (i = j) break;

4、Swap(ai, aj); ap = aj; aj = x; return j;实验三 归并排序的分治策略设计(4学时)实验目的1. 熟悉二分检索问题的线性结构表示和二分检索树表示;2. 熟悉不同存储表示下求解二分检索问题的递归算法设计;3. 通过实例转换, 掌握将递归算法转换成迭代算法的方法;4. 掌握应用递归或迭代程序设计实现分治法求解问题的抽象控制策略.预习要求1. 认真阅读算法设计教材和数据结构教材内容, 熟悉不同存储表示下求解二分检索问题的原理或方法;2. 针对线性结构表示和二分检索树表示设计递归算法;3. 参考教材和课堂教学内容, 根据将递归算法转换成迭代算法的一般步骤将二分检索递

5、归算法转换成相应的迭代算法.算法或程序设计参考 线性结构int data10= /* 10个互异的、无序的原始整数 */ ;typedef struct int s100; int top; STACK; int Partition(int *data, int low, int high)功能: 将datalow, high进行快速分类划分, 返回枢轴记录关键字的位置索引.int QSort1(int *data, int low, int high) 将datalow, high进行快速分类的递归算法.int QSort2(int *data, int low, int high) 将da

6、talow, high进行快速分类的迭代算法.int BSearch1(int *data, int key) 在data数组中检索key的二分检索递归算法, 成功时返回位置索引, 否则返回-1.int BSearch2(int *data, int key) 在data数组中检索key的二分检索迭代算法, 成功时返回位置索引, 否则返回-1.树结构typedef struct NODE int key; struct NODE *lch, *rch; TNODE, *BT; typedef struct Parameters BT *t; int key; BT f; BT *p PARA;

7、typedef struct PARA s100; int InsertBT(BT *t, int key) 功能: 在二分检索树t中插入关键字为key的元素, 成功时返回1, 否则返回0. int TSearch1(BT *t, int key, BT f, BT *p) 用递归算法在二分检索树t中查找关键字为key的元素, 成功时返回1, p指向该元素节点, 否则p指向查找路径上最后一个节点并返回0, f指向t的双亲, 其初始调用值为NULL. int TSearch2(BT *t, int key, BT f, BT *p) 用迭代算法在二分检索树t中查找关键字为key的元素, 成功时返

8、回1, p指向该元素节点, 否则p指向查找路径上最后一个节点并返回0, f指向t的双亲, 其初始调用值为NULL.实验步骤1. 调试线性结构表示下的快速分类与二分检索递归程序, 直至正确为止;2. 调试线性结构表示下的快速分类与二分检索迭代程序, 直至正确为止;3. 待各功能子程序调试完毕, 去掉测试程序, 将程序整理成功能模块存盘备用.实验报告要求1. 阐述实验目的和实验内容;2. 提交实验程序的功能模块;3. 阐述将递归算法改写成迭代算法的一般方法;4. 用类C语言阐述分治法递归与迭代实现抽象控制策略. 思考与练习1. 怎样优化由递归程序改写的迭代程序?2. 设计二分检索树的构造与检索递归

9、程序, 并将其改写成相应的迭代算法。实验四 哈夫曼编码的贪心算法设计(4学时)1. 根据算法设计需要,掌握哈夫曼编码的二叉树结构表示方法;2. 编程实现哈夫曼编译码器;3. 掌握贪心算法的一般设计方法。1. 认真阅读数据结构教材和算法设计教材内容, 熟悉哈夫曼编码的原理;2. 设计和编制哈夫曼编译码器。参考数据类型或变量typedef ElemType char;typedef struct node int w; int flag; ElemType c; struct node *plink,*llink,*rlink; char codem;Node;Node *numn, *root;

10、参考子程序接口与功能描述 void SetTree( NODE *root ) 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树 void EnCode( Node *p ) 利用已建好的哈夫曼树,对输入的正文进行编码 void DeCode( void ) 利用已建好的哈夫曼树,将输入的代码进行译码1. 设计SetTree的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;2. 设计EnCode的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;3. 设计DeCode的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;4. 将你的程序整理成功能模块存

11、盘备用。3. 记录最终测试数据和测试结果。思考题1. 试证明哈夫曼问题具有贪心选择性质;试证明哈夫曼问题具有最优子结构性质。实验五 Kruskal算法的设计(4学时)1. 根据算法设计需要, 掌握连通网的灵活表示方法;2. 掌握最小生成树的Kruskal算法;3. 基本掌握贪心算法的一般设计方法;4. 进一步掌握集合的表示与操作算法的应用.1. 认真阅读算法设计教材和数据结构教材内容, 熟习连通网的不同表示方法和最小生成树算法;2. 设计Kruskal算法实验程序. typedef NodeNumber int; /* 节点编号 */ typedef CostType int; /* 成本值类

12、型 */typedef ElemType NodeNumber /* 实型或任意其它元素类型 */ typedef struct int ElemType; int tag; NODE; typedef struct CostType cost; NodeNumber node1, node2; EDGE; NODE set=1,-1,n,-1; /* 节点集, n为连通网的节点数 */ EDGE es =values of e1, values of em; /* 边集, m为连通网的边数 */ EDGE stn-1; /* 最小生成树的边集 */ int Find(NODE *set, E

13、lemType elem) 在数组set中顺序查找元素elem, 如果不成功, 返回-1; 否则, 使用带压缩规则的查找算法,返回所在子集的根节点索引. int Union(NODE *set, ElemType elem1, ElemType elem2) 应用Find算法首先找到elem1和elem2所在的子集, 然后应用带加权规则的并运算算法合并两个子集. 不成功时, 返回-1; 否则, 返回并集的根节点索引. void Sort(EDGE *es, int n) 用任意分类算法将连通图的边集按成本值的非降次序分类.void Kruskal(EDGE *es, int m, NODE *

14、set, int n, EDGE *st) 对有n个节点, m条边的连通网, 应用Kruskal算法生成最小生成树, 最小生成树的边存储在数组st中.void Output(EDGE *st, int n) 输出最小生成树的各条边.1. 设计测试问题,修改并调试程序, 输出最小生成树的各条边, 直至正确为止;2. 待各功能子程序调试完毕, 去掉测试程序, 将你的程序整理成功能模块存盘备用.2. 阐述Kruskal算法的原理方法;3. 提交实验程序的功能模块;4. 提供测试数据和相应的最小生成树.1. 设计由连通网初始边集数组生成最小堆的算法;2. 设计输出堆顶元素, 并将剩余元素调整成最小堆的

15、算法;3. 针对连通网初始边集最小堆表示, 设计Kruskal算法;4. 采用成本邻接矩阵表示连通网时, 在剩余边中如何实现最小成本边的查找?采用成本邻接矩阵表示连通网时, 用C语言实现Prim算法.实验六 动态规划算法(4学时)1、熟悉最长公共子序列问题的算法;2、初步掌握动态规划算法; 若给定序列X=x1,x2,xm,则另一序列Z=z1,z2,zk,是X的子序列是指存在一个严格递增下标序列i1,i2,ik使得对于所有j=1,2,k有:zj=xij。例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相应的递增下标序列为2,3,5,7。给定2个序列X和Y,当另一序列Z既

16、是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。给定2个序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最长公共子序列。include stdlib.h#include string.hvoid LCSLength(char *x ,char *y,int m,int n, int *c, int *b) int i ,j; for (i = 1; i = m; i+) ci0 = 0;= n; i+) c0i = 0; i+) for (j = 1; j =cij-1) cij=ci-1j; bij=2;else cij=cij-1; bij=3;void LCS(i

17、nt i ,int j, char *x ,int *b) if (i =0 | j=0) return; if (bij= 1) LCS(i-1,j-1,x,b); printf(%c,xi); else if (bij= 2) LCS(i-1,j,x,b); else LCS(i,j-1,x,b);实验七 动态规划算法(4学时)1、熟悉最长最大字段和问题的算法;2、进一步掌握动态规划算法; 若给定n个整数组成的序列a1,a2,a3,an,求该序列形如aiai1an的最大值。int MaxSum(int n,int *a,int &besti,int &bestj) intsum=0; fo

18、r(int i=1;=n; for(int j=i;jj+) int thissum=0; for(int K=i;ksum) sum=thissum; besti=i; bestj=j; return sum; for(intj=i; thissum+=aj;实验八 回溯算法(4学时)1、掌握装载问题的回溯算法;2、初步掌握回溯算法;有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。void backtrack (int i) / 搜索第i层结点 n) / 到

19、达叶结点 更新最优解bestx,bestw;return; r -= wi; if (cw + wi bestw) xi = 0; / 搜索右子树 r += wi;实验(设计)报告参考格式多段图问题的动态规划算法与实现一、 设计目的1. 掌握有向网的成本邻接矩阵表示法;2. 掌握多段图问题的动态规划递推算法;3. 进一步掌握动态规划法的基本思想和算法设计方法;二、 设计内容1 任务描述1)多段图问题简介2)设计任务简介设计求解多段图问题的动态规划算法,即设计和实现多段图问题的表示方案、动态规划递推算法,设计对算法或程序的测试方案并完成测试。2 多段图问题的表示方案本设计采用成本邻接矩阵表示多段

20、图,针对多段图(可插入图例)描述成本邻接矩阵的规模与元素意义3 递推过程的抽象描述本设计采用前向或后向递推公式。用自然语言、伪程序设计语言或流程图等形式针对多段图问题的求解(抽象地)描述递推过程4 主要数据类型与变量typedef CostType int;CostType costnn=; /* 成本邻接矩阵, n为顶点数 */NodeNumber pathk; /* k段图最短路径上的节点编号数组 */NodeNumber cur= -1; /* 当前邻接节点 */(必要时,可对数据类型和变量进一步解释或说明,增加可读性)5 算法或程序模块 int FindForward(CostType

21、 *costn, NodeNumber i, NodeNumber cur) 根据邻接矩阵查找节点i的下一个前向邻接节点, 成功时返回节点编号, 否则返回-1; cur为当前的前向邻接节点, 第一次调用时其值为-1. int FindBackward(CostType *costn, NodeNumber i, NodeNumber cur) 根据邻接矩阵查找节点i的下一个后向邻接节点, 成功时返回节点编号, 否则返回-1; cur为当前的后向邻接节点, 第一次调用时其值为-1.(必要时,可对算法或程序模块进一步解释或说明,增加可读性)三、 测试1 方案描述测试方案、测试模块、测试数据实例(文字数据、图或表等形式)2 结果结合测试数据实例描述测试过程和测试结果,最好给出表示测试过程和结果的抓图,对测试结果进行分析并得出结论。四

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2