四川师范大学《算法设计与分析》实验报告
算法设计与分析实验报告三篇
算法设计与分析实验报告一实验名称统计数字问题评分实验日期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'; }}五.程序调试中的问题调试过程,页码出现报错。
《算法设计与分析》实验报告实验一...
《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期: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; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; 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<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。
算法分析实验三报告
《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.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;}。
算法设计与分析实验报告(模版)
武汉工程大学计算机科学与工程学院《算法设计与分析》实验报告专业班级实验地点学生学号指导教师学生姓名实验时间实验项目算法基本工具和优化技巧实验类别基本性实验实验目的及要求目的与要求:练习算法基本工具和优化技巧的使用实验内容要点:1、熟悉循环和递归的应用2、熟悉数据结构在算法设计中的应用3、了解优化算法的基本技巧4、掌握优化算法的数学模型成绩评定表类别评分标准分值得分合计上机表现积极出勤、遵守纪律主动完成实验设计任务30分实验报告及时递交、填写规范内容完整、体现收获70分说明:评阅教师:日期:年月日一、狼找兔子问题:一座山周围有n个洞,顺时针编号为0,1,2.,…,n-1。
一只狼从0号洞开始,顺时针方向计数,每当经过第m个洞时,就进洞找兔子。
输入m,n,问兔子有没有幸免的机会?如果有,该藏哪里?代码设计:。
结果:。
二、有52张牌,使他们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张开始,凡是4的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上,以此类推,直到翻的牌超过104张为止。
统计最后有几张正面朝上,以及他们的位置号。
代码设计:。
结果:。
三、A、B、C、D、E 5人为某次竞赛的前5名,他们在名次公布前猜名次。
A说:B得第三名,C得第五名。
B说:D得第二名,E得第四名。
C说:B得第一名,E得第四名。
D说:C得第一名,B得第二名。
E说:D得第二名,A得第三名。
结果每个人都猜对了一半,实际名次是什么呢?代码设计:。
结果:。
算法设计实训报告
一、实训背景随着计算机科学技术的飞速发展,算法作为计算机科学的核心,其设计与应用越来越受到重视。
为了提高我们的算法设计能力,培养解决实际问题的能力,我们开展了为期一个月的算法设计实训。
本次实训以《算法设计与分析》课程为基础,通过理论学习、实验操作和实践应用,使我们深入理解了算法的基本概念、设计方法和分析技巧。
二、实训内容1. 理论学习(1)回顾了算法的基本概念,包括算法、算法复杂度、时间复杂度和空间复杂度等。
(2)学习了常用的算法设计方法,如分治法、动态规划、贪心算法、回溯法等。
(3)了解了不同算法的应用场景和适用范围。
2. 实验操作(1)使用C++语言实现了多种算法,如快速排序、归并排序、二分查找、插入排序等。
(2)针对实际问题,设计了相应的算法,如矩阵链相乘、背包问题、最小生成树等。
(3)对实验结果进行了分析,对比了不同算法的性能。
3. 实践应用(1)以小组为单位,针对实际问题进行算法设计,如数字三角形、投资问题等。
(2)编写程序代码,实现所设计的算法。
(3)对程序进行调试和优化,提高算法效率。
三、实训成果1. 提高了算法设计能力:通过实训,我们掌握了多种算法设计方法,能够根据实际问题选择合适的算法。
2. 增强了编程能力:实训过程中,我们熟练掌握了C++编程语言,提高了编程技巧。
3. 深化了算法分析能力:通过对算法复杂度的分析,我们能够更好地理解算法性能。
4. 培养了团队合作精神:在实训过程中,我们学会了与他人沟通、协作,共同完成任务。
四、实训总结1. 实训过程中,我们遇到了许多困难,如算法设计思路不明确、编程错误等。
通过查阅资料、请教老师和同学,我们逐步克服了这些问题。
2. 实训过程中,我们认识到算法设计的重要性。
一个好的算法可以显著提高程序运行效率,解决实际问题。
3. 实训过程中,我们学会了如何将实际问题转化为数学模型,并设计相应的算法。
4. 实训过程中,我们提高了自己的自学能力和解决问题的能力。
算法设计与分析实验报告
算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。
本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。
一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。
在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。
通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。
二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。
在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。
我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。
三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。
在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。
我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。
四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。
在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。
我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。
五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。
在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。
在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。
在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。
《算法设计与分析》课程实验报告 (贪心算法(一))
《算法设计与分析》课程实验报告实验序号:07实验项目名称:实验8 贪心算法(一)一、实验题目1.删数问题问题描述:键盘输入一个高精度的正整数N(不超过250 位),去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。
编程对给定的N 和k,寻找一种方案使得剩下的数字组成的新数最小。
若输出前有0则舍去2.区间覆盖问题问题描述:设x1,x2,...xn是实轴上的n个点。
用固定长度为k的闭区间覆盖n个点,至少需要多少个这样的固定长度的闭区间?请你设计一个有效的算法解决此问题。
3.会场安排问题问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。
设计一个有效的贪心算法进行安排。
(这个问题实际上是著名的图着色问题。
若将每一个活动作为图的一个顶点,不相容活动间用边相连。
使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。
)4.导弹拦截问题问题描述:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
给定导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
二、实验目的(1)通过实现算法,进一步体会具体问题中的贪心选择性质,从而加强对贪心算法找最优解步骤的理解。
(2)掌握通过迭代求最优的程序实现技巧。
(3)体会将具体问题的原始数据预处理后(特别是以某种次序排序后),常能用贪心求最优解的解决问题方法。
三、实验要求(1)写出题1的最优子结构性质、贪心选择性质及相应的子问题。
(2)给出题1的贪心选择性质的证明。
(3)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。
算法分析实验报告
《算法设计与分析》实验报告分治策略一、试验名称:分治策略( 1) 写出源程序,并编译运行( 2) 详细记录程序调试及运行结果二、实验目的(1) 了解分治策略算法思想(2) 掌握快速排序、归并排序算法(3) 了解其他分治问题典型算法三、实验内容(1) 编写一个简单的程序,实现归并排序。
(2) 编写一段程序,实现快速排序。
(3) 编写程序实现循环赛日程表。
设有n=2k 个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其它n-1 个选手各赛一次( 2)每个选手一天只能赛一场( 3)循环赛进行n-1 天四、算法思想分析(1) 编写一个简单的程序,实现归并排序。
将待排序元素分成大小大致相同的 2 个子集合,分别对 2 个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
(2) 编写一段程序,实现快速排序。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(3) 编写程序实现循环日赛表。
按分治策略,将所有的选手分为两组,n 个选手的比赛日程表就可以通过为n/2 个选手设计的比赛日程表来决定。
递归地用对选手进行分割,直到只剩下 2 个选手时,比赛日程表的制定就变得很简单。
这时只要让这 2 个选手进行比赛就可以了。
五、算法源代码及用户程序(1) 编写一个简单的程序,实现归并排序。
#include<iostream>#include<>#define MAX 10using namespace std;void merge(int array[],int p,int q,int r){int i,k;int begin1,end1,begin2,end2;int* temp = new int[r-p+1];begin1 = p;end1 = q;begin2 = q+1;end2 = r;k = 0;while((begin1 <= end1)&&(begin2 <= end2)){if(array[begin1] < array[begin2]){temp[k] = array[begin1];begin1++;}else{temp[k] = array[begin2];begin2++;}k++;}while(begin1 <= end1) {temp[k++] = array[begin1++];while(begin2 <= end2){temp[k++] = array[begin2++];}for(i = 0;i < (r-p+1);i++){array[p+i] = temp[i];}delete[](temp);}void merge_sort(int data[],int left,int right){if(left < right){int mid = (left + right)/2;merge_sort(data,left,mid);merge_sort(data,mid + 1,right); merge(data,left,mid,right);}}void main(){int number[MAX] = {0};srand(time(NULL));printf(" 排序前:");for(int i = 0; i < MAX; i++) {number[i] = rand() % 100; printf("%d ", number[i]);}cout<<endl;merge_sort(number,0,9);printf(" 排序后:");for(int j = 0; j < MAX; j++) { printf("%d ", number[j]);}(2) 编写一段程序,实现快速排序。
算法设计与分析实验报告
实验一找最大和最小元素与归并分类算法实现(用分治法)一、实验目的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)
《算法设计与分析》实验报告
学号:姓名:
实验一分治法求解众数问题
一、实验目的
1.掌握分治法的设计思想并能熟练应用;
2.理解分治与递归的关系。
二、实验题目
在一个序列中出现次数最多的元素称为众数,根据分治法的思想设计算法寻找众数。
三、实验程序
四、程序运行结果
实验二动态规划法求解单源最短路径问题
一、实验目的
1.深刻掌握动态规划法的设计思想;
2.熟练应用以上算法思想求解相关问题。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用动态规划法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验三贪心法求解单源点最短路径问题
一、实验目的
1.掌握贪心法的设计思想;
2.分析比较同一个问题采用不同算法设计思想求解的结果。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用贪心法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验四回溯法求解0/1背包问题
一、实验目的
1.掌握回溯法的设计思想;
2.掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;
二、实验题目
给定n种物品和一个容量为C的背包,选择若干种物品(物品不可分割),使得装入背包中物品的总价值最大。
采用回溯法求解该问题。
三、实验程序
四、程序运行结果。
算法分析实验一报告
《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.彼岸内容描述:突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。
现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei 必定会在该空间上碰到一种颜色的珠子。
如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。
比如经过长度为3的悬崖,碰到的珠子先后为“红黄蓝”,或者“蓝红黄”等类似情况就会坠落,而如果是“红黄红”或者“红黄黄”等情况则可以安全到达。
现在请问:yifenfei安然抵达彼岸的方法有多少种?输入:输入数据首先给出一个整数C,表示测试组数。
然后是C组数据,每组包含一个正整数n (n<40)。
输出:对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。
每组输出占一行。
例如:输入:2 输出:92 2132.统计问题内容描述:在一无限大的二维平面中,我们做如下假设:1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
输入:首先给出一个正整数C,表示有C组测试数据接下来的C行,每行包含一个整数n (n<=20),表示要走n步。
输出:请编程输出走n步的不同方案总数;每组的输出占一行。
例如:输入:2 输出:31 723.Message Decowing内容描述:The cows are thrilled because they've just learned about encrypting messages. Theythink they will be able to use secret messages to plot meetings with cows on other farms.Cows are not known for their intelligence. Their encryption method is nothing like DES or BlowFish or any of those really good secret coding methods. No, they are using a simple substitution cipher.The cows have a decryption key and a secret message. Help them decode it. The key looks like this:yrwhsoujgcxqbativndfezmlpkWhich means that an 'a' in the secret message really means 'y'; a 'b' in the secret message really means 'r'; a 'c' decrypts to 'w'; and so on. Blanks are not encrypted; they are simply kept in place. Input text is in upper or lower case, both decrypt using the same decryption key, keeping the appropriate case, of course.输入:* Line 1: 26 lower case characters representing the decryption key* Line 2: As many as 80 characters that are the message to be decoded输出:* Line 1: A single line that is the decoded message. It should have the same length as the second line of input.例如:输入:eydbkmiqugjxlvtzpnwohracsfKifq oua zarxa suar bti yaagrj fa xtfgrj输出:Jump the fence when you seeing me coming二、算法过程设计.第一题是一个典型的递归问题,通过对开始的几项附初始值,通过循环利用通项公式依次递归调用公式便可以得到第n项的值。
001.算法设计与分析实验一_20161104
实验编号: 1 四川师大《算法设计与分析》实验报告 2018 年 3 月 26 日计算机科学学院 2016 级 4 班实验名称:算法设计基础姓名:_ 邹琳___ 学号: 2016110458 指导老师:__苏菡 _ 实验成绩: __实验一算法设计基础一.实验目的(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
二.实验要求(1)认真填写实验报告,附加源代码(主要代码)和运行记录;(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析三.实验内容(1)统计数字问题(P8)(2)字典序问题(P8)(3)最多约数问题(P9)(4)最大间隙问题(P10)(5)设计算法求解Fibonacci数列的第110项的值,并统计和分析算法的时间性能。
注:(1)、(2)、(5)必做,其余选做四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)统计数字问题(P8)实验代码:#include<iostream>#include<stdlib.h>#include"fstream"using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");int main(){int number[10] = { 0 };int i, n, m;int page=11;fin >> page;for (int j = 1; j <= page; j++){n = j;while (n){m = n % 10;number[m]++;n = n / 10;}}for (i = 0; i <= 9; i++){fout << number[i] << endl;}fin.close();fout.close();return 0;}运行截图:(2)字典序问题(P8)实验代码:#include<iostream>#include<stdlib.h>#include<cstring>#include"fstream"using namespace std;int dictionary(int m, int n){//计算小于k位的字符串有多少个int letter, a, b;letter = a = b = 1;if (m != 0){for (int i = n; i > n - m; i++)a = a*i;for (int j = 2; j <= m; j++)b = b*j;letter = a / b;}return letter;}int main(){freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);int number;cin >> number;for (int k = 0; k < number; k++){int i, j;char char1[10];int char2[10];cin >> char1;int sum = 1;int start = 1;int n = strlen(char1); //获取字符串的长度for (i = 1; i<n; i++)sum += dictionary(i, 26);//计算字母是字母表中的第几个位置for (i = 0; i < n; i++)char2[i] = char1[i] - 96;for (i = n; i >= 1; i--){for (j = 1; j < char2[n - i]; j++){sum += dictionary(i - 1, 26 - j);}start = char2[n - i] + 1;}cout << sum << endl;}return 0;}运行截图:(3)最多约数问题(P9)实验代码:#include<iostream>#include<stdlib.h>#include"fstream"using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");int main(){char ch[2] = { 1,36 };fin >> ch;int count, maxprime, maxdiv;//记录约数的个数,最多的约数和约数最多的数int i, j, k;//输入数的区间范围maxprime = 0; maxdiv = 0;for (i = ch[0]; i <= ch[1]; ++i)//求判断当前数的约数{k = i; count = 0;for (j = 1; j <= i; j++){if (i%j == 0){++count;}}}if (count>maxprime){maxprime = count;maxdiv = i - 1;}//printf("the maxdiv is:%d\n", maxdiv);//printf("the maxprime is:%d", maxprime);fout << maxprime << endl;fin.close();fout.close();return 0;}运行截图:(4)最大间隙问题(P10)实验代码:#include<iostream>#include<stdio.h>#include"fstream"#include<algorithm>using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");double a[5] = {2.3,3.1,7.5,1.5,6.3}; int main(){int t=5;double x = 0.0;double max = 0.0;fin >> t;for (int i = 0; i<t; i++){fin>> a[i];}sort(a, a + t);for (int i = 0; i<t - 1; i++){x = a[i + 1] - a[i];if (x>max) {max = x;}}fout << max << endl;fin.close();fout.close();return 0;}运行截图:(5)设计算法求解Fibonacci数列的第110项的值,并统计和分析算法的时间性能。
《算法设计与分析》课程实验报告 (算法问题求解基础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到100的所有数字,55在这个序列中。
2.当没找到所要寻找的数字时,输出该数据并不存在于数据库中:0并不存在于这个序列中。
一、时间复杂性分析:1.最好情况下:这里的最好情况,即为第一次查找就找到了要找的数据,故时间复杂性为O (1)。
2.最坏情况下:这里的最坏情况意味着要将所有数据都找一遍最后才能找到要查找的数据,随着数据库的增大,查找次数会随之增长,故其时间复杂度为O (n )。
3.平均情况下:这种情况考虑了数据时等概率的分布于数据库中。
ASL=-101-121111=2=(1*2+2*2+...+*2)log (+1)-1nkj k i i i j p c j k n nn==≈∑∑折半查找的时间复杂性为O (2log n )。
二、空间复杂度分析:这里查找的过程中并不需要额外的空间,只需要存放数据的空间,故空间复杂度为O (n ),n 为数组的大小。
三、算法功能:其功能主要是用来查找数据,若对它进行一下拓展,可以由自主确定数据库,并可对他进行操作;这里的数据也可以不只是包括整数。
实验二结果:1.当数组的容量不大于0时,显示错误:2.当输入数据错误时,显示错误:3.当输入正确时的显示结果:一、时间复杂性分析:1.最好情况下:T (n )≤2 T (n /2)+n ≤2(2T (n /4)+n /2)+n =4T (n /4)+2n ≤4(2T (n /8)+n /4)+2n =8T (n /8)+3n … … …≤nT (1)+n log 2n =O (n log 2n ) 因此,时间复杂度为O (n log 2n )。
2.最坏情况下:待排序记录序列正序或逆序,每次划分只得到一个比上一次划分少一个记录的子序列(另一个子序列为空)。
此时,必须经过n -1次递归调用才能把所有记录定位,而且第i 趟划分需要经过n -i 次关键码的比较才能找到第i 个记录的基准位置,因此,总的比较次数为: 因此,时间复杂度为O (n 2)。
算法设计与分析 实验报告
算法设计与分析实验报告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周的高级算法设计与分析课程结束了。
选修了这门课程的同学们即将迎来最后的考试。
回顾这半年以来关于这么课程的学习情况,我体会最深的是:不论是从深度还是从广度上,现在所习的算法比曾经学习的算法难度增加了很多。
但是邓教授极富经验的教学和详细的课件,为我的学习提供了很大的方便。
可是毕竟我以前的底子不够厚,基础不够劳,在听课中会出现跟不上教师思路的现象。
我也积极的采取措施,争取处理好这种情况。
总体说来,上完算法课,我还是学到了很多东西的。
下面我就对所学的内容进行梳理归纳,总结一下我在学习中的体会和研究心得。
算法课程的开课阶段,邓教授为我们简单介绍了算法,课堂上可能用到的参考资料,以及一些著名的算法方面的书籍,为我的学习提供潜在的工具。
我购买了一本教材——《算法导论》。
这本书够厚,够详细。
但是我一直没有机会仔细的研读。
我想有一天希望能够好好读一下。
在介绍算法的课堂上,我还了解了算法相关的一些基本概念,算法的重要性,还有算法的历史。
我印象最深的就是一个叫图灵的外国人。
对计算机科学与技术这个领域做出了图书贡献。
我个人认为,堪比爱因斯塔发现相对论的贡献。
都揭示了某个领域的本质。
开辟的一个领域的发展。
对于整个人类来说,他们这类人都是功不可没的。
已经不能简单的用伟人来形容他们。
但是人类社会需要这样的人,社会需要一些人的推动才能进步。
说到这里,我不禁要想,算法到底有什么用,也许答案是简单的,为了方便写程序实现系统功能。
这只是表面的用途。
我觉得最本质的作用是为了社会进步。
辩证唯物主义自然观中有关于科学技术的详细定义。
之所以产生科学技术是为了发挥人的主观能动性去改造自然。
学习和研究算法正是为了让人在一定的限度内改造自然。
我不是在扯,而是在写算法报告和背自然辩证法资料的时候产生的心得体会,不知道算不算邓教授要求的心得。
介绍完算法历史以后,就进入的真正的算法设计与分析的学习。
算法设计与分析第二版实践报告总结
算法设计与分析第二版实践报告总结下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!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∣度量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main()
{ int n,m; cout<<"分别输入 m 和 n 的值(m 为被划分数,n 为最大加数)"<<endl; cin>>m>>n; cout<<"划分数为:"<<endl; cout<<q(m,n)<<endl; system("pause"); }
(2) 设计算法求解 n 个互异元素的全排列的算法并编程实现(P13) ,并在此基础 上修改程序,使其能解决有重复元素的排列问题(P41 算法实现题 2-5) 。 #include "iostream" #include <stdlib.h> #include <fstream.h>
for( i=a;i<b;i++) { if(number[i]>number[i+1]) max=number[i]; else max=number[i+1]; }
fout<<max<<endl; fin.close();
fout.close(); }
(4) 最大间隙问题(P10) (5) 设计算法求解 fibonacci 数列的第 110 项的值。 (6) 设计算法求解尽可能多的完美数(完全数) 。 注:至少选择其中 2 题完成
int i,n,m; int page;//page 是书的总页数 int number[10]={0};
void main() { fin>>page; for (int j=1;j<=page;j++) { n=j; while(n) { m=n%10; ++number[m]; n=n/10; } } for ( i=0;i<=9;i++) { fout<<number[i]<<endl; } fin.close();
2.
能对给定问题分析出恰当的数学模型,并设计出解决方案,将算法用高级语言 (C,VC++等)编程实现。
三、实验项目及内容提要
算法设计与分析实验课程
序 实
实验名称
学
必要
号
验 项 目 编 号
时
做
做
分 数
基 本 操 作
验 证
综 设 合 计
1
1
算法设计 基础 递归与分 治策略及 其应用 动态规划 及其应用
} } fout<<count; fin.close(); fout.close(); } (7) 设计求解双色 hanoi 问题的算法,并编程实现。 (P43 算法实现题 2-11) 注:至少选择其中 3 题完成
实验三
动态规划及其应用 6 学时)
(验证型、设计型实验 1.目的要求
(1) 理解动态规划算法的概念和基本要素,并能和分治法进行比较。 (2) 掌握设计动态规划算法的步骤,并编程实现有关算法。 (3) 理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反 复努力和重新修正的结果。 (4) 对设计好的算法,要分析算法的时间和空间复杂度。
2
2
6
√
√
√
3
3
6
√
√
√
4
4
贪心算法 及其应用
6
√
√
√
54
5
回溯法及 其应用
6
√
√
√
6
6
分支限界 法及其应 用
4
√
√
√
7
7
线性规划 问题的求 解
4
√
√
三、实验内容安排:
实验一 算法设计基础 (验证型实验 4 学时) 1.实验目的 (1) 巩固程序设计语言基础知识,熟悉文件操作等。 (2) 对给定问题, 能设计算法并编程实现问题的求解, 并分析算法的时间复杂性。 2.实验要求 (1) 认真填写实验报告,附加源代码(主要代码)和运行记录;
int q(int m,int n) { if ((n<1)||(m<1)) return 0; if ((n==1)||(m==1))return 1; if (m<n) return q(m,m); if (m==n) return q(m,n-1)+1; return q(m,n-1)+q(m-n,n); }
void main() { int number,result; int count=1; fin>>number;//输入整数 for(int i=2;i<number;i++) { if(number%i==0) { result=number/i; //result 是因子 for(int i=2;i<=result;i++) { if(result%i==0) count++; }
2.实验内容 (1) 编程实现矩阵连乘问题的求解。 (P47) (2) 分别采用分治法和动态规划法求解实现最大子段和问题, 并编程实现。 (P54) #include "iostream" #include <stdlib.h> using namespace std; int MaxSubSum(int *a,int left,int right) //最大子段和 { int sum=0; if(left==right) sum=a[left]>0 ? a[left] :0; else { int center=(left+right)/2; int leftsum=MaxSubSum(a,left,center); 分治法
ifstream fin("input.txt"); ofstream fout("output.txt"); using namespace std;
int count=0; int check(char list[],int k ,int m ) //判断是否互异,重复返回 0 { if( m > k) for(int i = k ; i< m ; i++) if( list[i] == list[m] ) return 0 ; return 1 ; }
二、实验课程目的与要求
计算机科学的一个核心问题是算法理论,本课程介绍非数值算法设计的策略与技 术,同时介绍算法的复杂性的概念通过对一些代表性算法的使用达到了解掌握与运用的 目的。 通过完成课程实验,使学生达到如下要求: 1. 熟悉各种基本常用算法的基本思想、适用范围,初步掌握算法分析的基本技巧 以及如何根据实际问题设计一个有效的算法。
声明:此文档只作为学习参考,不得用作它途! 《算法设计与分析》实验教学大纲
实验学时:32 课程性质: 教材及参考书:
1. 《计算机算法设计与分析》 ,王晓东,北京:电子工业出版社,2012 2. 《算法与数据结构》 ,傅清祥等著,北京:电子工业出版社,2003 3. 《计算机算法导引—设计与分析》 ,卢开澄著,北京:清华大学出版社,2001
实验个数:7
实验学分:1
适用专业:计算机科学与技术、软件工程
大纲执笔人:刘芳 一、 实验课的性质与任务
大纲审定人: 郭涛
算法的设计与分析是计算机科学的核心问题之一,也是计算机科学与技术专业本科 及研究生的一门重要的专业基础课,其内容是研究计算机领域及其有关领域中的一些非 数值计算的常用算法。课程将覆盖计算机软件实现中常用的、有代表性的算法,并具有 一定的深度和广度,通过实验,使学生理解并掌握算法设计的基本技术,让学生具有针 对所给的问题设计和实现高效算法的基本能力。
fout.close(); return; } (2) 字典序问题(P8) (3) 最多约数问题(P9) #include "iostream" #include <stdlib.h> #include <fstream.h> ifstream fin("input.txt"); ofstream fout("output.txt"); using namespace std;
4
√
√
通过本次实验, 程序 设计语言基础知识, 熟悉文件操作等 掌握递归算法的设 计思想, 提高应用分 治法设计算法的技 能 掌握设计动态规划 算法的步骤, 并编程 实现有关算法。 通过本次实验,掌握 设计贪心算法的步 骤, 并编程实现有关 问题的求解 通过本实验, 理解回 溯法的深度搜索策 略, 掌握用回溯法解 题的算法框架。 通过本实验, 理解分 支限界法的剪枝搜 索策略, 掌握用分支 限界法算法框架 理解线性规划的算 法模型, 了解求解线 性规划的单纯形算 法,学会使用 Excel 求解线性规划问题。
(2) 对设计好的算法,测试运行实验数据,检查输出是否正确。并对算法的时间 和空间复杂度进行分析。 3.实验内容: (1) 统计数字问题(P8) #include "iostream" #include <stdlib.h> #include <fstream.h>
ifstream fin("input.txt"); ofstream fout("output.txt"); using namespace std;
实验二 递归与分治策略及其应用 (验证型、设计型实验 1.实验目的 (1) 进一步掌握递归算法的设计思想以及递归程序的调试技术。 (2) 提高应用分治法设计算法的技能 (3) 理解这样一个观点:分治和递归经常同时应用在算法设计中。 2.实验要求 (1) 认真填写实验报告,附加源代码(主要代码)和运行记录; (2) 对设计好的算法,要分析算法的时间和空间复杂度。 3.实验内容: (1) 设计算法求解整数的划分问题,对给定的整数,输出划分数。 (P14)并思考 如何实现输出每个具体的划分。 #include "iostream" #include <stdlib.h> using namespace std; 6 学时)