算法实验指导书
算法分析与设计实验指导书
《算法分析与设计》实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:(1)、准备好上机所需的程序。
手编程序应书写整齐,并经人工检查无误后才能上机。
(2)、上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
(3)、上机结束后,整理出实验报告。
实验报告应包括:1)问题分析2)算法描述3)运行结果、4)算法性能分析。
实验一实验名称:贪心算法应用及设计实验学时:6学时实验类型:验证实验目的:1.理解贪心算法的基本思想2.掌握利用贪心算法求解问题的求解步骤实验容1.活动选择问题(2学时)问题描述:设有11个会议等待安排,用贪心法找出满足目标要求的会议集合,这些会议按结束时间的非减序排列如下表。
实验实现提示:1)数据结构设计:将会议开始时间存储在数组B中,结束时间存储在数组E中,数组下标为会议的代码。
结果存储在数组A中,其元素A[i]==true,表示会议i被选中。
2)算法:void GreedySelect(int n, struct time B[], struct time E[], bool A[]){int i,j;A[1]=true;j=1; i=2;while( i<=n)if (B[i]>=E[j]){ A[i]=true; j=i;}elseA[i]=false;}思考题:证明所得的解是最优解?2.单源点最短路径问题。
(2学时)问题描述如图所示的有向带权图中,求源点0到其余顶点的最短路径及最短路径长度。
并对算法进行性能分析。
实现提示1)数据结构设计:将图存储在邻接矩阵C中,结点个数为n,源点编号为u, 源点u到其余顶点的最短路径长度存储在dist[],最短路径存储在p[]。
算法设计与分析实验指导书
算法设计与分析实验指导书. . .. . .算法设计与分析实验指导书东北大学软件学院2012年.. .专业. .目录算法设计与分析 (1)实验指导书 (1)前言 (3)实验要求 (4)实验1 分治法的应用(2学时) (5)1.实验目的 (5)2.实验类型 (5)3.预习要求 (5)4.实验基本要求 (5)5.实验基本步骤 (7)实验2动态规划(2学时) (9)1.实验目的 (9)2.实验类型 (9)3.预习要求 (9)4.实验基本要求 (9)5.实验基本步骤 (10)实验3 回溯法(4学时) (12)1.实验目的 (12)2.实验类型 (12)3.预习要求 (12)4.实验基本要求 (12)5.实验基本步骤 (13)前言《算法设计与分析》是一门面向设计,处于计算机科学与技术学科核心地位的教育课程。
通过对计算机算法系统的学习,使学生理解和掌握计算机算法的通用设计方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定基础。
要求掌握算法复杂度分析、分治法、动态规划法、贪心法、回溯法、分支限界法等算法的设计方法及其分析方法。
能将这些方法灵活的应用到相应的问题中,并且能够用C++实现所涉及的算法,并尽量做到低复杂度,高效率。
通过本课程的实验,使学生加深对课程容的理解,培养学生严密的思维能力,运用所学知识结合具体问题设计适用的算法的能力;培养学生良好的设计风格,激励学生创造新算法和改进旧算法的愿望和热情。
希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。
希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《算法设计与分析》课程成为对大家有益的课程。
实验要求《算法设计与分析》课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深理解和更好地掌握《算法设计与分析》课程教学大纲要求的容。
在《算法设计与分析》的课程实验过程中,要求学生做到:(1)仔细观察调试程序过程中出现的各种问题,记录主要问题,做出必要说明和分析。
算法设计与分析实验指导书
实验一串匹配程序设计(2学时)一、实验目的(1). 熟练掌握串匹配的含义(2). 掌握BF算法匹配的过程并编程实现(3). 熟悉C++编译环境的基本操作二、实验内容给定两个字符串S和T,用BF算法,在主串S中查找字串T,输出结果,输出时要求有文字说明。
请编写程序。
三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(匹配成功或不成功)(3)、写出完整的程序四、实验结果实验二排序问题程序设计(2学时)一、实验目的(1). 掌握选择排序和起泡排序的基本思想(2). 掌握两种排序方法的具体实现过程(3). 在掌握的基础上编程实现两种排序方法二、实验内容输入一个待排序的序列,分别用选择排序和起泡排序两种排序方法将其变换成有序的序列,输出结果,输出时要求有文字说明。
请编写程序。
三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(序列本身已是有序序列,序列不是有序序列)(3)、写出完整程序四、实验结果实验三数字旋转方阵程序设计(2学时)一、实验目的(1). 掌握分治法的设计思想(2). 掌握数字旋转方阵的具体实现过程(3). 熟练掌握二维数组的使用方法(4). 在掌握的基础上编程实现数字旋转方阵的实现过程二、实验内容给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。
请编写程序。
三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(方阵有一层,两层或更多层)(3)、写出完整程序四、实验结果实验四排序中分治法的程序设计(2学时)一、实验目的(1). 掌握归并排序和快速排序的划分方法(2). 掌握归并排序和快速排序的具体分治策略(3). 在掌握的基础上编程两种排序方法的实现过程二、实验内容给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,输出结果,输出时要求有文字说明。
算法设计综合实训指导书
《算法设计综合实训》指导书一、实训目的依据人才培养方案的要求及教学计划的安排,在《数据结构》课程后安排这次课程实训,通过这次实训可达到以下目的:(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
(3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
(4)激发学生的学习兴趣。
(5)提高学生的计算思维能力,具备一定的算法分析与设计的能力。
二、实训内容1、根据设计的需求,能阅读和理解;2、根据功能的需求,使用所学知识转化成计算机管理;三、实训进度内容安排序号实训内容计划学时(天)教学要求教法建议1 选题与搜集资料 1 学生听老师讲授,并能理解一些细节通过讲解让学生简单了解系统的需求2 分析与概要设计3 根据搜集的资料,进行程序功能与数据结构分析,并选择合适的数据结构、并在此基础上进行实现程序功能的算法设计3 程序设计 5 运用掌握C/C++/Java语言编写程序,实现所编程序的各个模块功能。
调试程序,并记录测试情况。
符合代码编写规范。
辅导,出现问题多可以统一解答4答辩1提交设计报告、成果、成果演示、答辩教学主任教研室主任课程负责人合计10四、基本要求(一)设计要求(1)所有学生统一在机房进行设计;(2)听从指导老师的统一安排;(3)严格遵守作息时间、不迟到、不早退,病、事假必须向指导老师请假;(4)使用C/C++/JA V A进行开发;(5)满足编程规范;(6)设计结构清晰(模块化开发)。
(7) 根据任务书的要求选择设计题目,针对线性表、栈、队列与递归、字符串算法设计至少选作2个题目,树、图至少选作1个题目,查找与排序至少选作1个题目。
根据题目难易程度进行综合评分。
(8)抄袭他人程序者记零分。
(二)报告要求(1)问题描述:描述要求编程解决的问题。
算法实验指导书(上交版)
《算法设计与分析》实验指导书实验一 用贪心方法解背包问题一: 实验目的掌握按贪心方法原理求背包问题最优解的方法二:问题描述背包问题描述如下: 已知背包容量M=120物品种类数n=10各种物品的总效益pi(i=1,2,………10) : 50,60,70,80,90,80,70,60,50,40各种物品的总重量wi(i=1,2………10) : 17,30,25,41,80,70,64,56,47,38求: 各种物品所取重量占其总重量的比例xi(i=1,2,…..10),满足0<=xi<=1,且 且使得 达到最大值. 三. 基本要求(1) 按三种不同的量度标准分别计算所得最大总效益,然后比较哪个最大1. 按效益值由大到小取物品.2. 按重量值由小到大取物品3.按比值pi/wi 的值由大到小取物品四: 选做题 装箱问题问题描述:装箱问题可简述如下:设有编号为0、1、…、n-1的n 种物品,体积分别为v0、v1、…、vn-1。
将这n 种物品装到容量都为V 的若干箱子里。
约定这n 种物品的体积均不超过V ,即对于0≤i <n ,有0<vi ≤V 。
不同的装箱方案所需要的箱子数目可能不同。
装箱问题要求使装尽这n 种物品的箱子数要少。
若考察将n 种物品的集合分划成n 个或小于n 个物品的所有子集,最优解就可以找到。
但所有可能划分的总数太大。
对适当大的n ,找出所有可能的划分要花费的时间是无法承受的。
为此,对装箱问题采用非常简单的近似算法,即贪婪法。
该算法依次将物品放到它第一个能放进去的箱子中,该算法虽不能保证找到最优解,但还是能找到非常好的解。
不失一般性,设n 件物品的体积是按从大到小排好序的,即有v0≥v1≥…≥vn-1。
如不满足上述要求,只要先对这n 件物品按它们的体积从大到小排序,然后按排序结果对物品重新编号即可。
装箱算法简单描述如下: {输入箱子的容积;输入物品种数n ;按体积从大到小顺序,输入各物品的体积;预置已用箱子链为空;预置已用箱子计数器box_count 为0;for (i=0;i<n;i++){ 从已用的第一只箱子开始顺序寻找能放入物品i 的箱子j ;if (已用箱子都不能再放物品i ){ 另用一个箱子,并将物品i 放入该箱子;box_count++;}else将物品i 放入箱子j ;} }上述算法能求出需要的箱子数box_count ,并能求出各箱子所装物品。
《算法导论》贪心算法实验指导书(二)
《算法导论》贪心算法实验指导书(二)
《算法导论》实验指导书
本书共分阶段4个实验,每个实验有基本题和提高题。
基本题必须完成,提高题根据自己实际情况进行取舍。
题目不限定如下题目,可根据自己兴趣爱好做一些与实验内容相关的其他题目,如动态规划法中的图象压缩,回溯法中的人机对弈等。
其具体要求和步骤如下:
实验三贪心算法(4学时)
一、实验要求与目的
1、熟悉贪心算法的基本原理与适用范围。
2、使用贪心算法编程,求解最小生成树问题。
二、实验内容
1、任选一种贪心算法(Prim或Kruskal),求解最小生成树。
对算法进行描述和复杂性分析。
编程实现,并给出测试实例
一、实验要求与目的
3、熟悉贪心算法的基本原理与适用范围。
4、使用贪心算法编程,求解霍夫曼编码问题。
二、实验内容
2、采用贪心算法,求解霍夫曼编码。
对算法进行描述和复杂性分析。
编程实现,并给出测试实例
一、实验目的与要求
1、掌握汽车加油问题的算法;
2、进一步掌握贪心算法;
二、实验题
一辆汽车加满油后可以行驶N千米。
旅途中有若干个加油站。
若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。
并证明你的算法能产生一个最优解。
三、实验提示
把两加油站的距离放在数组中,a[1..n]表示从起始位置开始跑,经过n个加油站,a[k]表示第k-1个加油站到第k个加油站的距离。
汽车在运行的过程中如果能跑到下一个站则不加油,否则要加油。
(算法略)。
算法实验指导书
实验一递归算法…………………………………………1
实验二分治算法…………………………………………2
实验三贪心算法…………………………………………3
实验四动态规划算法…………………………………………4
实验五图的搜索之回溯算法……………………………5
实验报告内容基本要求…………………………………………7
PC机,C/C++程序设计语言应用环境。
四、实验原理
分治算法
五、实验步骤
1.理解算法思想和问题要求;
2.编程实现题目要求;
3.上机输入和调试自己所编的程序;
4.设计实验数据并运行程序、记录运行的结果;
5.整理出实验报告。
六、实验报告要求
1.阐述实验目的和实验内容;
2.说明程序中的数据结构及模块接口功能说明;
3.提交实验程序的源码及文档;
4.记录最终测试数据和测试结果。
七、实验注意事项
八、思考题
1、设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。
实验三贪心算法(4学时)
内容页
实验一递归算法(2学时)
一、实验目的
掌握递归算法的概念和基本思想
二、实验内容
N阶Hanoi塔问题
要求:
(1)写出相应问题的递归算法及程序
(2)要求输出整个搬动过程。
三、实验仪器、设备及材料
PC机,C/C++程序设计语言应用环境。
四、实验原理
递归算法
五、实验步骤
1.理解算法思想和问题要求;
算法设计与分析实验指导书
<<算法设计与分析>>实验指导书实验一、回溯法一、实验目的掌握回溯法求解问题的思想,学会利用其原理求解相关问题。
二、实验内容及要求1、八皇后问题八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
要求对用C实现的回溯法进行验证,并使其能扩展到任意的皇后数的情况,同时对源程序给出详细的注释。
三、实验步骤1. 理解算法思想和问题要求;2. 编程实现题目要求;3. 上机输入和调试自己所编的程序;4. 验证分析实验结果;5. 整理出实验报告。
四、实验源代码1、八皇后问题(回溯法实现)#define QUEENNO 8#define MAXNO 32#include <stdio.h>#include <stdlib.h>int X[MAXNO];char D[MAXNO][MAXNO];int count=0;void initiate(int n);void nqueen(int n);void display(int n);main(){int queenno=QUEENNO;initiate(queenno);nqueen(queenno);printf("共有%d个解,解已经保存在D盘文件result.txt中\n",count); }void initiate(int n){int i;for(i=0;i<n;i++)X[i]=-1;return;}void nqueen(int n){ int k;X[0]=0;k=0;while(k>=0){X[k]++;while(X[k]<=n&&!place(k)){X[k]++;}if(X[k]<=n){ if(k==n-1) display(n);else {k++;X[k]=0;}}else{ k--;}}}int place(int k){int i;i=0;while(i<k){if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k)))return 0;i++;}return 1;}void display(int n){FILE *fw;int i,j;count++;fw=fopen("D:\\result.txt","a");for(i=0;i<n;i++)for(j=0;j<n;j++)D[i][j]='o';for(i=0;i<n;i++)D[i][X[i]-1]='*';fprintf(fw,"%d\n",count);fprintf(fw,"-------------------------\n");for(i=0;i<n;i++)for(j=0;j<n;j++){if(j==n-1)fprintf(fw,"%c \n",D[i][j]);else fprintf(fw,"%c ",D[i][j]); }fprintf(fw,"-------------------------\n");fclose(fw);return;}实验二:分治法(2学时)问题陈述:对所给元素存储于数组中和存储于链表中两中情况,写出自然合并排序算法.解题思路:将待排序元素分成大小大相同的两个集合,分别对两个集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合.自然排序是通过一次扫描待排元素中自然排好序的子数组,再进行子数组的合并排序.程序代码:#include <iostream.h>const int N=100;void ScanTarget(int target[], int n, int head[], int tail[]);int CountHead(int head[]);void MergeSort(int a[], int head[], int tail[], int m);void MergePass(int x[], int y[], int s, int a[], int b[], int m);void Merge(int c[], int d[], int l, int m, int r);void main(){char a;do{int target[N],head[N],tail[N];int i=0,n,m;for(; i<N; i++){head[i]=-1;tail[i]=-1;}cout<<"请输入要排序的总数:"<<endl;cin>>n;cout<<"请输入要排序的数列:" <<endl;for(i=0; i<n; i++)cin>>target[i];ScanTarget(target,n,head,tail);m=CountHead(head);MergeSort(target,head,tail,m);cout<<"排序后:"<<endl;for(i=0; i<n; i++)cout<<target[i]<<" ";cout<<endl;cout<<"是否继续(y/n):"<<endl;cin>>a;}while(a!='n' && a!='N');}void ScanTarget(int target[], int n, int head[], int tail[])//扫描待排数组;{int i,j=0,k=0;head[k]=0;k++;for(i=1;i<n;i++){if(target[i-1]>target[i]){tail[j++]=i-1;head[k++]=i;}}tail[j]=n-1;}int CountHead(int head[])//求长度;{int i(0);while(head[i]!=-1){i++;}return i;}void MergeSort(int a[], int head[], int tail[], int m){int b[N];int s=1;while(s<m){MergePass(a,b,s,head,tail,m);s+=s;MergePass(b,a,s,head,tail,m);s+=s;}}void MergePass(int x[], int y[], int s, int a[], int b[], int m){int i=0;while(i <= m-2*s){Merge(x,y,a[i],b[i+s-1],b[i+2*s-1]);i=i+2*s;}if(i+s < m){Merge(x,y,a[i],b[i+s-1],b[m-1]);}else{for(int j=i; j<m; j++)for(int k=a[j]; k<=b[j]; k++)y[k]=x[k];}}void Merge(int c[], int d[], int l, int m, int r){int i,j,k;i=l;j=m+1;k=l;while((i<=m) && (j<=r)){if( c[i] <= c[j] )d[k++]=c[i++];else d[k++]=c[j++];}if( i>m ){for(int q=j; q<=r; q++)d[k++]=c[q];}else{for(int q=i; q<=m; q++)d[k++]=c[q];}}时间复杂度:通常情况下用自然合并排序所需要的合并次数较少。
算法实验指导书详解
算法设计与分析实验指导书信电工程学院2015.7算法设计与分析一.实验目的算法设计与分析是计算机相关专业的核心课程之一。
本实验加深学生对算法设计的基本策略、主要方法及实验过程的理解;培养学生针对具体的问题,选择合适的数据结构和设计结构清晰、正确有效的算法的能力。
二.实验内容E05210801 算法概述E05210802 分治法E05210803 动态规划E05210804 贪心法E05210805 回溯法E05210806 分支限界法E05210807 NP完全问题E05210808 近似算法三.实验方法本课程所有实验均需上机进行,每个实验都有明确的实验目的,并根据实验要求提供实验题。
每位同学通过独立思考、与同学讨论、老师辅导答疑相结合的方法完成相应的实验题,在对题目进行分析、选择有效的方法、编程及测试的过程中,将达到加深学生印象、锻炼学生运用书本知识实际解决问题的能力。
四. 实验要求学生按照实验要求,上机前写好上机实验预习报告。
上机实验时按实验要求完成每一个实验的内容。
认真书写实验报告,内容包括:实验的目的、实验原理、实验内容、实验步骤、实验结果等。
实验一算法概述1. 实验目的(1) 复习数据结构课程的相关知识,实现课程间的平滑过渡;(2) 掌握并应用算法的数学分析和后验分析方法;(3) 理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
2. 实验内容求两个自然数m和n的最大公约数。
3. 实验要求(1) 至少设计出三个版本的求最大公约数算法;(2) 对所设计的算法采用大O符号进行时间复杂性分析;(3) 上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4) 通过分析对比,得出自己的结论。
实验二分治法1. 实验目的(1) 进一步掌握递归算法的设计思想以及递归程序的调试技术;(2) 理解这样一个观点:分治与递归经常同时应用在算法设计之中。
算法分析与设计》实验指导与报告书
《算法分析与设计》实验指导与报告书实验目录实验1 求最大公约数 (1)实验2 斐波那契数列 (3)实验3 最近对问题 (6)实验4 堆排序 (7)实验5 霍纳法则和二进制幂 (8)实验6 字符串匹配问题 (9)实验7 Warshall算法和Floyd算法 (10)实验8 最优二叉查找树 (11)实验9 Huffman编码* (12)实验10 求解非线性方程* (13)实验11 投资问题* (14)注:(1)实验4和实验5为变治法应用,二选一;(2)实验7和实验8为动态规划法应用,二选一;(3)带*号的实验为选做实验,根据课时及学生实验完成情况机动安排。
实验1 求最大公约数{c = a;a = b;b = c;}while(a % b != 0){c = a % b;a = b;b = c;}printf("%d", b);return 0;}连续整数检测算法最大公约数算法:#include <stdio.h>int main(){int a,b,t;printf("Please input two integers: ");scanf("%d %d",&a,&b);if(a<b)t=a;elset=b;while(t>=1){if((a%t==0)&&(b%t==0))break;t--;}printf("%d",t);return 0;}相减循环:#include<stdio.h>int main(){int m,n;printf("Please input two integers: ");scanf("%d%d",&m,&n);while(m!=n)if(m>n) m=m-n;else n=n-m;printf("%d",m);return 0;}教师评分实验2 斐波那契数列实验目的(1)求斐波那契数列;(2)区分递归和递推思想。
计算机算法设计与分析实验指导书
计算机算法设计与分析实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:(1)准备好上机所需的程序。
手编程序应书写整齐,并经人工检查无误后才能上机。
(2)上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
(3)上机结束后,整理出实验报告。
实验报告应包括:题目、程序清单、运行结果、对运行情况所作的分析。
本书共分阶段6个实验,其具体要求和步骤如下:实验一分治算法(2学时)一、实验目的与要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、实验题设a[0:n-1]是一个已排好序的数组。
请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。
当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
三、实验提示用i,j做参数,且采用传递引用或指针的形式带回值。
bool BinarySearch(int a[],int n,int x,int& i,int& j){int left=0;int right=n-1;while(left<right){int mid=(left+right)/2;if(x==a[mid]){i=j=mid;return true;}if(x>a[mid])left=mid+1;elseright=mid-1;}i=right;j=left;return false;}实验二动态规划算法(2学时)一、实验目的与要求1、熟悉最长公共子序列问题的算法;2、初步掌握动态规划算法;二、实验题若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。
算法指导书
目录实验一:分治与递归 (2)实验二:贪心算法 (4)实验三:动态规划法 (6)实验四(一):回溯法 (8)实验四(二):分枝限界法 (10)参考书目: (12)实验一:分治与递归【实验目的】学会应用分治算法思想完成汽车牌照的快速查找。
【实验要求】利用基数排序的思想对一批具有结构特征的汽车牌照进行排序,并且利用二分查找的思想对排好序的汽车牌照记录实现查询。
对于车牌号为关键字的记录集合,可以人工录入数据,也可以按自动方式随机生成。
按分治与递归的算法思想策略完成程序编写及实现,输入要求的一批数据记录后,屏幕输出排好序的车牌号码及相关信息。
查询时,程序查找到匹配的数据,并输出该关键字的其他数据项。
要求完成:⑴算法描述⑵写出程序代码⑶完成调试⑷进行过程与结果分析。
【实验性质】验证性实验。
【实验内容】应用分治策略,进行二分查找。
将一个较大的问题划分为若干较小的问题进行求解,降低求解难度,从而获得原问题的解。
进行算法设计,并写出相应程序,进行调试测试。
测试数据的每个记录包括五项,分别为牌照号码、汽车商标、颜色、注册日期和车主的姓名,其中牌照号码一项的输入形式如下:其中k0----k1输入值为01―31(代表地区),k2输入值为A----Z(代表车的使用类型),后4位为0000―9999(代表车号),例如:01B7328。
这种牌照号码具有多关键字的特征,可以将其分为三段来考虑,即:数字、字母和数字。
其余四项输入内容因为不涉及本程序的核心思想,故只要求一般字符串类型即可。
查询时要求输入合法的汽车牌照号码。
测试数据要求用30个左右的数据项进行测试,头两位暂限定01-04,第3位也暂限定为A----E,以便可使牌照号码相对集中。
【注意事项】用C语言或C++实现算法。
选择合适的数据结构。
【调试分析和心得体会】对整个算法实现的时间复杂度进行讨论分析。
【选做题一】完成矩阵乘积的Strassen算法描述、实现及其复杂度分析。
《算法设计与分析》实验指导书
《算法设计与分析》实验指导书《算法设计与分析》实验指导书本文档主要用于《算法设计与分析》课程的实验指导。
《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。
本课程设计了7个设计型实验。
实验内容包括用分治法、动态规划、贪心法、回溯法以及分支限界法求解问题。
一、实验内容安排二、实验基本要求实验前要求学生一定要先了解实验目的、内容、要求以及注意事项,要求学生熟悉实验对象,设计并编写相应的算法。
学生应独立完成所布置实验内容,编写代码,运行程序,记录结果并撰写实验报告。
三、实验报告要求实验结束后,应及时整理出实验报告,实验报告提交书面文档。
四、考核方式理论考试(60%)+实验(30%)+作业(10%)五、实验内容与指导实验一快速排序问题1.实验目的(1) 用分治法求解该问题。
2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。
3.实验内容有n个无序的数值数据,现要求将其排列成一个有序的序列。
4. 实验步骤(1) 输入实现该问题的源代码;(2) 输入测试数据,验证代码的正确性。
5.实验要求(1)做好实验预习,熟悉本实验中所使用的开发环境。
(2)写出实验报告①实验目的②实验内容③出错信息及处理方法④实验结果实验二最少硬币问题1.实验目的(1) 用动态规划求解该问题。
2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。
3.实验内容有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱;各面值的个数存在数组Num[1:n]中。
对于给定的1≤n≤10,硬币面值数组、各面值的个数及钱数m,0<=m<=2001,设计一个算法,计算找钱m的最少硬币数。
算法实验指导书12级
算法实验指导书12级《算法设计与分析》实验指导书本实验指导书是为配合《算法设计与分析》课程实验而编写的,其目的是使学生消化算法理论知识,加深对课堂讲授内容的理解,尤其是一些典型算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的设计与分析有更深刻的认识。
一、上机实验应遵循以下步骤:(1)实验前,先准备好上机所需的程序。
手编程序应书写整齐,并经自我检查无误后才能上机。
(2)实验时,输入并调试自己所编的程序,独立上机调试,上机时出现的问题,最好能自己独立解决。
(3)实验结束后,按照规定整理出实验报告,并在规定时间内提交。
二、实验报告的内容:实验报告应该包括:实验名称、实验目的、实验题目、问题分析、程序清单、运行结果、实验结论(即算法的时间空间分析与改进建议)。
三、需写出实验报告的实验:实验一、实验四、实验五。
实验一递归与迭代算法一、实验目的与要求1、通过本实验掌握迭代算法和递归算法的基本思想及设计工作的主要步骤。
2、通过本实验加深对循环和递归过程的理解。
3、通过本实验加深对迭代过程的理解。
4、掌握两种算法策略的主要适用范围。
二、实验题目:1、求2+22+222+……+22……22(精确计算)n个22、从键盘输入任一正整数n(n>=3),打印如下图所示的n×n 方阵(下图中n=7)。
1 2 3 4 5 6 724 25 26 27 28 29 823 40 41 42 43 30 922 39 48 49 44 31 1021 38 47 46 45 32 1120 37 36 35 34 33 1219 18 17 16 15 14 133、完成给“余”猜数的游戏:心里先想好一个1~100之间的整数x,然后输入3个除数a、b、c,再输入x分别除以a、b、c后所得到的余数ra、rb、rc,计算机能求出这个数x并输出x。
4、用递归函数判断字符串str是否为“回文”。
三、实验步骤1、理解算法思想和问题要求。
《算法设计与分析》实验指导书(6学时)
《算法设计与分析B》实验指导书实验一分治与递归(2学时)[实验目的]1.基本掌握分治算法的原理.2.掌握递归算法及递归程序的设计.3.能用程序设计语言求解相关问题.[预习要求]1.了解用分治法求解的问题:当要求解一个输入规模为n,且n的取值相当大的问题时,如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。
那末,对于这类问题分治法是十分有效的。
2.掌握分治法的一般控制流程。
DanC(p,q)global n,A[1:n]; integer m,p,q; // 1≤p≤q≤nif Small(p,q) then return G(p,q);else m=Divide(p,q); // p≤m<qreturn Combine(DanC(p,m),DanC(m+1,q));endifend DanC3.实现典型的分治算法的编程与上机实验,验证算法的时间复杂性函数。
[实验题]选题要求:题目不限定如下题目,但选题必须采用分治法求解一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法二、实验题:盘覆盖问题:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
一、实验要求与目的1、了解分治法的基本思想,掌握递归程序编写方法;2、使用分治法编程,求解线形序列中第k小元素。
二、实验内容1、给定线形序列集中n个元素和一个整数k,1≤k≤n,输出这n个元素中第k小元素的值及其位置。
2、简述该算法的原理、步骤。
对该算法与直接排序查找进行比较。
3、编写并调试程序。
测试要求:元素个数不少于100;分三种情况:k=1、k=n和k=中位数。
算法设计与分析实验指导书
《算法设计与分析》实验指导书实验一递归与分治1、实验目的(1)掌握设计有效算法的分治策略;(2)通过合并排序和快速排序两个示例学习分治策略设计技巧。
2、实验要求(1)熟练掌握分治法的基本思想及其应用实现;(2)理解所给出的算法,并对其加以改进。
3、实验内容(1)分治法基本思想如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
(2)分治法--算法设计模式如下:Divide-and-Conquer(P)1) if |P|≤n02) then return(ADHOC(P))3) 将P分解为较小的子问题P1 ,P2 ,...,Pk4) for i←1 to k5) 5. do yi ← Divide-and-Conquer(Pi) △递归解决Pi6) 6. T ← MERGE(y1,y2,...,yk)△合并子问题7) return(T)4、实验方法1)合并排序:将待排序元素分成个数大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合并成为所要求的排序集合。
2)快速排序:对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:①分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
②递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
③合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算L[p..r]就已排好序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析实验指导书
信电工程学院
2015.7
算法设计与分析
一.实验目的
算法设计与分析是计算机相关专业的核心课程之一。
本实验加深学生对算法设计的基本策略、主要方法及实验过程的理解;培养学生针对具体的问题,选择合适的数据结构和设计结构清晰、正确有效的算法的能力。
二.实验内容
E05210801 算法概述
E05210802 分治法
E05210803 动态规划
E05210804 贪心法
E05210805 回溯法
E05210806 分支限界法
E05210807 NP完全问题
E05210808 近似算法
三.实验方法
本课程所有实验均需上机进行,每个实验都有明确的实验目的,并根据实验要求提供实验题。
每位同学通过独立思考、与同学讨论、老师辅导答疑相结合的方法完成相应的实验题,在对题目进行分析、选择有效的方法、编程及测试的过程中,将达到加深学生印象、锻炼学生运用书本知识实际解决问题的能力。
四. 实验要求
学生按照实验要求,上机前写好上机实验预习报告。
上机实验时按实验要求完成每一个实验的内容。
认真书写实验报告,内容包括:实验的目的、实验原理、实验内容、实验步骤、实验结果等。
实验一算法概述
1. 实验目的
(1) 复习数据结构课程的相关知识,实现课程间的平滑过渡;
(2) 掌握并应用算法的数学分析和后验分析方法;
(3) 理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
2. 实验内容
求两个自然数m和n的最大公约数。
3. 实验要求
(1) 至少设计出三个版本的求最大公约数算法;
(2) 对所设计的算法采用大O符号进行时间复杂性分析;
(3) 上机实现算法,并用计数法和计时法分别测算算法的运行时间;
(4) 通过分析对比,得出自己的结论。
实验二分治法
1. 实验目的
(1) 进一步掌握递归算法的设计思想以及递归程序的调试技术;
(2) 理解这样一个观点:分治与递归经常同时应用在算法设计之中。
2. 实验内容
设p1, p2, …, p n是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。
3. 实验要求
(1) 分别用蛮力法和分治法求解最近对问题;
(2) 分析算法的时间性能,设计实验程序验证分析结论。
实验三动态规划
1. 实验目的
(1) 深刻掌握动态规划法的设计思想并能熟练运用;
(2) 理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重修正的结果。
2. 实验内容
给定由n个整数组成的序列(a1, a2, …, a n),求该序列的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
3. 实验要求
(1) 分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法;
(2) 比较不同算法的时间性能;
(3) 给出测试数据,写出程序文档。
实验四贪心算法
1. 实验目的
(1) 掌握最优子结构性质的证明方法;
(2) 掌握贪心法的设计思想并能熟练运用。
2. 实验内容
一辆汽车加满油后可以行驶一定距离。
旅途中有若干个加油站。
若要使沿途的加油次数最少,应在那些加油站停靠加油。
3. 实验要求
(1) 设计贪心算法求解汽车加油问题;
(2) 证明算法的正确性;
(3) 设计测试数据,写出程序文档。
实验五回溯法
1. 实验目的
(1) 掌握回溯法的设计思想;
(2) 掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;
(3) 考察回溯法求解问题的有效程度。
2. 实验内容
给定n种物品和一个容量为C的背包,物品i(1≤i≤n)的重量是w i,其价值为v i,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品的总价值最大?
3. 实验要求
(1) 设计可能解的表示方式,构成解空间树;
(2) 设计回溯算法完成问题求解;
(3) 设计测试数据,统计搜索空间的结点数;
实验六分支限界法
1. 实验目的
(1) 进一步掌握分支限界法的设计思想,掌握限界函数的设计技巧;
(2) 考察分支限界法求解问题的有效程度,并与回溯法进行对比;
(3) 理解这样一个观点:好的限界函数不仅计算简单,还要保证最优解在搜索空间中,更重要的是能在搜索的早期对超出目标函数界的结点进行丢弃,减少搜索空间,从而尽快找到问题的最优解。
2. 实验内容
给定n个城市集合C={c1,c2,…,c n}, 从一个城市到另一个城市的距离d ij 为正整数,求一条最短且每个城市恰好经过一次的巡回路线。
3. 实验要求
(1) 对旅行售货员问题建立合理的模型,通过实验确定一个合理的限界函数;
(2) 设计算法实现旅行售货员问题;
(3) 设计测试数据,统计搜索空间的结点数。
实验七NP完全问题
1. 实验目的
(1) 掌握NP完全问题的特点;
(2) 理解这样一个观点:NP完全问题的算法具有指数时间,而指数时间算法的计算时间随着问题规模的增长而快速增长。
2. 实验内容
SAT问题也称为合取范式的可满足问题,一个合取范式形如:A1∧A2∧…∧A n,子句A i(1≤i≤n)形如:a1∨a2∨…∨a k,其中,a i称为文字,为某一布尔变量或该布尔变量的非。
SAT问题是指:是否存在一组对所有布尔变量的赋值(TRUE或FALSE),使得整个合取范式取值为真。
3. 实验要求
(1) 设计算法求解SAT问题;
(2) 设定问题规模为3、5、10、20、50,设计实验程序考察算法的时间性能。
实验八近似算法
1. 实验目的
(1) 了解处理难解问题的策略;
(2) 掌握近似算法的设计思想并能熟练运用;
(3) 掌握近似算法的评价标准。
2. 实验内容
0-1背包问题的近似算法。
3. 实验要求
(1) 设计简单贪心算法G-KK;多项式时间近似方案PTAS;多项式时间近似方案FPTAS。
(2) 测试每种算法的性能。