《算法设计与分析》实验报告

合集下载

算法设计与分析的实验报告

算法设计与分析的实验报告

实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

二、实验内容1、①设a[0:n-1]是已排好序的数组。

请写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。

当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

②写出三分搜索法的程序。

三、实验要求(1)用分治法求解上面两个问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1、已知a[0:n-1]是一个已排好序的数组,可以采用折半查找(二分查找)算法。

如果搜索元素在数组中,则直接返回下表即可;否则比较搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的最大元素的位置i和大于x的最小元素位置j。

2、将n个元素分成大致相同的三部分,取在数组a的左三分之一部分中继续搜索x。

如果x>a[2(n-1)/3],则只需在数组a的右三分之一部分中继续搜索x。

上述两种情况不成立时,则在数组中间的三分之一部分中继续搜索x。

五、实验结果分析二分搜索法:三分搜索法:时间复杂性:二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为O(log n)。

(n代表集合中元素的个数)三分搜索法:O(3log3n)空间复杂度:O(1)。

六、实验体会本次试验解决了二分查找和三分查找的问题,加深了对分治法的理解,收获很大,同时我也理解到学习算法是一个渐进的过程,算法可能一开始不是很好理解,但是只要多看几遍,只看是不够的还要动手分析一下,这样才能学好算法。

七、附录:(源代码)二分搜索法:#include<iostream.h>#include<stdio.h>int binarySearch(int a[],int x,int n){int left=0;int right=n-1;int i,j;while(left<=right){int middle=(left+right)/2;if(x==a[middle]){i=j=middle;return 1;}if(x>a[middle])left=middle+1;else right=middle-1;}i=right;j=left;return 0;}int main(){ int a[10]={0,1,2,3,4,5,6,7,8,9};int n=10;int x=9;if(binarySearch(a,x,n))cout<<"找到"<<endl;elsecout<<"找不到"<<endl;return 0;}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。

2、掌握算法渐近复杂性的数学表述。

3、掌握用C++语言描述算法的方法。

4.实现具体的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。

书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。

例如,第6 页用数字6 表示,而不是06 或006 等。

数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。

编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。

把这些结果统计起来即可。

四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。

算法设计与分析实验报告_3

算法设计与分析实验报告_3

实验一全排列、快速排序【实验目的】1.掌握全排列的递归算法。

2.了解快速排序的分治算法思想。

【实验原理】一、全排列全排列的生成算法就是对于给定的字符集, 用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。

任何n个字符集的排列都可以与1~n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法。

n个字符的全体排列之间存在一个确定的线性顺序关系。

所有的排列中除最后一个排列外, 都有一个后继;除第一个排列外, 都有一个前驱。

每个排列的后继都可以从它的前驱经过最少的变化而得到, 全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。

二、快速排序快速排序(Quicksort)是对冒泡排序的一种改进。

它的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行, 以此达到整个数据变成有序序列。

【实验内容】1.全排列递归算法的实现。

2.快速排序分治算法的实现。

【实验结果】1.全排列:快速排序:实验二最长公共子序列、活动安排问题【实验目的】了解动态规划算法设计思想, 运用动态规划算法实现最长公共子序列问题。

了解贪心算法思想, 运用贪心算法设计思想实现活动安排问题。

【实验原理】一、动态规划法解最长公共子序列设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>, 则:..i.若xm=yn, 则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列...ii.若xm≠yn且zk≠x., 则Z是Xm-1和Y的最长公共子序列...iii.若xm≠yn且zk≠y.,则Z是X和Yn-1的最长公共子序列.其中Xm-1=<x1, x2, …, xm-1>, Yn-1=<y1, y2, …, yn-1>, Zk-1=<z1, z2, …, zk-1>。

算法分析实验三报告

算法分析实验三报告

《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.矩阵连乘问题内容描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。

如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

功能分析:输入包含多组测试数据。

