收藏 分享(赏)

算法设计与分析实验指导书.doc

上传人:dzzj200808 文档编号:2770445 上传时间:2018-09-27 格式:DOC 页数:50 大小:274.50KB
下载 相关 举报
算法设计与分析实验指导书.doc_第1页
第1页 / 共50页
算法设计与分析实验指导书.doc_第2页
第2页 / 共50页
算法设计与分析实验指导书.doc_第3页
第3页 / 共50页
算法设计与分析实验指导书.doc_第4页
第4页 / 共50页
算法设计与分析实验指导书.doc_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、算 法 设 计 与 分 析实验指导书信息科学技术学院目 录实验一 单链表的建立插入及删除 .3实验二 多项式加法 5实验三 集合的表示与操作算法设计 .7实验四 迷宫问题求解 .8实验五 树的建立及遍历 .11实验六 图的遍历的演示 .12实验七 哈希表的设计 15实验八 Kruskal 算法的设计 .17实验九 归并排序的分治策略设计 19实验十 哈夫曼编码的贪心算法设计 .21实验十一 递归与迭代程序设计 22实验十二 多段图问题的动态规划算法设计 24实验十三 作业调度问题 .26实验十四 回溯算法设计 .28实验十五 搜索顺序的选择 .29实验十六 蛇和梯子 31实验十七 游戏中寻址算

2、法的设计 34实验十八 旅行商问题 36实验十九 骑士游历算法设计 .38实验二十 输油管道问题的设计与实现 .40实验二十一 邮局选址问题的设计与实现 42实验二十二 会场安排问题的设计与实现 44实验二十三 目录树打印程序的设计 .46实验二十四 最少演员问题 .48附:实验(设计)报告参考格式 50实验一 常见简单算法的设计、实现与分析实验目的1掌握单链表的建立插入及删除的算法;2进一步熟悉指针的用法;预习要求1.认真阅读教材或参考书, 掌握线性表算法的基本思想;2.写出求解本实验的程序;3.设计好相应的测试用例。类型定义typedef struct Lnodeint data;stru

