算法设计与分析课程设计报告样本
算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期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>。
算法课设实验报告(3篇)

第1篇一、实验背景与目的随着计算机技术的飞速发展,算法在计算机科学中扮演着至关重要的角色。
为了加深对算法设计与分析的理解,提高实际应用能力,本实验课程设计旨在通过实际操作,让学生掌握算法设计与分析的基本方法,学会运用所学知识解决实际问题。
二、实验内容与步骤本次实验共分为三个部分,分别为排序算法、贪心算法和动态规划算法的设计与实现。
1. 排序算法(1)实验目的:熟悉常见的排序算法,理解其原理,比较其优缺点,并实现至少三种排序算法。
(2)实验内容:- 实现冒泡排序、快速排序和归并排序三种算法。
- 对每种算法进行时间复杂度和空间复杂度的分析。
- 编写测试程序,对算法进行性能测试,比较不同算法的优劣。
(3)实验步骤:- 分析冒泡排序、快速排序和归并排序的原理。
- 编写三种排序算法的代码。
- 分析代码的时间复杂度和空间复杂度。
- 编写测试程序,生成随机测试数据,测试三种算法的性能。
- 比较三种算法的运行时间和内存占用。
2. 贪心算法(1)实验目的:理解贪心算法的基本思想,掌握贪心算法的解题步骤,并实现一个贪心算法问题。
(2)实验内容:- 实现一个贪心算法问题,如活动选择问题。
- 分析贪心算法的正确性,并证明其最优性。
(3)实验步骤:- 分析活动选择问题的贪心策略。
- 编写贪心算法的代码。
- 分析贪心算法的正确性,并证明其最优性。
- 编写测试程序,验证贪心算法的正确性。
3. 动态规划算法(1)实验目的:理解动态规划算法的基本思想,掌握动态规划算法的解题步骤,并实现一个动态规划算法问题。
(2)实验内容:- 实现一个动态规划算法问题,如背包问题。
- 分析动态规划算法的正确性,并证明其最优性。
(3)实验步骤:- 分析背包问题的动态规划策略。
- 编写动态规划算法的代码。
- 分析动态规划算法的正确性,并证明其最优性。
- 编写测试程序,验证动态规划算法的正确性。
三、实验结果与分析1. 排序算法实验结果:- 冒泡排序:时间复杂度O(n^2),空间复杂度O(1)。
算法设计与分析实验报告格式