第一行为一个整数C,表示有C 组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个矩阵连乘,接下来一行有n+1个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开。

输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数。

例如:输入:1输出:7500310 100 5 502.Pebble Merging内容描述:在一个圆形操场的四周摆放着n 堆石子。

现要将石子有次序地合并成一堆。

规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。

编程任务:对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。

功能分析:输入由多组测试数据组成。

每组测试数据输入的第1 行是正整数n,1≤n≤100,表示有n堆石子。

第二行有n个数,分别表示每堆石子的个数。

对应每组输入,输出的第1 行中的数是最小得分;第2 行中的数是最大得分。

例如:输入:4 输出:434 45 9 54二、算法过程设计.1.矩阵连乘问题矩阵连乘问题是通过设置数组,利用数组的横竖坐标来进行矩阵对应行与列的计算。

2.Pebble Merging这个问题也是跟数组相关,通过寻找数组中的最大和最小值来进行计算。

三、程序调试及结果(附截图).1.矩阵连乘问题2.Pebble Merging四、源代码(附源代码).1.矩阵连乘问题#include <stdio.h>int main(){ int a[ 50 ] , b[ 50 ][ 50 ] , c[ 50 ][50 ] , z , n;int i , r , j , k , t;scanf("%d",&z);while (z --){ scanf("%d",&n);for (i = 0 ; i <= n ; ++ i) scanf("%d",& a[ i ]);for (i = 1 ; i <= n ; ++ i) b[ i ][ i ] = 0;for (r = 2 ; r <= n ; ++ r)for (i = 1 ; i <= n - r + 1 ; ++ i){ j = i + r - 1;b[ i ][ j ] = b[i + 1][ j ] + a[i - 1] * a[ i ] * a[ j ];c[ i ][ j ] = i;for (k = i + 1 ; k < j ; ++ k){ t = b[ i ][ k ] + b[k + 1][ j ] + a[i - 1] * a[ k ] * a[ j ];if (t < b[ i ][ j ])b[ i ][ j ] = t , c[ i ][ j ] = k;}}printf ("%d\n" , b[ 1 ][ n ]);}return 0;}2.Pebble Merging#include <stdio.h>int main(){ int dpmin[ 200 ][ 200 ] , min[ 200 ][ 200 ] , mins;int dpmax[ 200 ][ 200 ] , max[ 200 ][ 200 ] , maxs;int a[ 200 ] , i , n , j , k , temp , l;while (scanf ("%d" , & n) != EOF){ for (i = 1 ; i <= n ; ++ i) scanf ("%d" , & a[ i ]);for (i = 1 ; i < n ; ++ i) a[i + n] = a[ i ];for (i = 1 ; i < 2 * n ; ++ i){ min[ i ][ i ] = max[ i ][ i ] = 0;dpmax[ i ][ i ] = dpmin[ i ][ i ] = a[ i ];dpmax[ i ][i + 1] = dpmin[ i ][i + 1] = a[ i ] + a[i + 1];min[ i ][i + 1] = max[ i ][i + 1] = a[ i ] + a[i + 1];}for (i = 1 ; i < n - 1; ++ i)for (l = 1 , j = 2 + i ; j < 2 * n ; ++ j , ++ l){ for (k = l + 1 ; k <= j ; ++ k){ if (k == l + 1){ dpmin[ l ][ j ] = dpmin[ l ][k - 1] + dpmin[ k ][ j ] + min[ l ][k - 1] + min[ k ][ j ];if ( l == k - 1 && k != j)min[ l ][ j ] = a[ l ] + min[ k ][ j ];elseif (l != k - 1 && k == j)min[ l ][ j ] = min[ l ][k - 1] + a[ k ];elsemin[ l ][ j ] = min[ l ][k - 1] + min[ k ][ j ]; dpmax[ l ][ j ] = dpmax[ l ][k - 1] + dpmax[ k ][ j ] + max[ l ][k - 1] + max[ k ][ j ];if ( l == k - 1 && k != j)max[ l ][ j ] = a[ l ] + max[ k ][ j ];elseif (l != k - 1 && k == j)max[ l ][ j ] = max[ l ][k - 1] + a[ k ];elsemax[ l ][ j ] = max[ l ][k - 1] + max[ k ][ j ];continue ;}temp = dpmin[ l ][k - 1] + dpmin[ k ][ j ] + min[ l ][k - 1] + min[ k ][ j ];if (temp < dpmin[ l ][ j ]){ dpmin[ l ][ j ] = temp;if ( l == k - 1 && k != j)min[ l ][ j ] = a[ l ] + min[ k ][ j ];elseif (l != k - 1 && k == j)min[ l ][ j ] = min[ l ][k - 1] + a[ k ];elsemin[ l ][ j ] = min[ l ][k - 1] + min[ k ][ j ];}temp = dpmax[ l ][k - 1] + dpmax[ k ][ j ] + max[ l ][k - 1] + max[ k ][ j ];if (temp > dpmax[ l ][ j ]){ dpmax[ l ][ j ] = temp;if ( l == k - 1 && k != j)max[ l ][ j ] = a[ l ] + max[ k ][ j ];elseif (l != k - 1 && k == j)max[ l ][ j ] = max[ l ][k - 1] + a[ k ];elsemax[ l ][ j ] = max[ l ][k - 1] + max[ k ][ j ];} } }mins = dpmin[ 1 ][ n ]; maxs = dpmax[ 1 ][ n ];for (i = 2 ; i <= n ; ++ i){ if (mins > dpmin[ i ][i + n - 1])mins = dpmin[ i ][i + n - 1];if (maxs < dpmax[ i ][i + n - 1])maxs = dpmax[ i ][i + n - 1];}printf ("%d\n%d\n" , mins , maxs);}return 23;}。