3、ct Lnode *next;Lnode,*linklist;实验提示void create(link *h,int n)/创建单链表link p,q;int i;p=(link)malloc(sizeof(node);p-next=null;*h=p;q=p;for(i=1;idata);p-next=null;q-next=p;q=p;void print(link h)/输出单链表link p;p=h-next;while(p)printf(“%d “,p-data);p=p-next;void insertlist(linklist *L,int i,int e)/在单链表的第 i 个

4、元素之前插入元素值为 e 的结点void dellist(linklist *L,int i,int *e)/删除单链表的第 i 个结点,被删结点通过 e 返回实验步骤1. 先用插表头或插表尾的方法建立单链表并输出,并测试你的程序,直至正确为止;2. 再进行插入和删除程序的设计;3. 将你的程序和实录的界面存盘备用。实验报告要求1. 阐述实验目的和实验内容;2. 提交模块化的实验程序源代码;3. 简述程序的测试过程,提交实录的输入、输出文件;4. 提交思考与练习题的代码和测试结果。思考与练习怎样用链表实现循环队列。实验二 多项式加法实验目的1熟练掌握在单链表中进行结点的插入和删除操作;2进一步

5、熟悉指针的用法;预习要求1.认真阅读教材或参考书, 掌握线性表算法的基本思想;2.写出求解本实验的程序;3.设计好相应的测试用例。类型定义typedef struct Lnodeint coef,exp;struct Lnode *next;Lnode,*linklist;实验提示void create(link *h,int n)/创建一元多项式link p,q;int i;p=(link)malloc(sizeof(node);p-next=null;*h=p;q=p;for(i=1;icoef,p-next=null;q-next=p;q=p;void print(link h)/输出单

6、链表link p;p=h-next;while(p)printf(“%d,%d “,p-coef,p-exp);p=p-next;void addlist(linklist *A, linklist B)/将 A 和 B 相加并通过 A 返回实验步骤1 先用插表尾的方法建立一元多项式,并将一元多项式输出,并测试你的程序,直至正确为止;2 进行一元多项式相加程序的设计;3 将你的程序和实录的界面存盘备用。实验报告要求1 阐述实验目的和实验内容;2 提交模块化的实验程序源代码;3 简述程序的测试过程,提交实录的输入、输出文件;4提交思考与练习题的代码和测试结果。思考与练习写出约瑟夫问题的求解算法,

7、即 n 个人坐成一圈,报 m 出圈,输出最后一个报 m 的人。实验三 集合的表示与操作算法设计实验目的. 了解集合的不同表示方法,掌握集合的树结构表示方法;. 掌握树结构表示下集合的并运算与查找算法;. 编程实现集合的表示与操作算法.预习要求1. 认真阅读教材内容, 熟悉树结构表示的原理和操作算法;2. 设计和编制实验程序.参考数据类型或变量typedef ElemType int /* 实型或任意其它元素类型 */typedef struct ElemType elem; int tag; /* 根节点为负的整数,表示该集合的基数的负值,否则为父节点索引指针 */NODE;NODE *set

8、; /* 用动态存储分配实现集合的树表示与存储 */参考子程序接口与功能描述void InitSet(NODE *set)功能: 根据集合的基数动态分配存储 , 输入各元素, 初始化子集森林.int Find(NODE *set, ElemType elem)功能: 在数组 set 中顺序查找元素 elem,如果不成功, 返回-1; 否则,使用带压缩规则的查找算法,返回所在子集的根节点索引.int Union(NODE *set, ElemType elem1, ElemType elem2)功能: 应用 Find 算法首先找到 elem1 和 elem2 所在的子集 , 然后应用带加权规则的

9、并运算算法合并两个子集. 不成功时, 返回-1; 否则, 返回并集的根节点索引.实验步骤. 设计 Find 的测试方案和程序,输入测试数据,修改并调试程序 ,直至正确为止;. 设计 Union 的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;. 待各功能子程序调试完毕,去掉测试程序,将你的程序整理成功能模块存盘备用.实验报告要求. 阐述实验目的和实验内容;. 提交实验程序的功能模块;. 记录最终测试数据和测试结果。思考题试用 C 语言实现集合的位向量表示 , 并设计相应的并、交与查找运算算法.实验四 迷宫问题求解实验目的1熟悉栈用法;2掌握回朔法及试探法的程序设计;预习要求1.认

10、真阅读教材或参考书, 掌握栈用法的用法;2.写出求解本实验的程序;3.设计好相应的测试用例。实验提示设迷宫中数组的元素为 1 表示该点道路主的阻塞,为 0 表示可通。设 maze11为入口,mazemn 为出口。在 maze11和 mazemn的元素值必为 0。在任意时刻,老鼠在迷宫中的位置可以用所在点的行下标与列下标(i,j)来表示,这样,老鼠在迷宫中的某点 mazeij时,其可能的运动方向有八个。下图+表示某时刻老鼠所在的位置(i,j),相邻的八个位置分别标以 N、NE、E、SE、S、SW、W、NW(分别代表+点的北、东北、东、东南、南、西南、西、西北方向) ;同时,相对于(i,j) ,这

11、八个相邻位置的坐标的值都可以计算出来。但是,并非迷宫中的每一个点都有八个方向可走,四个角上就只有三个方向可供选择,边上只有五个方向可供选择。为了不在算法中每次都去检查这些边界条件,在迷宫外面套上一圈,其元素值均为 1。NW(I-1,J-1)N(I-1,J)NE(I-1,J+1)W(I,J-1)+(I,J)E(I,J+1)SW(I+1,J-1)S(I+1,J )SE(I+1,J+1)为了简化算法,根据上图所示的位置(i,j)与其相邻的八个位置的坐标关系,建立一个下图所示的表 move,表中给出相对于位置(I,j)的八个方向上的 i 与 j 的增量值。Move -1 0-1 10 11 11 01

12、 -10 -1-1 -1若老鼠在(i,j)位置,要进入 SW 方向(g,h)点,则由该增量值表来修改坐标。g=i+move50;h=j+move51;例如:若(i,j)为(3,4) ,则 SW 的相邻点的坐标为(3+1,4-1) 。在每个位置上都从 N 方向试起,若不通,则顺时针方向试 NE 方向,其余类推。当选定一个可通的方向后,要把目前所在的位置以及所选的方向记录下来,以便往下走时可依次一点一点退回来,每退一步后接着试在该点未试过的方向。为了避免走回到已经进入过的点,mazeij=2.为了记录当前位置以及该位置上所选择的方向数需设一个堆栈。#define m 6#defing n 9voi

13、d path()int mazem+2n+2 ;int move82;int s543;int top=0;int i,j,k,pf=0;for(i=0;im=n;for(j=0;jdataj.firstadj=NULL;g-dataj.vex=j;for(j=0;jadjvex=k; p-next=NULL;if(g-datai.firstadj=NULL)g-datai.firstadj=p;else q=g-datai.firstadj;while(q-next)q=q-next;q-next=p;/* 向图的深度优先遍历*/void dfs(adjlist g, int v )node

14、 *p;printf(“%3d“,v);visitedv=1;p= g.datav.firstadj;while(p)if(visitedp-adjvex=0) dfs(g , p-adjvex);p=p-next;/*图的广度优先遍历程序*/*void bfs(adjlist g, int v )*/*定义空队列*/*int Q100;int front=0,rear=0;node *p;visitedv=1;printf(“%3d“,v);Qrear+=v;while(front!=rear)v=Qfront+;p= g.datav.firstadj;while(p)if(visitedp

15、-adjvex=0) visitedp-adjvex=1;printf(“%3d“, p-adjvex);Qrear+= p-adjvex;p=p-next; */void print(adjlist g)int i;node *p;for(i=0;iadjvex);p=p-next;printf(“n“);实验步骤1先建立图的邻接表,并将邻接表输出,并测试你的程序,直至正确为止;3 进行深度优先遍历和广度优先遍历;4 将你的程序和实录的界面存盘备用。实验报告要求1 阐述实验目的和实验内容;2 提交模块化的实验程序源代码;3 简述程序的测试过程,提交实录的输入、输出文件;4提交思考与练习题的代

16、码和测试结果。思考与练习写出图的邻接矩阵表示法的定义,并实现求最短路径的算法。实验七 哈希表的设计实验目的1掌握的哈希表定义和存储2掌握查找常用方法及过程3实现哈希表的综合操作预习要求1认真阅读和掌握本实验的算法。2上机将本算法实现。3保存和打印出程序的运行结果,并结合程序进行分析。类型定义#define MAXSIZE 12 /哈希表的最大容量,与所采用的哈希函数有关enum BOOLFalse,True;enum HAVEORNOTNULLKEY,HAVEKEY,DELKEY; /哈希表元素的三种状态,没有记录、有记录、有过记录但已被删除typedef struct /定义哈希表的结构in

17、t elemMAXSIZE; /数据元素体HAVEORNOT elemflagMAXSIZE; /元素状态标志,没有记录、有记录、有过记录但已被删除int count; /哈希表中当前元素的个数 HashTable;typedef structint keynum; /记录的数据域,只有关键字一项Record;实验提示void InitialHash(HashTable 实验步骤1.先将哈希表初始化并显示哈希表所有元素及其所在位置,并测试你的程序,直至正确为止;2. 在开放定址哈希表中查找关键字为的数据元素;3. 查找不成功时插入元素到开放定址哈希表中。实验报告要求1.阐述实验目的和实验内容;

18、2.提交模块化的实验程序源代码;3.简述程序的测试过程,提交实录的输入、输出文件;4提交思考与练习题的代码和测试结果。思考与练习写出约瑟夫问题的求解算法,即 n 个人坐成一圈,报 m 出圈,输出最后一个报 m 的人。实验八 Kruskal 算法的设计实验目的. 根据算法设计需要, 掌握连通网的灵活表示方法;. 掌握最小生成树的 Kruskal 算法;. 基本掌握贪心算法的一般设计方法;. 进一步掌握集合的表示与操作算法的应用.预习要求. 认真阅读算法设计教材和数据结构教材内容, 熟习连通网的不同表示方法和最小生成树算法;. 设计 Kruskal 算法实验程序.参考数据类型或变量typedef

19、NodeNumber int; /* 节点编号 */typedef CostType int; /* 成本值类型 */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 为连通网的

20、边数 */EDGE stn-1; /* 最小生成树的边集 */参考子程序接口与功能描述int Find(NODE *set, ElemType elem)功能: 在数组 set 中顺序查找元素 elem, 如果不成功, 返回-1; 否则, 使用带压缩规则的查找算法,返回所在子集的根节点索引.int Union(NODE *set, ElemType elem1, ElemType elem2)功能: 应用 Find 算法首先找到 elem1 和 elem2 所在的子集 , 然后应用带加权规则的并运算算法合并两个子集. 不成功时, 返回-1; 否则, 返回并集的根节点索引.void Sort(E

21、DGE *es, int n)功能: 用任意分类算法将连通图的边集按成本值的非降次序分类.void Kruskal(EDGE *es, int m, NODE *set, int n, EDGE *st)功能: 对有 n 个节点, m 条边的连通网, 应用 Kruskal 算法生成最小生成树, 最小生成树的边存储在数组 st 中.void Output(EDGE *st, int n)功能: 输出最小生成树的各条边 .实验步骤1. 设计测试问题,修改并调试程序, 输出最小生成树的各条边, 直至正确为止;2. 待各功能子程序调试完毕, 去掉测试程序, 将你的程序整理成功能模块存盘备用.实验报告要

22、求1. 阐述实验目的和实验内容;2. 阐述 Kruskal 算法的原理方法;3. 提交实验程序的功能模块;4. 提供测试数据和相应的最小生成树.思考与练习1. 设计由连通网初始边集数组生成最小堆的算法;2. 设计输出堆顶元素, 并将剩余元素调整成最小堆的算法;3. 针对连通网初始边集最小堆表示, 设计 Kruskal 算法 ;4. 采用成本邻接矩阵表示连通网时, 在剩余边中如何实现最小成本边的查找?采用成本邻接矩阵表示连通网时, 用 C 语言实现 Prim 算法.实验九 归并排序的分治策略设计实验目的. 熟悉二分检索问题的线性结构表示和二分检索树表示;. 熟悉不同存储表示下求解二分检索问题的递

23、归算法设计;. 通过实例转换, 掌握将递归算法转换成迭代算法的方法;. 掌握应用递归或迭代程序设计实现分治法求解问题的抽象控制策略.预习要求. 认真阅读算法设计教材和数据结构教材内容, 熟悉不同存储表示下求解二分检索问题的原理或方法;. 针对线性结构表示和二分检索树表示设计递归算法;. 参考教材和课堂教学内容, 根据将递归算法转换成迭代算法的一般步骤将二分检索递归算法转换成相应的迭代算法.算法或程序设计参考线性结构int data10= /* 10 个互异的、无序的原始整数 */ ;typedef struct int s100; int top; STACK;int Partition(in

24、t *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)功能: 将 datalow, high进行快速分类的迭代算法 .int BSearch1(int *data, int key)功能: 在 data 数组中检索 key 的二分检索递归算法, 成功时返回位置索引, 否则返回-1.i

25、nt 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;typedef struct PARA s100; int top; STACK;int InsertBT(BT *t, int key)功能: 在二分检索树 t 中插入关键字为 key

26、 的元素, 成功时返回 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 的元素, 成功时返回 1, p 指向该元素节点, 否则 p 指向查找路径上最后一个节点并返回 0, f 指向 t 的双亲,

27、其初始调用值为NULL.实验步骤1. 调试线性结构表示下的快速分类与二分检索递归程序, 直至正确为止;2. 调试线性结构表示下的快速分类与二分检索迭代程序, 直至正确为止;3. 待各功能子程序调试完毕, 去掉测试程序, 将程序整理成功能模块存盘备用.实验报告要求1. 阐述实验目的和实验内容;2. 提交实验程序的功能模块;3. 阐述将递归算法改写成迭代算法的一般方法;4. 用类 C 语言阐述分治法递归与迭代实现抽象控制策略. 思考与练习1. 怎样优化由递归程序改写的迭代程序?2. 设计二分检索树的构造与检索递归程序, 并将其改写成相应的迭代算法.实验十 哈夫曼编码的贪心算法设计实验目的. 根据算

28、法设计需要,掌握哈夫曼编码的二叉树结构表示方法;. 编程实现哈夫曼编译码器;. 掌握贪心算法的一般设计方法。预习要求1. 认真阅读数据结构教材和算法设计教材内容, 熟悉哈夫曼编码的原理;2. 设计和编制哈夫曼编译码器。参考数据类型或变量typedef ElemType char;typedef struct nodeint w;int flag;ElemType c;struct node *plink,*llink,*rlink;char codem;Node;Node *numn, *root;参考子程序接口与功能描述void SetTree( NODE *root )功能: 从终端读入字

29、符集大小 n,以及 n 个字符和 n 个权值,建立哈夫曼树void EnCode( Node *p )功能: 利用已建好的哈夫曼树,对输入的正文进行编码void DeCode( void )功能: 利用已建好的哈夫曼树,将输入的代码进行译码实验步骤1. 设计 SetTree 的测试方案和程序 ,输入测试数据,修改并调试程序,直至正确为止;2. 设计 EnCode 的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;3. 设计 DeCode 的测试方案和程序,输入测试数据,修改并调试程序 ,直至正确为止;4. 将你的程序整理成功能模块存盘备用。实验报告要求1. 阐述实验目的和实验内容;

30、2. 提交实验程序的功能模块;3. 记录最终测试数据和测试结果。思考题1. 试证明哈夫曼问题具有贪心选择性质;2. 试证明哈夫曼问题具有最优子结构性质。实验十一 递归与迭代程序设计实验目的. 熟悉二分检索问题的线性结构表示和二分检索树表示;. 熟悉不同存储表示下求解二分检索问题的递归算法设计;. 通过实例转换, 掌握将递归算法转换成迭代算法的方法;. 掌握应用递归或迭代程序设计实现分治法求解问题的抽象控制策略.预习要求. 认真阅读算法设计教材和数据结构教材内容, 熟悉不同存储表示下求解二分检索问题的原理或方法;. 针对线性结构表示和二分检索树表示设计递归算法;. 参考教材和课堂教学内容, 根据

31、将递归算法转换成迭代算法的一般步骤将二分检索递归算法转换成相应的迭代算法.算法或程序设计参考线性结构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

32、 *data, int low, int high)功能: 将 datalow, 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 str

33、uct Parameters BT *t; int key; BT f; BT *p PARA;typedef struct PARA s100; int top; STACK;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 的双亲, 其初始调

34、用值为NULL.int TSearch2(BT *t, int key, BT f, BT *p)功能: 用迭代算法在二分检索树 t 中查找关键字为 key 的元素, 成功时返回 1, p 指向该元素节点, 否则 p 指向查找路径上最后一个节点并返回 0, f 指向 t 的双亲, 其初始调用值为NULL.实验步骤1. 调试线性结构表示下的快速分类与二分检索递归程序, 直至正确为止;2. 调试线性结构表示下的快速分类与二分检索迭代程序, 直至正确为止;3. 待各功能子程序调试完毕, 去掉测试程序, 将程序整理成功能模块存盘备用.实验报告要求1. 阐述实验目的和实验内容;2. 提交实验程序的功能模

35、块;3. 阐述将递归算法改写成迭代算法的一般方法;4. 用类 C 语言阐述分治法递归与迭代实现抽象控制策略. 思考与练习1. 怎样优化由递归程序改写的迭代程序?2. 设计二分检索树的构造与检索递归程序, 并将其改写成相应的迭代算法.实验十二 多段图问题的动态规划算法设计实验目的1. 掌握有向网的成本邻接矩阵表示法;2. 能用程序设计语言实现多段图问题的动态规划递推算法;3. 基本掌握动态规划法的原理方法.预习要求1. 认真阅读数据结构教材和算法设计教材, 熟习有向网的成本邻接矩阵表示法和动态规划求解多段图问题的递推原理;2. 设计用动态规划算法求解多段图问题的数据结构和递推程序.参考数据类型或

36、变量typedef NodeNumber int; /* 节点编号 */typedef CostType int; /* 成本值类型 */CostType costnn=; /* 成本邻接矩阵, n 为顶点数 */NodeNumber pathk; /* k 段图最短路径上的节点编号数组 */NodeNumber cur= -1; /* 当前邻接节点 */参考子程序接口与功能描述int FindForward(CostType *costn, NodeNumber i, NodeNumber cur)功能: 根据邻接矩阵查找节点 i 的下一个前向邻接节点, 成功时返回节点编号, 否则返回-1;

37、 cur 为当前的前向邻接节点, 第一次调用时其值为-1.int FindBackward(CostType *costn, NodeNumber i, NodeNumber cur)功能: 根据邻接矩阵查找节点 i 的下一个后向邻接节点, 成功时返回节点编号, 否则返回-1; cur 为当前的后向邻接节点, 第一次调用时其值为-1.void FPath(CostType *costn, int k, int n, NodeNumber *path)功能: n 个节点的 k 段图前向递推算法 , path 存储最短路径节点序列.void BPath(CostType *costn, int k

38、, int n, NodeNumber *path)功能: n 个节点的 k 段图后向递推算法 , path存储最短路径节点序列.void OutPath(int k, NodeNumber *path)功能: 输出 k 段图的最短路径序列 , path存储最短路径节点序列.实验步骤 1. 设计程序和测试数据,修改并调试程序,直至正确为止;2. 应用设计的算法和程序输出给定多段图问题的最短路径序列;3. 去掉测试程序,将你的程序整理成功能模块存盘备用.实验报告要求1. 阐述实验目的和实验内容;2. 阐述求解多段图问题的动态规划递推原理;3. 提交实验程序的功能模块;4. 记录最终测试数据和测试

39、结果。思考与练习1.试用 C 语言实现求有向网每对节点之间最短路径的数据结构和动态规划递推算法, 要求算法能输出每条最短路径节点序列.试用动态规划法求解最长公共子序列问题: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 既是 X 的子序列又是 Y 的子序列时,称 Z 是序列 X 和 Y 的公共子序列。给定

40、2 个序列 X=x1,x2,xm和 Y=y1,y2,yn,找出 X 和 Y 的最长公共子序列。实验十三 作业调度问题实验目的1.熟悉多机调度问题的算法;2.进一步掌握贪心算法3.提高分析与解决问题的能力。预习要求1.认真阅读教材或参考书, 掌握贪心算法的基本思想;2.写出求解“作业调度”的程序;3.设计好测试用例。实验题要求给出一种作业调度方案,使所给的 n 个作业在尽可能短的时间内由 m 台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。实验提示1.把作业按加工所用的时间从大到小排序;2.如果作业数目比机器的数目少或相等,则

41、直接把作业分配下去;3 .如果作业数目比机器的数目多,则每台机器上先分配一个作业,如下的作业分配时,是选那个表头上 s 最小的链表加入新作业。typedef struct Jobint ID;/作业号int time;/作业所花费的时间Job;typedef struct JobNode /作业链表的节点int ID; int time;JobNode *next;JobNode,*pJobNode;typedef struct Header /链表的表头int s;pJobNode next;Header,pHeader;int SelectMin(Header* M,int m)int k

42、=0;for(int i=1;im;i+)if(Mi.smk.s)k=i;return k;实验步骤1 先用贪心算法求解该问题,并测试你的程序,直至正确为止;2 针对问题实例,实录运行时的输入、输出文件;3 将你的程序和实录的界面存盘备用。实验报告要求阐述实验目的和实验内容;1 提交模块化的实验程序源代码;2 简述程序的测试过程,提交实录的输入、输出文件;3 鼓励对实验内容展开讨论,鼓励提交思考与练习题的代码和测试结果。思考与练习试用贪心算法求解“01 背包”问题,并分析求解时存在的问题。实验十四 回溯算法设计实验目的1. 掌握回溯法解题的基本思想;2. 掌握回溯算法的设计方法;3. 针对子集

43、和数问题,熟练掌握回溯递归算法、迭代算法的设计与实现。预习要求1. 认真阅读教材或参考书, 掌握回溯法解题的基本思想, 算法的抽象控制策略;2. 了解子集和数问题及解向量的定长和变长状态空间表示;3. 针对解向量的定长表示, 设计状态空间树节点扩展的规范(限界) 函数及实现方法;4. 分析深度优先扩展状态空间树节点或回溯的条件;5. 分析和设计生成解向量各分量可选值的实现方法;6. 设计和编制回溯算法的递归和迭代程序。参考数据类型或变量float s; / 表示有可能抵达答案节点的子路径上的元素之和;float r; / 尚未测试的剩余集合元素之和;float wn; / 存储原始集合的 n

44、个元素, 根据问题实例初始化;int xn; / 定长表示的解向量, 各元素初始值为 0;参考子程序接口与功能描述void RecursiveSubset(float s, float r, int k)功能: 针对问题实例的递归回溯算法。void IterativeSubset(float s, float r, int k)功能: 针对问题实例的迭代回溯算法。void InitializeInstanse(void)功能: 问题实例的初始化函数 , 初始化子集和数 M , w, x 向量, s, r。实验步骤1. 录入、修改并测试你的程序,直至正确为止;2. 针对问题实例,实录运行时的输入

45、、输出界面;3. 将你的程序和实录的界面存盘备用。实验报告要求1. 阐述实验目的和实验内容;2. 提交模块化的实验程序源代码;3. 简述程序的测试过程,提交实录的输入、输出界面;4. 鼓励对实验内容展开讨论,鼓励提交思考与练习题的代码和测试结果。思考与练习1. 试针对解向量的变长表示设计回溯算法,上机测试正确性。2. 试针对 0/1 背包问题设计回溯算法,比较与子集和数问题的算法差异。实验十五 搜索顺序的选择实验目的1熟悉搜索类问题的基本求解方法;2了解选择搜索顺序的基本原则;3了解启发式搜索的优点和局限性。预习要求1认真阅读教材或参考书, 掌握静态优化搜索顺序和动态调整搜索顺序的基本思想;2

46、写出求解问题的程序;3设计好测试用例。实验题质数方阵在一个 55 的方阵中填入数字,使得沿行,沿列及两个对角线的 5 个数字都能构成一个 5 位质数(5 位质数的首位不为 0) 。所有质数的各位数字之和必须等于一个常数。这个常数和方阵左上角中的数字预先给出。请求出其中的一个解。实验提示(1)选择搜索顺序的基本原则1取值范围小的搜索元素先搜索。2一个搜索元素确定以后对其它搜索元素取值范围的影响称为制约力。制约力较大的搜索元素先搜索。 3先搜索对解影响较大的元素可以使剪枝时的估价函数更准确,使剪枝更加有效。(1)搜索元素的性质1.最后一行和最后一列:可以填的数字只有1,3,7,9。2.两条对角线:

47、与方阵中的所有五位素数有关。3.其他行列:特殊性取决于行列中已经确定的格子个数。(2)根据元素取值范围和制约力确定搜索顺序1.最后一行和最后一列是取值范围最小的搜索元素,而且它们对其他所有的元素都有一定的制约力,因此要放在搜索序列的最前面。2.两条对角线同样影响到其他所有的搜索元素,制约力在剩下的格子中是最大的,因此也应当优先搜索。3.剩下的行列依据它们取值范围的大小确定搜索顺序。实验步骤1先用程序求解该问题,并测试你的程序,直至正确为止;2针对问题实例,实录运行时的输入、输出文件;3修改搜索方式,比较程序的执行效率,并分析实验结果;如:普通搜索算法剪枝(求一组解)动态调整搜索顺序(求一组解)普通搜索算法剪枝(求所有解)动态调整搜索顺序(求所有解)耗时 2.09 sec 0.00 sec 12.97 sec 0.11 sec实验报告要求1 阐述实验目的和实验内容;2 提交模块化的实验程序源代码;3 简述程序的测试过程,提交实录的输入、输出文件;4 鼓励对实验内容展开讨论,鼓励提交思考与练习题的代码和测试结果。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报