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

实验一递归与分治策略一、实验目的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

实验一全排列、快速排序【实验目的】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.掌握能用分治法求解的问题应满足的条件;2.加深对分治法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
二、实验内容1、找最大和最小元素输入n 个数,找出最大和最小数的问题。
2、归并分类将一个含有n个元素的集合,按非降的次序分类(排序)。
三、实验要求(1)用分治法求解问题(2)上机实现所设计的算法;四、实验过程设计(算法设计过程)1、找最大和最小元素采用分治法,将数组不断划分,进行递归。
递归结束的条件为划分到最后若为一个元素则max和min都是这个元素,若为两个取大值赋给max,小值给min。
否则就继续进行划分,找到两个子问题的最大和最小值后,比较这两个最大值和最小值找到解。
2、归并分类使用分治的策略来将一个待排序的数组分成两个子数组,然后递归地对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。
在合并过程中,比较两个子数组的首个元素,将较小的元素放入辅助数组,并指针向后移动,直到将所有元素都合并到辅助数组中。
五、源代码1、找最大和最小元素#include<iostream>using namespace std;void MAXMIN(int num[], int left, int right, int& fmax, int& fmin); int main() {int n;int left=0, right;int fmax, fmin;int num[100];cout<<"请输入数字个数:";cin >> n;right = n-1;cout << "输入数字:";for (int i = 0; i < n; i++) {cin >> num[i];}MAXMIN(num, left, right, fmax, fmin);cout << "最大值为:";cout << fmax << endl;cout << "最小值为:";cout << fmin << endl;return 0;}void MAXMIN(int num[], int left, int right, int& fmax, int& fmin) { int mid;int lmax, lmin;int rmax, rmin;if (left == right) {fmax = num[left];fmin = num[left];}else if (right - left == 1) {if (num[right] > num[left]) {fmax = num[right];fmin = num[left];}else {fmax = num[left];fmin = num[right];}}else {mid = left + (right - left) / 2;MAXMIN(num, left, mid, lmax, lmin);MAXMIN(num, mid+1, right, rmax, rmin);fmax = max(lmax, rmax);fmin = min(lmin, rmin);}}2、归并分类#include<iostream>using namespace std;int num[100];int n;void merge(int left, int mid, int right) { int a[100];int i, j,k,m;i = left;j = mid+1;k = left;while (i <= mid && j <= right) {if (num[i] < num[j]) {a[k] = num[i++];}else {a[k] = num[j++];}k++;}if (i <= mid) {for (m = i; m <= mid; m++) {a[k++] = num[i++];}}else {for (m = j; m <= right; m++) {a[k++] = num[j++];}}for (i = left; i <= right; i++) { num[i] = a[i];}}void mergesort(int left, int right) { int mid;if (left < right) {mid = left + (right - left) / 2;mergesort(left, mid);mergesort(mid + 1, right);merge(left, mid, right);}}int main() {int left=0,right;int i;cout << "请输入数字个数:";cin >> n;right = n - 1;cout << "输入数字:";for (i = 0; i < n; i++) {cin >> num[i];}mergesort(left,right);for (i = 0; i < n; i++) {cout<< num[i];}return 0;}六、运行结果和算法复杂度分析1、找最大和最小元素图1-1 找最大和最小元素结果算法复杂度为O(logn)2、归并分类图1-2 归并分类结果算法复杂度为O(nlogn)实验二背包问题和最小生成树算法实现(用贪心法)一、实验目的1.掌握能用贪心法求解的问题应满足的条件;2.加深对贪心法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目1.N后问题问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后,任何两个皇后不放在同一行同一列,同一斜线上,问有多少种放法。
2.主元素问题问题描述:设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。
给出一个算法,判断A中是否存在主元素。
二、实验目的(1)通过N后问题的实现,体会拉斯维加斯随机算法的随机特点:运行次数随机但有界,找到的解一定为正确解。
但某次运行可能找不到解。
(2)通过实现主元素的不同算法,了解蒙特卡罗算法的随机特性:对于偏真的蒙特卡罗算法,找到为真的解一定是正确解;但非真的解以高概率给出解的正确率------即算法找到的非真解以小概率出现错误。
同时体会确定性算法与随机化算法的差异及各自的优缺点。
(3)通过跳跃表的实现,体会算法设计的运用的广泛性,算法设计的思想及技巧不拘泥独立问题的解决,而在任何需要计算机解决的问题中,都能通过算法设计的技巧(无论是确定性还是随机化算法)来灵巧地解决问题。
此实验表明,通过算法设计技巧与数据组织的有机结合,能够设计出高效的数据结构。
三、实验要求(1)N后问题分别以纯拉斯维加斯算法及拉斯维加斯算法+回溯法混合实现。
要求对同一组测试数据,完成如下任务a.输出纯拉斯维加斯算法找到解的运行次数及运行时间。
b.输出混合算法的stopVegas值及运行时间c.比较a、b的结果并分析N后问题的适用情况。
(2)主元素问题,要求对同一组测试数据,完成如下任务:a.若元素可以比较大小,请实现O(n )的确定性算法,并输出其运行时间。
b.(选做题)若元素不可以比较大小,只能比较相同否,请实现O(n) 确性算法,并输出其运行时间。
c.实现蒙特卡罗算法,并输出其运行次数及时间。
d.比较确定性算法与蒙特卡罗算法的性能,分析每种方法的优缺点。
(3)参照教材实现跳跃表(有序)及基本操作:插入一个结点,删除一个结点。
《算法设计与分析》课程实验报告 (算法问题求解基础1)

}
int s2[10] = {0,9,189,2889,38889,488889,5888889,68888889,788888889};
int a;
scanf("%d",&a);
int count;
count = 0;
while(a > 0){
题目二:最大间隙
源码:
#include<iostream>
#include<cstdio>
using namespace std;
double a[10000] = {0};
int main(){
int n;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
样例输出:
3.2
二、实验目的
(1)理解算法的概念
(2)理解函数渐近态的概念和表示方法
(3)初步掌握算法时间复杂度的计算方法
三、实验要求
(1)对于每个题目提交实验代码。
(2)根据程序设计测试数据,并记录测试结果,要求边界情况必须测试
(3)使用我们学过的分析方法分析你的算法的时间效率,如果可能,请进行算法的优化,尽量减小算法的时间效率或空间效率。
《算法设计与分析》课程实验报告
实验序号:1 实验项目名称:算法问题求解基础
一、实验题目
题目一:统计数字问题
题目描述
一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。
算法设计与分析 实验报告

算法设计与分析实验报告1. 引言本实验报告旨在介绍算法设计与分析的相关内容。
首先,我们将介绍算法设计的基本原则和步骤。
然后,我们将详细讨论算法分析的方法和技巧。
最后,我们将通过一个实例来演示算法设计与分析的过程。
2. 算法设计算法设计是解决问题的关键步骤之一。
它涉及确定问题的输入和输出,以及找到解决方案的具体步骤。
以下是算法设计的一般步骤:2.1 理解问题首先,我们需要全面理解给定问题的要求和约束。
这包括确定输入和输出的格式,以及问题的具体要求。
2.2 制定算法思路在理解问题后,我们需要制定解决问题的算法思路。
这涉及确定解决问题的高层次策略和步骤。
通常,我们使用流程图、伪代码等工具来表示算法思路。
2.3 编写算法代码在制定算法思路后,我们可以根据思路编写实际的算法代码。
这可能涉及选择适当的数据结构和算法,以及编写相应的代码来实现解决方案。
2.4 调试和测试编写算法代码后,我们需要进行调试和测试,以确保算法的正确性和可靠性。
这包括检查代码中可能存在的错误,并使用不同的测试样例来验证算法的正确性。
3. 算法分析算法分析是评估算法性能的过程。
它涉及确定算法的时间复杂度和空间复杂度,以及评估算法在不同输入情况下的执行效率。
3.1 时间复杂度时间复杂度是衡量算法执行时间随输入规模增长的速度。
常见的时间复杂度包括常数时间复杂度 O(1)、线性时间复杂度 O(n)、对数时间复杂度 O(log n)、平方时间复杂度 O(n^2) 等。
通过分析算法中的循环、递归等关键部分,可以确定算法的时间复杂度。
3.2 空间复杂度空间复杂度是衡量算法所需空间随输入规模增长的速度。
它通常用于评估算法对内存的使用情况。
常见的空间复杂度包括常数空间复杂度 O(1)、线性空间复杂度 O(n)、对数空间复杂度 O(log n) 等。
通过分析算法中的变量、数组、递归栈等关键部分,可以确定算法的空间复杂度。
3.3 执行效率评估除了时间复杂度和空间复杂度外,我们还可以通过实验和测试来评估算法的执行效率。
算法设计与分析学习报告(优秀范文5篇)

算法设计与分析学习报告(优秀范文5篇)第一篇:算法设计与分析学习报告算法课程学习报告持续13周的高级算法设计与分析课程结束了。
选修了这门课程的同学们即将迎来最后的考试。
回顾这半年以来关于这么课程的学习情况,我体会最深的是:不论是从深度还是从广度上,现在所习的算法比曾经学习的算法难度增加了很多。
但是邓教授极富经验的教学和详细的课件,为我的学习提供了很大的方便。
可是毕竟我以前的底子不够厚,基础不够劳,在听课中会出现跟不上教师思路的现象。
我也积极的采取措施,争取处理好这种情况。
总体说来,上完算法课,我还是学到了很多东西的。
下面我就对所学的内容进行梳理归纳,总结一下我在学习中的体会和研究心得。
算法课程的开课阶段,邓教授为我们简单介绍了算法,课堂上可能用到的参考资料,以及一些著名的算法方面的书籍,为我的学习提供潜在的工具。
我购买了一本教材——《算法导论》。
这本书够厚,够详细。
但是我一直没有机会仔细的研读。
我想有一天希望能够好好读一下。
在介绍算法的课堂上,我还了解了算法相关的一些基本概念,算法的重要性,还有算法的历史。
我印象最深的就是一个叫图灵的外国人。
对计算机科学与技术这个领域做出了图书贡献。
我个人认为,堪比爱因斯塔发现相对论的贡献。
都揭示了某个领域的本质。
开辟的一个领域的发展。
对于整个人类来说,他们这类人都是功不可没的。
已经不能简单的用伟人来形容他们。
但是人类社会需要这样的人,社会需要一些人的推动才能进步。
说到这里,我不禁要想,算法到底有什么用,也许答案是简单的,为了方便写程序实现系统功能。
这只是表面的用途。
我觉得最本质的作用是为了社会进步。
辩证唯物主义自然观中有关于科学技术的详细定义。
之所以产生科学技术是为了发挥人的主观能动性去改造自然。
学习和研究算法正是为了让人在一定的限度内改造自然。
我不是在扯,而是在写算法报告和背自然辩证法资料的时候产生的心得体会,不知道算不算邓教授要求的心得。
介绍完算法历史以后,就进入的真正的算法设计与分析的学习。
算法设计与分析实验报告

算法设计与分析实验报告《算法设计与分析》实验报告实验⼀递归与分治策略应⽤基础学号:**************姓名:*************班级:*************⽇期:2014-2015学年第1学期第九周⼀、实验⽬的1、理解递归的概念和分治法的基本思想2、了解适⽤递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析⽅法⼆、实验内容任务:以下题⽬要求应⽤递归与分治策略设计解决⽅案,本次实验成绩按百分制计,完成各⼩题的得分如下,每⼩题要求算法描述准确且程序运⾏正确。
1、求n个元素的全排。
(30分)2、解决⼀个2k*2k的特殊棋牌上的L型⾻牌覆盖问题。
(30分)3、设有n=2k个运动员要进⾏⽹球循环赛。
设计⼀个满⾜要求的⽐赛⽇程表。
(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运⾏报告。
三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; icout << list[i] << " ";cout << endl;return;}else{for (int i=m; i{swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输⼊排列数据总个数:"; cin>>n;cout<<"请输⼊数据:";{cin>>a[i];}cout<<"该数据的全排列:"<Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验⼆递归与分治策略应⽤提⾼学号:**************姓名:*************班级:*************⽇期:2014-2015学年第1学期⼀、实验⽬的1、深⼊理解递归的概念和分治法的基本思想2、正确使⽤递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析⽅法⼆、实验内容任务:从以下题⽬中任选⼀题完成,要求应⽤递归与分治策略设计解决⽅案。
算法设计与分析实验报告

算法设计与分析实验报告1. 引言本实验旨在设计和分析一个算法,解决特定的问题。
通过对算法的设计、实现和性能分析,可以对算法的优劣进行评估和比较。
本报告将按照以下步骤进行展开:1.问题描述2.算法设计3.算法实现4.性能分析5.结果讨论和总结2. 问题描述在本实验中,我们面临的问题是如何在一个给定的无序数组中寻找一个特定元素的位置。
具体而言,给定一个包含n个元素的数组A和一个目标元素target,我们的目标是找到target在数组A中的位置,如果target不存在于数组中,则返回-1。
3. 算法设计为了解决上述问题,我们设计了一个简单的线性搜索算法。
该算法的思想是从数组的第一个元素开始,逐个比较数组中的元素与目标元素的值,直到找到匹配的元素或搜索到最后一个元素。
算法的伪代码如下:function linear_search(A, target):for i from 0 to len(A)-1:if A[i] == target:return ireturn -14. 算法实现我们使用Python编程语言实现了上述线性搜索算法。
以下是算法的实现代码:def linear_search(A, target):for i in range(len(A)):if A[i] == target:return ireturn-15. 性能分析为了评估我们的算法的性能,我们进行了一系列实验。
我们使用不同大小的数组和不同目标元素进行测试,并记录了每次搜索的时间。
实验结果显示,线性搜索算法的时间复杂度为O(n),其中n是数组的大小。
这是因为在最坏的情况下,我们需要遍历整个数组才能找到目标元素。
6. 结果讨论和总结通过对算法的设计、实现和性能分析,我们可以得出以下结论:1.线性搜索算法是一种简单但有效的算法,适用于小规模的数据集。
2.线性搜索算法的时间复杂度为O(n),在处理大规模数据时可能效率较低。
3.在实际应用中,我们可以根据具体的问题和数据特征选择合适的搜索算法,以提高搜索效率。
算法设计与分析第二版实践报告总结

算法设计与分析第二版实践报告总结下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!算法设计与分析第二版实践报告总结引言在计算机科学领域,算法设计与分析是一项至关重要的工作。
算法设计与分析 实验报告

算法设计与分析实验报告算法设计与分析实验报告一、引言在计算机科学领域,算法设计与分析是非常重要的研究方向。
本次实验旨在通过实际案例,探讨算法设计与分析的方法和技巧,并验证其在实际问题中的应用效果。
二、问题描述本次实验的问题是求解一个整数序列中的最大子序列和。
给定一个长度为n的整数序列,我们需要找到一个连续的子序列,使得其和最大。
三、算法设计为了解决这个问题,我们设计了两种算法:暴力法和动态规划法。
1. 暴力法暴力法是一种朴素的解决方法。
它通过枚举所有可能的子序列,并计算它们的和,最终找到最大的子序列和。
然而,由于需要枚举所有子序列,该算法的时间复杂度为O(n^3),在处理大规模数据时效率较低。
2. 动态规划法动态规划法是一种高效的解决方法。
它通过定义一个状态转移方程,利用已计算的结果来计算当前状态的值。
对于本问题,我们定义一个一维数组dp,其中dp[i]表示以第i个元素结尾的最大子序列和。
通过遍历整个序列,我们可以利用状态转移方程dp[i] = max(dp[i-1]+nums[i], nums[i])来计算dp数组的值。
最后,我们返回dp数组中的最大值即为所求的最大子序列和。
该算法的时间复杂度为O(n),效率较高。
四、实验结果与分析我们使用Python编程语言实现了以上两种算法,并在相同的测试数据集上进行了实验。
1. 实验设置我们随机生成了1000个整数作为测试数据集,其中包含正数、负数和零。
为了验证算法的正确性,我们手动计算了测试数据集中的最大子序列和。
2. 实验结果通过对比实验结果,我们发现两种算法得到的最大子序列和是一致的,验证了算法的正确性。
同时,我们还对两种算法的运行时间进行了比较。
结果显示,暴力法的运行时间明显长于动态规划法,进一步证明了动态规划法的高效性。
五、实验总结通过本次实验,我们深入了解了算法设计与分析的方法和技巧,并通过实际案例验证了其在解决实际问题中的应用效果。
我们发现,合理选择算法设计方法可以提高算法的效率,从而更好地解决实际问题。
《算法设计与分析》课程实验报告 (分治法(三))

《算法设计与分析》课程实验报告实验序号:04实验项目名称:实验4 分治法(三)一、实验题目1.邮局选址问题问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算邮局的最佳位置。
2.最大子数组问题问题描述:对给定数组A,寻找A的和最大的非空连续子数组。
3.寻找近似中值问题描述:设A是n个数的序列,如果A中的元素x满足以下条件:小于x的数的个数≥n/4,且大于x的数的个数≥n/4 ,则称x为A的近似中值。
设计算法求出A的一个近似中值。
如果A中不存在近似中值,输出false,否则输出找到的一个近似中值4.循环赛日程表问题描述:设有n=2^k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。
二、实验目的(1)进一步理解分治法解决问题的思想及步骤(2)体会分治法解决问题时递归及迭代两种不同程序实现的应用情况之差异(3)熟练掌握分治法的自底向上填表实现(4)将分治法灵活于具体实际问题的解决过程中,重点体会大问题如何分解为子问题及每一个大问题涉及哪些子问题及子问题的表示。
三、实验要求(1)写清算法的设计思想。
(2)用递归或者迭代方法实现你的算法,并分析两种实现的优缺点。
(3)根据你的数据结构设计测试数据,并记录实验结果。
(4)请给出你所设计算法的时间复杂度的分析,如果是递归算法,请写清楚算法执行时间的递推式。
四、实验过程(算法设计思想、源码)1.邮局选址问题(1)算法设计思想根据题目要求,街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
《算法设计与分析》实验报告

《算法设计与分析》实验报告网络10-1 李俊实验一分治与递归基本题一:基本递归算法四、程序清单:#include <iostream>using namespace std;int q(int n ,int m){if((n<1) || (m<1) )return 0;if((n==1) || (m==1)) return 1;if(n<m) return q(n,n);if(n==m) return q(n,m-1)+1;return q(n,m-1)+q(n-m,m);}int main (){int a,b,c;int q(int n, int m);cout << "please input a and b" <<endl;cin >>a>>b;c=q(a,b);cout <<"整数的划分为:"<<c<<endl;return 0;}测试数据及结果如下图所示:基本题二:棋盘覆盖问题程序清单:#include<iostream>#include<iomanip>using namespace std;int Board[1024][1024];//模拟棋盘int tile=0;//骨牌编号,从0开始void ChessBoard(int tr, int tc, int dr, int dc, int size);void OutputBoard(int size);int main(){int size,dr,dc;cout<<"请输入方阵的规格k(方阵为k*k,须为2的幂): ";cin>>size;cout<<"请输入特殊方格的行号(矩阵下标由零开始计算,即0~k-1): "; cin>>dr;cout<<"请输入特殊方格的列号(矩阵下标由零开始计算,即0~k-1): "; cin>>dc;ChessBoard(0,0,dr,dc,size);// 覆盖特殊棋盘OutputBoard(size);//输出覆盖后的棋盘return 0;}void ChessBoard(int tr,int tc,int dr,int dc,int size){if(size==1)return;int t=tile++,//L型骨牌号s=size/2;//分割棋盘//覆盖左角子棋盘if(dr<tr+s&&dc<tc+s)//特殊方格在此棋盘中ChessBoard(tr,tc,dr,dc,s);else{//本棋盘中没有特殊方格Board[tr+s-1][tc+s-1]=t;//把三格板t放在右下角,将此棋盘转化为特殊棋盘 ChessBoard(tr,tc,tr+s-1,tc+s-1,s);//覆盖其余部分}//覆盖右上角棋盘if(dr<tr+s && dc>=tc+s)//特殊方格在此棋盘中ChessBoard(tr,tc+s,dr,dc,s);else{//本棋盘中没有特殊方格Board[tr+s-1][tc+s]=t;//把三格板t放在左下角,将此棋盘转化为特殊棋盘 ChessBoard(tr,tc+s,tr+s-1,tc+s,s);// 覆盖其余部分}//覆盖左下角棋盘if(dr>=tr+s&&dc<tc+s)//特殊方格位于本棋盘ChessBoard(tr+s,tc,dr,dc,s);else {//本棋盘中没有特殊方格Board[tr+s][tc+s-1]=t;//把三格板t放在右上角,将此棋盘转化为特殊棋盘 ChessBoard(tr+s,tc,tr+s,tc+s-1,s);//覆盖其余部分}// 覆盖右下角棋盘if (dr>=tr+s&&dc>=tc+s)//特殊方格位于本棋盘ChessBoard(tr+s,tc+s,dr,dc,s);else{//本棋盘中没有特殊方格Board[tr+s][tc+s]=t;// 把三格板t放在左上角,将此棋盘转化为特殊棋盘ChessBoard(tr+s,tc+s,tr+s,tc+s,s);//覆盖其余部分}}void OutputBoard(int size){int i,j;for(i = 0; i < size; i++){for (j = 0; j < size; j++)cout << setw (5) << Board[i][j];cout << endl;}}测试数据及结果如下图所示:提高题一:二分搜索1、设a[0:n-1]是一个已排好序的数组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.实验目的和要求:熟悉动态规划算法的设计思想。