算法设计与分析实验报告

算法设计与分析实验报告

实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。

三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。

如果a>b则交换位置,如果a<b则不交换。

四、程序流程图五、源代码#include <stdio.h>void sort(int a[]){int temp;for(int i=0;i<9;i++){for(int j=0;j<10-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");}void main(){int a[10];for(int i=0;i<10;i++){scanf("%d",&a[i]);}printf("排序前的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");sort(a);}六、测试结果实验二递归算法设计一、实验内容1.判断S字符是否为“回文”的递归函数,并编写程序测试。

二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。

递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告姓名:班级:计算机科学与技术102班学号:1090教师:设计时间:2012.04.23编程工具:C-Free 5.0【实验一】:使用递归方法输出杨辉三角杨辉三角.cpp//使用递归方法输出杨辉三角,每个数字占用4个空格位#include <stdlib.h>#include <stdio.h>int calcit(int x, int y){if (x==y||y==0)return 1;elsereturn calcit(x-1,y-1)+calcit(x-1,y);}int main(){int i, j,k,n;printf("请输入行数(最好<=13):");scanf("%d",&n);for (i = 0; i<n; i++){for(k=(n-i)*2;k>0;k--)printf(" ");for (j=0;j<=i;j++)printf("%4d",calcit(i, j));printf("\n");}return 0;}【实验二】:快速排序(一)快速排序.cpp#include<stdio.h>#include<stdlib.h>#define SIZE 100void quick_sort(int data[],int x,int y);int pation(int data[],int x,int y);int main(){int i,n,data[SIZE];printf("请输入要排列的数目(<=100):");scanf("%d",&n);printf("请输入要排列的数列:\n");for(i=0;i<n;++i)scanf("%d",&data[i]);quick_sort(data,0,n-1);printf("排列后的数列为:\n");for(i=0;i<n;++i)printf( "%d ",data[i]);printf("\n");return 0;}void quick_sort(int data[],int x,int y){if(x>=y) return;int q=pation(data,x,y);quick_sort(data,x,q-1);quick_sort(data,q+1,y);}int pation(int data[],int x,int y){int n=data[x],i=x+1,j=y,temp;while(1){while(data[i]<n) ++i;while(data[j]>n) --j;if(i>=j) break;temp=data[i]; data[i]=data[j]; data[j]=temp;}data[x]=data[j];data[j]=n;return j;}(二)插入排序.cpp#include<stdio.h>#include<conio.h>#define X 100#define Y 100int main(){int a[X],r[Y];int *p;int i,j,n;printf("请输入要排列的数目(<=100):");scanf("%d",&n);printf("请输入要排列的数列:\n");for(i=0;i<n;i++){p=&a[i];scanf("%d",p);r[i+1]=a[i];}r[0]=1;for(i=2;i<=n;i++){r[0]=r[i];j=i-1;while(r[j]>r[0]){r[j+1]=r[j];j--;}r[j+1]=r[0];}printf("排列后的顺序是:\n");for(i=1;i<=n;i++){p=&r[i];printf("%d ",*p);}printf("\n");return 0;}【实验三】:趣味矩阵(一)次上三角的自动打印次上三角的自动打印.cpp#include "stdio.h"#include "stdlib.h"#define MAX 100void InterestMatrix(int n){int a[MAX][MAX];int k=1,m=0; // 计数器int i,j;//矩阵初始化for(i=0;i<n;i++){for(j=0;j<=i;j++)a[i][j]=k++;}//打印矩阵for(i=0;i<n;i++){m=i;for(j=0;j<n-i;j++)printf("%d ",a[m++][j]);printf("\n");}}int main(){int n;printf("输入矩阵的阶数n:");scanf("%d",&n);printf("\n");InterestMatrix(n);printf("\n");return 0;}(二)特殊趣味矩阵的打印趣味矩阵.cpp//使左对角线和右对角线上的元素为0,它们上方的元素为1,左边的元素为2,下方的元素为3,右边的元素为4#include<stdio.h>int main(){int i,j,a[100][100],n;printf("请输入矩阵的阶数:");scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j||i+j==n+1)a[i][j]=0;if(i<j&&i+j<n+1)a[i][j]=1;if(i>j&&i+j<n+1)a[i][j]=2;if(i>j&&i+j>n+1)a[i][j]=3;if(i<j&&i+j>n+1)a[i][j]=4;}for(i=1;i<=n;i++){printf("\n");for(j=1;j<=n;j++)printf("%d ",a[i][j]);}printf("\n");return 0;}。

