算法分析与设计实验指导书
算法设计与分析实验指导书
算法设计与分析实验指导书. . .. . .算法设计与分析实验指导书东北大学软件学院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)仔细观察调试程序过程中出现的各种问题,记录主要问题,做出必要说明和分析。
《算法分析与设计》实验指导书(8学时)
计算机科学与技术学院算法分析与设计实验指导书2011年8月于洪编写2015年9月周应华修订目录实验一分治策略排序 (3)实验二减治策略查找顺序表 (5)实验三动态规划求解0/1背包问题 (8)实验四贪心算法求解最短路径问题 (10)附录1 关于文件的操作 (12)附录2 关于如何统计运算时间 (13)实验一分治策略排序实验目的1)以排序问题为例,掌握分治法的基本设计策略;2)熟练掌握合并排序算法的实现;3)熟练掌握快速排序算法的实现;4) 理解常见的算法经验分析方法。
实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。
这些数作为本算法实验的输入数据。
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 (即:A[iEnd]不是待排元素)TopDownSplitMerge(A[], iBegin, iEnd, B[]){if(iEnd - iBegin < 2) // 如果只有1个待排元素,返回。
return;// recursively split runs into two halves until run size == 1,// then merge themiMiddle = (iEnd + iBegin) / 2; // 划分TopDownSplitMerge(A, iBegin, iMiddle, B);TopDownSplitMerge(A, iMiddle, iEnd, B);TopDownMerge(A, iBegin, iMiddle, iEnd, B); // 合并;元素放到数组B中。
2021年《算法设计与分析》实验指导
《算法设计与分析》实验指导《算法分析与设计》实验指导 .1 实验一锦标赛问题 [实验目的] 1. 基本掌握分治算法的原理. 2. 能用程序设计语言求解锦标赛等问题的算法; [预习要求] 1. 认真阅读数据结构教材和算法设计教材,了解分治算法原理; 2. 设计用分治算法求解背包问题的数据结构与程序代码. [实验题] 【问题描述】设有 n=2 k 个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他 n-1 个选手各赛一次;(2)每个选手一天只能参赛一次;(3)循环赛在 n-1 天内结束。
请按此要求将比赛日程表设计成有 n 行和 n-1 列的一个表。
在表中的第 i 行,第 j 列处填入第 i 个选手在第 j 天所遇到的选手。
其中 1≤i≤n,1≤j≤n-1。
[实验提示] 我们可以按分治策略将所有的选手分为两半,则 n 个选手的比赛日程表可以通过 n/2个选手的比赛日程表来决定。
递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。
这时只要让这两个选手进行比赛就可以了。
1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 6 7 8 5 3 4 1 2 7 8 5 6 1 2 3 4 3 2 1 8 5 6 7 1 2 3 4 5 6 7 8 1 4 3 2 1 2 1 4 3 6 5 8 7 2 1 4 3 1 2 3 4 1 2 7 8 5 6 3 2 1 4 2 1 4 3 2 1 8 7 6 5 4 3 2 1 (1)(2)(3)图 1 2 个、4 个和 8 个选手的比赛日程表图 1 所列出的正方形表(3)是 8 个选手的比赛日程表。
其中左上角与左下角的两小块分别为选手 1 至选手 4 和选手 5 至选手 8 前 3 天的比赛日程。
据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这2 样我们就分别安排好了选手 1 至选手 4 和选手 5 至选手 8 在后 4 天的比赛日程。
算法设计与分析课程实验指南
《算法设计与分析》课程实验指南(适合于非计算机科学与技术专业)实验项目1 串匹配问题1.实验题目给定一个文本,在该文本中查找并定位任意给定字符串。
2.学时安排2个学时。
3.实验目的(1)深刻理解并掌握蛮力法的设计思想;(2)提高应用蛮力法设计的技能;(3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。
4.实验要求(1)实现BF算法;(2)实现BF算法的改进算法:KMP算法;(3)对上述2个算法进行时间复杂性分析,并设计实验程序验证分析结果。
实验项目2 最近对问题1.实验题目设p1=(x1,y1),p2=(x2,y2),…,pn=(xn,yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近点对。
2.学时安排2个学时。
3.实验目的(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。
4.实验要求(1)分别用蛮力法和分治法求解最近对问题;(2)分析算法的时间性能,设计实验程序验证分析结论。
实验项目3 八枚硬币问题1.实验题目在8枚外观相同的硬币中,有一枚是人民币假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。
可以通过一架天平来任意比较两组硬币,设计一个高效的算法来测出这枚假币。
2.学时安排2个学时。
3.实验目的(1)深刻理解并掌握减治法的设计思想;(2)提高应用减治设计算法的技能;(3)理解这样一个观点:建立正确的模型对于问题的求解是非常重要的。
4.实验要求(1)设计减治算法实现8枚硬币问题;(2)设计测试数据,写出程序文档。
实验项目4 0/1背包问题1.实验题目给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品总价值最大。
2.学时安排2个学时。
算法分析实验指导书(王红梅)
《算法设计与分析》实验指导书计算机科学与技术学院石少俭实验一分治法1、实验目的(1)掌握设计有效算法的分治策略。
(2)通过快速排序学习分治策略设计技巧2、实验要求(1)熟练掌握分治法的基本思想及其应用实现。
(2)理解所给出的算法,并对其加以改进。
3、分治法的介绍任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
而当n较大时,问题就不那么容易处理了。
要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法的适用条件(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3)利用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。
第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
《算法分析与设计》实验指导书
计算机算法分析与设计实验指导书
杨红云
适用专业:软件工程
江西农业大学软件学院
计算机算法分析与设计实验指导书
计算机算法分析与设计是面向设计的,它是计算机科学和软件工程应用的核心。
无论是计算机系统、系统软件和解决计算机的各种应用课题都可归结为算法的设计。
通过本课程的学习,使学生掌握计算机领域中许多常用的非数值的精确的描述:分治法、贪心法、动态规划、回溯法等。
并掌握算法分析的方法。
从而将学生分析问题和解决问题的能力提高到高层理论的高度。
前期课程为程序设计语言、数据结构、高等数学,即学生应该具备一门高级语言程序设计编程基础,学习基本的数据结构知识,还要求学生掌握较好的数学基础。
实验学时:16学时。
算法设计与分析实验指导书
<<算法设计与分析>>实验指导书实验一、回溯法一、实验目的掌握回溯法求解问题的思想,学会利用其原理求解相关问题。
二、实验内容及要求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];}}时间复杂度:通常情况下用自然合并排序所需要的合并次数较少。
算法分析与设计》实验指导与报告书
《算法分析与设计》实验指导与报告书实验目录实验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)区分递归和递推思想。
《算法设计与分析》实验大纲
《算法设计与分析》实验教学大纲实验学时:32 实验个数:7 实验学分:1课程性质:适用专业:计算机科学与技术、软件工程教材及参考书:1.《计算机算法设计与分析》,王晓东,北京:电子工业出版社,2005年2.《算法与数据结构》,傅清祥等著,北京:电子工业出版社,20033.《计算机算法导引—设计与分析》,卢开澄著,北京:清华大学出版社,2001 大纲执笔人:刘芳大纲审定人:郭涛一、实验课的性质与任务算法的设计与分析是计算机科学的核心问题之一,也是计算机科学与技术专业本科及研究生的一门重要的专业基础课,其内容是研究计算机领域及其有关领域中的一些非数值计算的常用算法。
课程将覆盖计算机软件实现中常用的、有代表性的算法,并具有一定的深度和广度,通过实验,使学生理解并掌握算法设计的基本技术,让学生具有针对所给的问题设计和实现高效算法的基本能力。
二、实验课程目的与要求计算机科学的一个核心问题是算法理论,本课程介绍非数值算法设计的策略与技术,同时介绍算法的复杂性的概念通过对一些代表性算法的使用达到了解掌握与运用的目的。
通过完成课程实验,使学生达到如下要求:1.熟悉各种基本常用算法的基本思想、适用范围,初步掌握算法分析的基本技巧以及如何根据实际问题设计一个有效的算法。
2.能对给定问题分析出恰当的数学模型,并设计出解决方案,将算法用高级语言(C,VC++等)编程实现。
三、实验内容安排:实验一算法设计基础(验证型、设计型实验4学时)1.实验目的(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
2.实验要求(1)认真填写实验报告,附加源代码(主要代码)和运行记录;(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析。
3.实验内容:(1)统计数字问题(P8)#include "stdafx.h"#include <iostream>#include <conio.h>#include <string>using namespace std;void read_information(string &Data){//从文件中读出停车场信息,并且存放在数组中cout<<"正在读取数据......"<<endl;FILE *fp;char ch;if((fp=fopen("data.txt","rt+"))==NULL){printf("\nCannot open file strike any key exit!");getch();exit(1);}ch=fgetc(fp);while(ch!=EOF){Data = Data + ch;ch=fgetc(fp);}fclose(fp);cout<<"读取完成......"<<endl;}void save_information(string data){//把数组中的停车场信息存放回文件中cout<<"正在写入文件......"<<endl;FILE *fp;//定义文件流指针,用于打开写操作的文件char ch[2]="\0";//定义一个字符串数组,用于存储读取的字符int i=0;fp = fopen("answer.txt","w");//写方式打开文件a.txtwhile(i < data.length())//逐行读取fp1所指向文件中的内容到text中{ch[0] = data[i++];fputs(ch,fp);//将内容写到fp2所指向文件中}fclose(fp);//关闭文件b.txtcout<<"写入完成......"<<endl;}int main(int argc, char* argv[]){int Page;int Num[10] = {0,0,0,0,0,0,0,0,0,0};string Data;int jishu = 0;read_information(Data);Page = atoi(Data.c_str());cout<<"计算中.\n"<<jishu<<"%"<<endl;;for(int i=1; i<=Page; i++){char sz[10];itoa(i, sz, 10);for(int j=0; sz[j]!='\0'; j++){Num[sz[j]-48]++;}if((int)i/Page*100>jishu){jishu = i/Page*100;cout<<jishu<<"%"<<endl;}}cout<<endl;string answer = "";for (i=0; i<10; i++){char tmp[10];char sz[2];itoa(Num[i], tmp, 10);itoa(i, sz, 10);answer = answer + sz[0];answer = answer + ":";for(int j=0; j<10 && tmp[j]!='\0'; j++){answer = answer + tmp[j];}answer = answer + '\n';}save_information(answer);system("pause");return 0;}字典序问题(P8)(2)最多约数问题(P9)#include "stdafx.h"#include <iostream>#include <string>using namespace std;int yueshuNum(int x){int num = 0;for(int i=1; i<=x; i++){if(x%i == 0){num++;}}return num;}void read_information(string &Data){//从文件中读出停车场信息,并且存放在数组中cout<<"正在读取数据......"<<endl;FILE *fp;char ch;if((fp=fopen("data.txt","rt+"))==NULL){printf("\nCannot open file strike any key exit!");exit(1);}ch=fgetc(fp);while(ch!=EOF){Data = Data + ch;ch=fgetc(fp);}fclose(fp);cout<<"读取完成......"<<endl;}void save_information(string data){//把数组中的停车场信息存放回文件中cout<<"正在写入文件......"<<endl;FILE *fp;//定义文件流指针,用于打开写操作的文件char ch[2]="\0";//定义一个字符串数组,用于存储读取的字符int i=0;fp = fopen("answer.txt","w");//写方式打开文件a.txtwhile(i < data.length())//逐行读取fp1所指向文件中的内容到text中{ch[0] = data[i++];fputs(ch,fp);//将内容写到fp2所指向文件中}fclose(fp);//关闭文件b.txtcout<<"写入完成......"<<endl;}int main(int argc, char* argv[]){int start, end;int Num=0, flag = 1;string data;read_information(data);char tmpstart[10];char tmpend[10];for(int j=0; data[j]!='\0';j++){if(data[j] == ' '){flag = j + 1;}else if(flag == 1){tmpstart[j] = data[j];}else{tmpend[j-flag] = data[j];}}start = atoi(tmpstart);end = atoi(tmpend);for(int i=start; i<=end; i++){int num = yueshuNum(i);if(num > Num){Num = num;}}char answerchar[10];string answer = "";itoa(Num, answerchar, 10);for(i=0; i<10 && answerchar[i]!='\0'; i++){answer = answer + answerchar[i];}save_information(answer);return 0;}(3)最大间隙问题(P10)(4)设计算法求解fibonacci数列的第110项的值,并统计和分析算法的时间性能。
《算法设计与分析》实验指导书
《算法设计与分析》实验指导书《算法设计与分析》实验指导书本文档主要用于《算法设计与分析》课程的实验指导。
《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。
本课程设计了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的最少硬币数。
算法分析与设计实验指导书
《算法分析与设计》实验指导本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使用学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:1、准备好上机所需的程序,手编程序应书写整齐,并经人工检查无误后才能上机。
2、上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
3、上机结束后,整理出实验报告。
实验报告应包括:题目,程序清单,运行结果,对运行情况所作的分析。
本书共分阶段4个实验,每个实验有基本题和提高题。
基本题必须完成,提高题根据自己实际情况进行取舍。
题目不限定如下题目,可根据自己兴趣爱好做一些与实验内容相关的其它题目,如动态规划法中的图象压缩,回溯法中的人机对弈等。
其具体内容如下:实验一分治与递归(4学时)基本题一:基本递归算法一一、实验目的与要求1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解;二、实验内容掌握递归算法的概念和基本思想,分析结果能够用递归方法实现整数的划分。
三、实验题:任意输入一个整数,输出结果能够用递归方法实现整数的划分。
四、四实验步骤1、理解算法思想和问题要求;2、编程实现题目要求;3、上机输入和调试自己所编写的程序;4、验证分析实验结果;5、整理实验报告。
基本题二:棋盘覆盖问题一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法。
二、实验题目棋盘覆盖问题在一个2k*2k方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一个特殊棋盘。
在棋盘覆盖问题中,要用图标4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
提高题一:二分搜索一、实验目的与要求1、熟悉二分搜索算法;2、初步掌握分治算法。
二、实验题1、高a【0:n-1】是一个已排好的数组。
算法设计与分析课程设计实习指导书--2018级-0705
《算法设计与分析课程设计》指导书《算法设计与分析课程设计》实习指导书一、课程设计目的本课程设计是在学生学习《算法设计与分析》课程后,进行的一次针对具体问题进行算法设计与分析的综合训练,其目的在于加深算法设计分析的理解,掌握算法分析设计方法。
二、算法设计与分析课程设计要求1.学生必须仔细阅读《算法设计与分析课程设计》实习方案,认真主动完成课设的要求。
有问题及时主动通过各种方式与教师联系沟通。
2.学生要发挥自主学习的能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时向教师汇报。
3.课程设计按照教学要求需要一周(5天)时间完成。
三、实验所用仪器及实验环境PC机,Codeblocks软件环境。
四、实习基本内容本次课程设计要求在(一)、(二)、(三)、(四)组中每组选择至少一个题目完成。
(一)分治策略1、输油管道问题【题目描述】某石油公司计划建造一条由西向东的主输油管道,该管道要穿过一个有n口油井的油田。
从每口油田都要有一条输油管道沿最短路径(或南或北)与主管道相连。
如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管长度总和最小的位置?【输入】第一行是一个整数n,表示油井数量(1-1000之间),接下来n行是油井的位置,每行两个整数x和y。
【输出】各油井到主管道之间的输油管道最小长度总和。
【输入样例】51 22 21 33 -23 3【输出样例】62、船的价值问题描述:大橙子最近在玩《艦これ》,因此大橙子收集了很多很多的船(这里我们假设大橙子氪了很多金,开了无数个船位)。
去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船。
每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高。
Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的。
《算法分析与设计》实验指导书-推荐下载
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
《算法设计与分析》实验教学大纲
《算法设计与分析》实验教学大纲
一、实验课的任务、性质与目的:
本课程实验目的是验证、巩固和补充课堂讲授的理论知识。
培养学生初步具备独立设计算法和对给定算法进行复杂性分析的能力,为实际工作打下基础。
实验的安排和要求是:用程序实现经典算法,学习算法设计的主要策略方法、原理并根据实例加以调试,培养动手设计、分析和综合实验结果以及撰写实验报告的能力。
在实验中养成严肃认真的治学态度和踏实细致、实事求是的作风。
二、主要仪器设备及环境:
仪器设备:任何计算机及网络终端。
环境:windows操作系统、任一种编程语言
四、教材、实验教材(指导书):
1. 教材
[1] 郑宗汉等著,算法设计与分析,清华大学出版社,2005年
2. 实验指导书
[1] 王晓东,算法设计与实验题解,电子工业出版社,2006年
[2] 王晓东,计算机算法设计与分析(第三版),电子工业出版社,2007年
五、考核方式与评分办法:
本课程的考核分为平时成绩及期末考试成绩两部分,其中平时成绩包括考勤、实验成绩等,期末考试以闭卷笔试为主。
总成绩按以下公式计算:
总成绩=平时成绩×(30%~40%)+期末成绩×(70%~60%)
六、大纲审核人:
1 / 2。
《算法设计与分析》实验目的
《算法设计与分析》实验指导书曹严元计算机与信息科学学院2007年5月目录实验一递归算法与非递归算法 (2)实验二分治算法 ................................................... 错误!未定义书签。
实验三贪心算法 (3)实验四动态规划 (2)实验五回溯法 (3)实验六分枝—限界算法 (4)实验七课程设计 (4)实验一递归与分治算法实验目的1.了解并掌握递归的概念,掌握递归算法的基本思想;2.掌握分治法的基本思想方法;3.了解适用于用递归与分治求解的问题类型,并能设计相应递归与分治算法;4.掌握递归与分治算法复杂性分析方法,比较同一个问题的递归算法与循环迭代算法的效率。
实验二动态规划实验目的1.掌握动态规划的基本思想方法;2.了解适用于用动态规划方法求解的问题类型,并能设计相应动态规划算法;3.掌握动态规划算法复杂性分析方法。
实验三贪心算法实验目的1.掌握贪心法的基本思想方法;2.了解适用于用贪心法求解的问题类型,并能设计相应贪心法算法;3.掌握贪心算法复杂性分析方法分析问题复杂性。
实验五回溯法实验目的1.掌握回溯法的基本思想方法;2.了解适用于用回溯法求解的问题类型,并能设计相应回溯法算法;3.掌握回溯法算法复杂性分析方法,分析问题复杂性。
实验六 分枝—限界算法实验目的1. 掌握分枝—限界的基本思想方法;2. 了解适用于用分枝—限界方法求解的问题类型,并能设计相应动态规划算法;3. 掌握分枝—限界算法复杂性分析方法,分析问题复杂性。
实验七 课程设计实验目的1. 在已学的算法基本设计方法的基础上,理解算法设计的基本思想方法;2. 掌握对写出的算法的复杂性分析的方法,理解算法效率的重要性;3. 能运用所学的基本算法设计方法对问题设计相应算法,分析其效率,并建立对算法进行改进,提高效率的思想意识。
预习与实验要求1. 预习实验指导书及教材的有关内容,回顾所学过的算法的基本思想;2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;3. 认真听讲,服从安排,独立思考并完成实验。
《算法设计与》实验指导书202109版讲解
《算法设计与》实验指导书202109版讲解湖北汽车工业学院算法设计与分析----实验指导书电气工程系软件教研室王文燕编二○○六年目录实验一:分治与递归.............................................2 实验二:贪心算法................................................3 实验三:动态规划法.............................................4 实验四(1):回溯法.............................................6 实验四(2):分枝限界法.......................................7 参考书目 (8)1实验一:分治与递归【实验目的】学会应用分治算法思想完成汽车牌照的快速查找。
【实验要求】利用基数排序的思想对一批具有结构特征的汽车牌照进行排序,并且利用二分查找的思想对排好序的汽车牌照记录实现查询。
对于车牌号为关键字的记录集合,可以人工录入数据,也可以按自动方式随机生成。
按分治与递归的算法思想策略完成的程序,输入要求的一批数据记录后,屏幕输出排好序的车牌号码及相关信息。
查询时,程序查找到匹配的数据,输出该关键字的其他数据项。
要求完成:⑴算法描述⑵写出程序代码⑶完成调试⑷进行过程与结果分析。
【实验性质】验证型实验。
【实验内容】应用分治策略,进行二分查找。
将一个较大的问题划分为若干较小的问题进行求解,降低求解难度,从而获得原问题的解。
进行算法设计,并写出相应程序,进行调试测试。
测试数据的每个记录包括五项,分别为牌照号码、汽车商标、颜色、注册日期和车主的姓名,其中牌照号码一项的输入形式如下:k0 0 k1 1 k2 B k3 7 k4 3 k5 2 k6 8 其中k0----k1输入值为01�D31(代表地区),k2输入值为A----Z(代表车的使用类型),后4位为0000�D9999(代表车号),例如:01B7328。
算法分析及其设计应用试验参考指导书
算法分析与设计本书是为配合《计算机算法分析与设计》而编写上机指引,其目是使学生消化理论知识,加深对讲授内容理解,增强算法分析与设计实践动手能力。
上机实验注意事项如下:(1)课前认真做好预习,准备好实验工具,熟悉实验流程和手段。
(3)课中依照实验指引书,结合课本实例进行编程实验。
实验时,一人一组,独立上机调试,上机时浮现疑问,可以举手询问实验指引教师,或者与周边同窗小声讨论,勉励独立解决问题。
(4)课后准时按质按量整顿出实验报告。
实验报告应独立完毕,回绝抄袭。
实验内容覆盖:递归与分治方略、动态规划、贪心算法、回溯法、分支限界法等。
实验一递归与分治方略一.实验目与规定(1)理解和掌握递归与分治方略基本原理。
(2)理解课本中示例代码。
(3)调试代码通过。
二.递归与分治基本思想(1)递归与分治办法。
递归与分治办法基本思想是:将一种难以解决大问题,分割成某些规模较小、相似子问题,以便各个击破,分而治之。
(2)递归。
递归问题分析时,要把握如下两个要素:●递归出口。
●递归公式。
其中:●递归出口给出了最简朴状况下问题解。
●递归公式则给出了普通意义下大问题(原问题)和小问题(子问题)之间递归关系。
通过递归公式,一种难以解决大问题会随着递归不断分解为各种小问题,小问题继续递归变为更小小问题,直到最后到达递归出口得到解。
三.实验代码分析和阐明本某些实验,需完毕“棋盘覆盖”(课本P20)和“迅速排序”(课本P22)两个问题。
3.1棋盘覆盖1. 棋盘覆盖问题思路:(1)一方面,将原始棋盘覆盖问题看作最初大问题。
(2)然后,将棋盘行、列一分为二,从而将原始大棋盘分为四个同样大小小棋盘。
(3)接着,采用P21图2-5中适当L型骨牌,覆盖原始大棋盘中心位置,将四个同样大小小棋盘都转化为特殊棋盘。
(4)最后,对四个特殊小棋盘进行递归解决即可。
以上环节(2)和环节(3)合起来,完毕了将大问题划分为小问题过程,特别需要注意是:小问题必要要和大问题相似或相似,否则无法递归。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法分析与设计》实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:(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[]。
2) 算法void Dijkstra(int C[n][n], int n,int u,float dist[],int p[]){ bool s[n];for( int i=1; i<=n; i++){ dist[i]=C[u][i];s[i]=false;if (dist[i]=∞)p[i]=-1;elsep[i]=u;}p[u]=-1;s[u]=true;for( i=1; i<=n; i++){ int temp= ∞;int t=u;for( int j=1;j<=n;j++)if ((!s[j])&& dist[j]<temp){ t=j; temp=dist[j];}if (t==u) break;s[t]=true;for( j=1; j<=n;j++)if((!s[j])&& C[t][j]< ∞)if(dist[j]>(dist[t]+C[t][j]){ dist[j]= dist[t]+C[t][j]; p[j]=t;}}}思考题:算法在何种情况下得不到原问题的解3.最小生成树问题(2学时)问题描述任选一种贪心算法(Prim或Kruskal)对图所示的无向连通带权图构造一棵最小生成树。
并对算法进行复杂性分析实现提示1)数据结构a. Prim算法:图用带权邻接矩阵C来存储,设置数组closest[]存储U中的最近邻接顶点和lowcost[]存储U中的所有顶点的最短边的权值,即边(j,closest[j])的权值。
b. Kruskal算法图用带权邻接矩阵C来存储,设置数组bian[]存储图边的权值(按权值从小到大排好序)2)算法void Prim( int n, int u0, int c[n][n]){ bool s[n];int closest[n];double lowcost[n];for ( int i=0; i<n; i++)if (i!=u0){ lowcost[i]=c[u0][i];closest[i]=u0;s[i]=false;}for(i=0; i<n; i++){ double temp=∞;int t=u0;for ( int j=0;j<n;j++)if ((!s[j])&& lowcost[j]<temp){ t=j; temp=lowcost[j];}if (t==u0) break;s[t]=true;for( j=0;j<n; j++)if ((!s[j])&& c[t][j]<lowcost[j]){ lowcost[j]= c[t][j];closest[j]=t;}}}void Kruskal( int n, struct edge bian[], int c[n][n]){ int nodeset[n];int count=1; bool flag[n+1];if (n==1)return;for ( int i=1; i<=n; i++){ nodeset[i]=i; flag[i]=false;for (int j=1; j<=n; j++){ if( c[i][j]<∞){ bian[count].u=i; bian[count].v=j;bian[count].weight=c[i][j];count++;}}sort( bian+1,bian+count);count=1; int edgeset=0; int w=0;while (edgeset<(n-1)){if(!flag[bian[count].u])&&(flag[bian[count].v])){ w+=bian[count].weight; edgeset++;flag[bian[count].u]=true;nodeset[bian[count].u]=nodeset[bian[count].v];}else if(flag[bian[count].u])&&(!flag[bian[count].v])) { w+=bian[count].weight; edgeset++;flag[bian[count].v]=true;nodeset[bian[count].v]=nodeset[bian[count].u];}else if(!flag[bian[count].u])&&(!flag[bian[count].v])){ w+=bian[count].weight; edgeset++;flag[bian[count].u]= flag[bian[count].v]=true;nodeset[bian[count].u]=nodeset[bian[count].v];}elseif(nodeset[bian[count].u]!=nodeset[bian[count].v]){ w+=bian[count].weight; edgeset++;int tmp= nodeset[bian[count].v];for( int i=1; i<=n; i++)if (nodeset[i]==tmp)nodeset[i]=nodeset[bian[count].u];}count++;}}实验二实验名称:分治法算法应用及设计实验学时:4学时实验类型:验证实验目的:1.理解分治法算法的基本思想2.掌握利用分治法算法求解问题的求解步骤实验容1.二分检索(2学时)问题描述:设a[0:n-1]是一个已排好序的数组。
请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。
当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
实验实现提示:1)数据结构设计:将待查数据集合存储在数组data中,用l表示查找围的下界,h表示查找围的上界。
注意查找失败的条件设置:即查找空间为空区间。
2)二分搜索算法:int besearch(int l,int h,int data[],int key){int m; //m=l与h的中点if(l>h)return 失败;if(data[m]==key)return h;if(data[m]>key)return besearch(l,m-1,data,key);//在l至m-1找elsereturn besearch(m+1,l,data,key); //在m+1至h找}思考题:如何将递归算法改为非递归算法?2.快速排序(2学时)问题描述:利用分治法,实现对n个元素进行排序的算法,在计算机上编程实现,同时进行时间复杂性分析。
实验实现提示:1)数据结构设计:将待排序数据集合存储在数组data中,用l表示待排序围的下界,h表示待排序围的上界。
注意排序结束的条件设置:即待排序空间为空区间。
2)算法:int Partion(int l,int h,int data[]){int i=l,j=h,pivot=data[l];//data[l]为划分基准元素while ( i<j){while( i<j && data[j]>=pivot)j--;if( i<j){ swap(data[i],data[j]); //交换data[i],data[j]i++;}while( i<j && data[i]<=pivot)i++;if( i<j){ swap(data[i],data[j]); //交换data[i],data[j]j--;}}return j;}void QuickSort( int l,int h; int data[]){int pivotpos;if( l<h){pivotpos=Pation(l,h,data);QuickSort(l,pivotpos-1,data);QuickSort(pivotpos+1,h,data);}}思考题:本算法的空间的复杂度?实验三实验名称:动态规划算法应用及设计实验学时:6学时实验类型:验证实验目的:1.理解动态规划算法的基本思想2.掌握利用动态规划算法求解问题的求解步骤实验容1.矩阵连乘问题(2学时)问题描述给定n个矩阵{A1,A2,A3,…,An},其中Ai与Ai+1(i=1,2,3, …,n-1)是可乘的。
用加括号的方法表示矩阵连乘的次序,不同加括号的方法所对应的计算次序是不同的。