《算法设计与分析》实验报告班级姓名学号2014年 11月 18日目录实验一二分查找程序实现………………………………………………………………01页实验二棋盘覆盖问题…………………………………………………………………04页实验三 0-1背包问题的动态规划算法设计……………………………………….07页实验四背包问题的贪心算法………………………………………………………10页指导教师对实验报告的评语成绩:指导教师签字:年月日实验一:二分查找程序的实现实验时间:2014年11月13日,星期四第三、四节,地点:J13#328二、实验目的及要求1)、实验目的:1. 掌握分治算法的基本思想(分—治—合)、技巧和效率分析方法。
2. 熟练掌握用递归设计分治算法的基本步骤。
3. 学会分治算法解决实际问题。
2)、实验要求:实现二分搜索的递归与非递归程序,并进行跟踪分析其执行过程,体会两者的执行效率。
三、实验环境Windows 2008C++四、实验内容实现二分搜索的递归与非递归程序,并进行跟踪分析其执行过程,体会两者的执行效率。
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部分继续搜索x。
如果x>a[n/2],则我们只要在数组a的右半部分继续搜索x。
直到找到x,并返回x所在数组中的下标。
五、算法描述及实验步骤它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。
如果x>a[n/2],则我们只要在数组a的右半部继续搜索xint BinarySearch(int a[],int x,int n){//非递归方法int left=0;int right=n-1;while(left<=right){int middle=(left+right)/2;if (x==a[middle]) return middle;if (x>a[middle]) left=middle+1;else right=middle-1;}return -1;}//递归int BinSearch(int a[],int x,int low,int high){int mid;while(low<=high){mid=(low+high)/2;if(x==a[mid]) return mid;if(x<a[mid]) return(BinSearch(a,x,low,mid-1)); else return(BinSearch(a,x,mid+1,high));}return -1;}算法复杂性分析:容易看出,每执行一次算法的while循环,待搜索数组的大小减少一半。
《算法设计与分析》实验报告模板 (1)

《算法设计与分析》实验报告
学号:姓名:
实验一分治法求解众数问题
一、实验目的
1.掌握分治法的设计思想并能熟练应用;
2.理解分治与递归的关系。
二、实验题目
在一个序列中出现次数最多的元素称为众数,根据分治法的思想设计算法寻找众数。
三、实验程序
四、程序运行结果
实验二动态规划法求解单源最短路径问题
一、实验目的
1.深刻掌握动态规划法的设计思想;
2.熟练应用以上算法思想求解相关问题。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用动态规划法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验三贪心法求解单源点最短路径问题
一、实验目的
1.掌握贪心法的设计思想;
2.分析比较同一个问题采用不同算法设计思想求解的结果。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用贪心法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验四回溯法求解0/1背包问题
一、实验目的
1.掌握回溯法的设计思想;
2.掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;
二、实验题目
给定n种物品和一个容量为C的背包,选择若干种物品(物品不可分割),使得装入背包中物品的总价值最大。
采用回溯法求解该问题。
三、实验程序
四、程序运行结果。
算法分析与设计-课程设计报告

XXXX大学算法设计与分析课程设计报告院(系):年级:姓名:专业:计算机科学与技术研究方向:互联网与网络技术指导教师:X X X X 大学目录题目1 电梯调度 (1)1.1 题目描述 (1)1。
2 算法文字描述 (1)1。
3 算法程序流程 (4)1.4 算法的程序实现代码 (8)题目2 切割木材 (10)2.1题目描述 (10)2。
2算法文字描述 (10)2.3算法程序流程 (11)2.4算法的程序实现代码 (15)题目3 设计题 (17)3.1题目描述 (17)3.2 输入要求 (17)3.3输出要求 (17)3.4样例输入 (17)3.5样例输出 (17)3.6测试样例输入 (17)3。
7测试样例输出 (18)3。
8算法实现的文字描述 (18)3。
9算法程序流程 (19)3.10算法的程序实现代码 (20)算法分析与设计课程总结 (23)参考文献 (24)题目1 电梯调度1。
1 题目描述一栋高达31层的写字楼只有一部电梯,其中电梯每走一层需花费4秒,并且在每一层楼停靠的时间为10秒,乘客上下一楼需要20秒,在此求解最后一位乘客到达目的楼层的最短时间以及具体的停靠计划.例如:此刻电梯停靠需求为4 5 10(有三位乘客,他们分别想去4楼、5楼和10楼),如果在每一层楼都停靠则三位乘客到达办公室所需要的时间为3*4=12秒、4*4+10=26秒、4*9+2*10=56秒,则最后一位乘客到达办公室的时间为56秒,相应的停靠计划为4 5 10均停靠。
对于此测试用例电梯停靠计划方案:4 10,这样到第4楼的乘客所需时间为3*4=12秒,到第5楼的乘客所需时间为3*4+20=32秒,到第10楼的乘客所需时间为9*4+10=46秒,即最后到达目的楼层的顾客所需时间为46秒.输入要求:输入的第1行为整数n f1 f2 … fn,其中n表示有n层楼需要停靠,n=0表示没有更多的测试用例,程序终止运行。
f1 f2 … fn表示需要停靠的楼层(n 〈=30,2<=f1<f2…fn<=31),每一个数字都用一个空格隔开.输出要求:对于每一个测试用例,第1行输出最后一位乘客到达目的楼层所需时间,第2行输出停靠次数和相应的停靠方案,每一个数字用一个空格隔开。
《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计名称: 算法设计与分析
系 : 三系
学生姓名: 吴阳
班级: 12软件(2)班
学号: 0311232
成绩:
指导教师: 秦川
开课时间: 年一学期
一、问题描述
1.普通背包问题
给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
选择装入的背包的物品, 使得装入背包中的物品的总价值最大, 在选择物品i装入背包时, 能够选择物品i的一部分, 而不一定要全部装入背包, 1≤i≤n。
2.0/1背包问题
给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
选择装入的背包的物品, 使得装入背包中的物品的总价值最大, 在选择物品i装入背包时, 对于每种物品i只有两种选择, 即装入背包或者不装入背包, 不能将物品装入背包多次, 也不能只装入部分的物品i。
3.棋盘覆盖问题
在一个2k x 2k个方格组成的棋盘中恰有一个方格与其它的不同称为特殊方格, 想要求利用四种L型骨牌( 每个骨牌可覆盖三个方格) 不相互重叠覆盖的将除了特殊方格外的其它方格覆盖。
二、问题分析
1.普通背包问题
对于背包问题, 若它的一个最优解包含物品j, 则从该最优解中拿出所含的物品j的那部分重量W, 剩余的将是n-1个原重物品1, 2, ······, j-1, j+1, ·····, n以及重为Wi-W的物品j 中可装入容量为C-W的背包且具有最大价值的物品。
2.0/1背包问题
如果当前背包中的物品的总容量是cw, 前面的k-1件物品都已经决定好是否要放入包中, 那么第k件物品是否放入包中取决于不等式 cw + wk <= M (其中, wk为第k件物品的容量, M为背包的容量)( 此即约束条件)
然后我们再寻找限界函数, 这个问题比较麻烦, 我们能够回忆一下背包问题的贪心算法, 即物品按照物品的价值/物品的体积来从大到小排列, 然后最优解为( 1, 1, 1......., 1, t, 0, 0, ......) , 其中0<=t<=1;
因此, 我们在确定第k个物品到底要不要放入的时候(在前k-1个物品已经确定的情况下), 我们能够考虑我们能够达到的最大的价值, 即我们能够经过计算只放入一部分的k物品来计算最大的价值。
我们要确保当前选择的路径的最大的价值要大于我们已经选择的路径的价值。
这就是该问题的限界条件。
经过该条件, 能够减去很多的枝条, 大大节省运行时间。
3.棋盘覆盖问题
每次都对分割后的四个小方块进行判断, 判断特殊方格是否
在里面。
这里的判断的方法是每次先记录下整个大方块的左上角方格的行列坐标, 然后再与特殊方格坐标进行比较, 就能够知道特殊方格是否在该块中。
如果特殊方块在里面, 这直接递归下去求即可, 如果不在, 这根据分割的四个方块的不同位置, 把右下角、 左下角、 右上角或者左上角的方格标记为特殊方块, 然后继续递归。
在递归函数里, 还要有一个变量s 来记录边的方格数, 每次对方块进行划分时, 边的方格数都会减半, 这个变量是为了方便判断特殊方格的位置。
其次还要有一个变nCount 来记录L 型骨牌的数量。
三、 建立数学模型
1.普通背包问题
普通背包问题的数学描述为: 在选择物品i 装入背包时, 能够选择物品i 的一部分, 而不一定要全部装入背包, 1≤i ≤n 。
C>0,wi>0,vi>0,1≤i ≤n,要求找出一个n 元0-1向量( x1,x2,x3,·····, xn) ,xi ∈{0,1}, 1≤i ≤n,使得∑=n
i wixi 1≤C,
而且∑=n
xi 1i vi 达到最大。
2.0/1背包问题
0-1背包问题的数学描述为: 不能将物品装入背包多次, 也不能只装入部分的物品i 。
C>0,wi>0,vi>0,1≤i ≤n,要求找出一个n 元0-1向量( x1,x2,x3,·····, xn) ,xi ∈{0,1}, 1≤i ≤n,使得∑=n i wixi 1≤C,而且∑=n
xi 1i vi 达到最大。
3.棋盘覆盖问题
当k>0时, 将2k×2k棋盘分割为4个2^k-1×2^k-1 子棋盘(a)所示。
特殊方格必位于4个较小子棋盘之一中, 其余3个子棋盘中无特殊方格。
为了将这3个无特殊方格的子棋盘转化为特殊棋盘, 能够用一个L型骨牌覆盖这3个较小棋盘的会合处, 如 (b)所示, 从而将原问题转化为4个较小规模的棋盘覆盖问题。
递归地使用这种分割, 直至棋盘简化为棋盘1×1。
四、算法设计
1.普通背包问题
因为每一个物品都能够分割成单位块, 单位块的利益越大显
然总收益越大, 因此它局部最优满足全局最优, 能够用贪心法解决。
算法设计: 首先计算每种物品单位重量的价值Vi/Wi, 然后按单位重量价值从大到小进行排序, 根据贪心选择策略, 将尽可能多的
单位重量价值最高的物品装入背包。
或将这种物品全部装入背包后,
背包内的物品总重量未超过背包容量C, 则选择单位重量价值次高的物品并尽可能多地装入背包, 依此策略一直进行下去, 直到背包装满为止。
2.0/1背包问题
该0-1背包问题采用的是回溯算法, 回溯算法的基本解题步骤是:
( 1) 针对所给问题定义问题的解空间;
( 2) 确定易于搜索的解空间结构;
( 3) 以深度优先方式搜索解空间, 并在搜索过程中用剪枝函数避免无效的搜索。
算法设计:
a.物品有n种, 背包容量为C, 分别用p[i]和w[i]存储第i 种物品的价值和重量, 用
x[i]标记第i种物品是否装入背包, 用bestx[i]存储第i种物品的最优装载方案;
b. 用递归函数Backtrack (i,cp,cw)来实现回溯法搜索子集树( 形式参数i表示递归深
度, n用来控制递归深度, 形式参数cp和cw表示当前总价值和总重量, bestp表示当前
最优总价值) :
①若i >n, 则算法搜索到一个叶结点, 判断当前总价值是否最优:。