算法设计实训报告

算法设计实训报告

一、实训背景随着计算机科学技术的飞速发展,算法作为计算机科学的核心,其设计与应用越来越受到重视。

为了提高我们的算法设计能力,培养解决实际问题的能力,我们开展了为期一个月的算法设计实训。

本次实训以《算法设计与分析》课程为基础,通过理论学习、实验操作和实践应用,使我们深入理解了算法的基本概念、设计方法和分析技巧。

二、实训内容1. 理论学习(1)回顾了算法的基本概念,包括算法、算法复杂度、时间复杂度和空间复杂度等。

(2)学习了常用的算法设计方法,如分治法、动态规划、贪心算法、回溯法等。

(3)了解了不同算法的应用场景和适用范围。

2. 实验操作(1)使用C++语言实现了多种算法,如快速排序、归并排序、二分查找、插入排序等。

(2)针对实际问题,设计了相应的算法,如矩阵链相乘、背包问题、最小生成树等。

(3)对实验结果进行了分析,对比了不同算法的性能。

3. 实践应用(1)以小组为单位,针对实际问题进行算法设计,如数字三角形、投资问题等。

(2)编写程序代码,实现所设计的算法。

(3)对程序进行调试和优化,提高算法效率。

三、实训成果1. 提高了算法设计能力:通过实训,我们掌握了多种算法设计方法,能够根据实际问题选择合适的算法。

2. 增强了编程能力:实训过程中,我们熟练掌握了C++编程语言,提高了编程技巧。

3. 深化了算法分析能力:通过对算法复杂度的分析,我们能够更好地理解算法性能。

4. 培养了团队合作精神:在实训过程中,我们学会了与他人沟通、协作,共同完成任务。

四、实训总结1. 实训过程中,我们遇到了许多困难,如算法设计思路不明确、编程错误等。

通过查阅资料、请教老师和同学,我们逐步克服了这些问题。

2. 实训过程中,我们认识到算法设计的重要性。

一个好的算法可以显著提高程序运行效率,解决实际问题。

3. 实训过程中,我们学会了如何将实际问题转化为数学模型,并设计相应的算法。

4. 实训过程中,我们提高了自己的自学能力和解决问题的能力。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。

本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。

一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。

在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。

通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。

二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。

在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。

我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。

三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。

在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。

我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。

四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。

在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。

我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。

五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。

在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。

在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。

在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析课程实验项目目录学生:学号:*实验项目类型:演示性、验证性、综合性、设计性实验。

*此表由学生按顺序填写。

本科实验报告专用纸课程名称算法设计与分析成绩评定实验项目名称蛮力法指导教师实验项目编号实验项目类型设计实验地点机房学生学号学院信息科学技术学院数学系信息与计算科学专业级实验时间2012年3月1 日~6月30日温度24℃1.实验目的和要求:熟悉蛮力法的设计思想。

2.实验原理和主要容:实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。

实验容:以下题目任选其一1).为蛮力字符串匹配写一段可视化程序。

2).写一个程序,实现凸包问题的蛮力算法。

3).最著名的算式谜题是由大名鼎鼎的英国谜人H.E.Dudeney(1857-1930)给出的: S END+MOREMONEY. 这里有两个前提假设:第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。

求解一个字母算术意味着找到每个字母代表的是哪个数字。

请注意,解可能并不是唯一的,不同人的解可能并不相同。

3.实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。

)该算法程序代码如下:#include "stdafx.h"#include "time.h"int main(int argc, char* argv[]){int x[100],y[100];int a,b,c,i,j,k,l,m,n=0,p,t1[100],num;int xsat[100],ysat[100];printf("请输入点的个数:\n");scanf("%d",&num);getchar();clock_t start,end;start=clock();printf("请输入各点坐标:\n");for(l=0;l<num;l++){//输入各点坐标scanf("%d%d",&x[l],&y[l]);getchar();}xsat[0]=x[0];ysat[0]=y[0];for(i=0;;){//开始进行计算for(j=0;j<=num-1;j++){if(x[j]==xsat[i] && y[j]==ysat[i]){continue;}if(xsat[i]==xsat[0] && ysat[i]==ysat[0] && x[j]==xsat[num] && y[j]==ysat[num]){continue;}for(m=0;m<=n;m++)if(x[j]==xsat[m] && y[j]==ysat[m])goto step;a=y[j]-ysat[i];b=xsat[i]-x[j];c=xsat[i]*y[j]-ysat[i]*x[j];for(k=0,l=0;k<=num-1;k++,l++){if(k==j || x[k]==xsat[i] && y[k]==ysat[i]){l=l-1;continue;}if(a*x[k]+b*y[k]<c)t1[l]=-1;elset1[l]=1;if(l!=0)if(t1[l]*t1[l-1]<0)break;}if(k==num){i++;if(i==1 && p!=0){xsat[num]=x[j];ysat[num]=y[j];i--;p=0;n--;}else{xsat[i]=x[j];ysat[i]=y[j];}n++;break;}elsecontinue;step:;}if(xsat[i]==xsat[num] && ysat[i]==ysat[num])break;}//输出各点坐标printf("\n\n该算法所得各点对应的坐标为 :\n");for(int q=0;xsat[q]!=-858993460;q++)printf("(%d,%d)\n",xsat[q],ysat[q]);end=clock();printf("\n该算法进行所需要的时间为:%f 秒\n",(double)(end-start)/1000);return 0;}本科实验报告专用纸(附页)运行结果如下:4.教师评语、评分:本科实验报告专用纸课程名称算法设计与分析成绩评定实验项目名称分治法指导教师实验项目编号实验项目类型验证或设计实验地点机房学生学号学院信息科学技术学院数学系信息与计算科学专业级实验时间2012年3月1 日~6月30日温度24℃1.实验目的和要求:熟悉分治法的设计思想。

2.实验原理和主要容:实验原理:分治法的三个步骤:分划、求解子问题、合并子问题的解。

实验容:以下题目任选其一1).写一个程序,实现快速排序算法。

用该算法处理一批输入样本。

2).Tromino谜题:Tromino是一个由棋盘上的三个邻接方块组成的L形瓦片。

我们的问题是,如何用Tromino覆盖一个缺少了一个方块(可以在棋盘上的任何位置),的22n n棋盘。

除了这个缺失的方块,Tromino应该覆盖棋盘上的所有方块,而且不能有重叠。

为此问题设计一个分治算法。

3.实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。

)该算法程序代码如下:#include "stdafx.h"void swap(int *x,int *y){int t;t=*x;*x=*y;*y=t;}int partition(int A[100],int l,int r){int p,i,j;p=A[l];i=l;j=r+1;do{do{i=i+1;if(i>j)break;}while(A[i]<p);do{j=j-1;if(j<i)break;}while(A[j]>p);swap(&A[i],&A[j]);}while(i<j);swap(&A[i],&A[j]);//撤销i>=j时最后一次交换swap(&A[l],&A[j]);return j;}int quicksort(int A[100],int l,int r){int s;if(l<r)s=partition(A,l,r);if(l>=r)goto end;quicksort(A,l,s-1);quicksort(A,s+1,r);end:return 0;}void main(int argc, char* argv[]){int a[100],x,s,j,i;printf("请输入您要排序的样本:\n");scanf("%d",&x);for(i=0;i<x;i++)scanf("%d",&a[i]);s=partition(a,0,i-1);quicksort(a,1,s-1);quicksort(a,s+1,i-1);printf("排序后的结果为:");for(j=0;j<x;j++)printf("%d ",a[j]);}程序运行结果如下:4.教师评语、评分:本科实验报告专用纸课程名称算法设计与分析成绩评定实验项目名称减治法指导教师实验项目编号实验项目类型验证实验地点机房学生学号学院信息科学技术学院数学系信息与计算科学专业级实验时间2012年3月1 日~6月30日温度24℃1.实验目的和要求:熟悉减治法的设计思想。

2.实验原理和主要容:实验原理:减治法的三个步骤:将问题实例缩小为规模更小的实例、求解小规模实例、通过较小规模实例的解获得原问题的解。

实验容:以下题目任选其一1).利用深度或广度优先查找,设计一个程序,对于一个给定的图,它能够输出每一个连通分量的顶点,并且能输出图的回路,或者返回一个消息表明图是无环的。

2).设计一个程序实现两种拓扑排序算法:DFS算法和减一算法并做一个实验来比较它们的运行时间。

3).编写程序实现选择问题,即求一个n个数列表的第k个最小元素。

3.实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。

)本科实验报告专用纸(附页)算法程序代码如下:#include"stdio.h"int main(){int QSort(int [],int,int);int a[11];int k;printf("请输入一个11个数的数列:\n");for(k=0;k<11;k++)scanf("%d",&a[k]);QSort(a,0,10); }int QSort(int a[],int left,int right){ int i,j,temp,m=6;i=left;j=right;temp=a[left];if(left>right)return 0;while(i!=j){ while(a[j]>=temp && j>i)j--;if(j>i) a[i++]=a[j];while(a[i]<=temp && j>i)i++;本科实验报告专用纸(附页)if(j>i)a[j--]=a[i]; }a[i]=temp;if(i>m)QSort(a,left,i-1); //对左边的子表进行排序else if(i<m)QSort(a,i+1,right); //对右边的子表进行排序else printf("这个数列中的第K小元素为:%d\n",a[i]); }所得实验结果如下:4.教师评语、评分:本科实验报告专用纸课程名称算法设计与分析成绩评定实验项目名称时空权衡指导教师实验项目编号实验项目类型验证实验地点机房学生学号学院信息科学技术学院数学系信息与计算科学专业级实验时间2012年3月1 日~6月30日温度24℃1.实验目的和要求:熟悉时空权衡的设计思想。

2.实验原理和主要容:实验原理:时空权衡是利用空间换取时间的算法。

实验容:设计一个程序实现Boyer-Moore算法。

3.实验结果及分析:(将程序和实验结果粘贴,程序能够注释清楚更好。

)该算法程序如下:#include <stdio.h>#include <string.h>int table[28];int pre[10];int max(int n, int m){if(n >= m) return n;else return m;}int * shifttable(char p[]){int m,i;char c;m = strlen(p);for(c='a'; c<='z'; c++)table[c-97]=m;// table[' ']=100;for(i=0; i<=m-2; i++)table[p[i]-97]=m-1-i;// table['\0'+27]=100;table[' '-6]=m;return table;}int * prefixtable(char p[])本科实验报告专用纸(附页){int n, k, i,j,m;n = strlen(p);k=1;i=n-2;m=n-1;while(i>=0){if(p[i]==p[n-1]) {pre[k]=n-1-i;break;}i--;}/* for(k=2; k<=n-1; k++){i=k;while(p[n-i]!=p[0] && i>=0){i--;}if(i>0){j=0;while(p[n-i]==p[j] && i>0){i--;j++;}if(0==i) pre[k]=n-j;}else pre[k]=n;}*/for(k=2; k<n; k++){for(i=k; i>0; i--){j=i;m=n-1;while(j>0 && p[j-1]==p[n-1+m-5]){j--;m--;}if(j==0){ pre[k]=n-i;break;}}if(0==i) pre[k]=n;}return pre;}int boyer_moore(char p[], char text[]){int *shi, *pre, i, k, m, n, d1, d2;shi = shifttable(p);pre = prefixtable(p);n = strlen(p);本科实验报告专用纸(附页)m = strlen(text);i = n-1;while(i<=m-1){k=0;while(k<=n-1 && p[n-k-1]==text[i-k]){k++;}if(k==n) return i-n+1;else{if(text[i-k]==' ')d1=max(shi[text[i-k]-6]-k,1);elsed1 = max(shi[text[i-k]-97]-k,1);d2 = pre[k];if(0==k) i = i + d1;else i = i + max(d1,d2);}}return -1;}void main(){// char p[]={"barber"};// char p[]={"baobab"};// char p[]={"abcbab"};// int *t,i=0,*r,a;// t = shifttable(p);// printf("input one number:");// scanf("%d", &a);// while(i != 28)// printf("t[%d] point to : %d\n", i, t[i++]);// r = prefixtable(p);// for(i=1;i<6;i++)// printf("r[%d]=%d\n", i, r[i]);// getch();int i;char p[] = {"baobab"};char text[] = {"bess knew about baobabs"};i = boyer_moore(p, text);printf("i= %d\n", i);}运行结果如下:本科实验报告专用纸(附页) 4.教师评语、评分:本科实验报告专用纸课程名称算法设计与分析成绩评定实验项目名称动态规划指导教师实验项目编号实验项目类型设计实验地点机房学生学号学院信息科学技术学院数学系信息与计算科学专业级实验时间2012年3月1 日~6月30日温度24℃1.实验目的和要求:熟悉动态规划算法的设计思想。

相关文档
最新文档