算法分析——实验一
实验报告算法分析
实验报告算法分析实验报告:算法分析引言在计算机科学领域中,算法是解决问题的一种方法或步骤的描述。
通过对算法的分析,我们可以评估其效率和性能,从而选择最优的算法来解决特定的问题。
本实验报告旨在介绍算法分析的基本概念和方法,并通过实例来说明其应用。
一、算法分析的背景算法分析是计算机科学中的重要研究领域,它关注如何评估算法的效率和性能。
在实际应用中,我们经常面临着需要在有限的时间内解决大规模问题的挑战。
因此,选择一个高效的算法是至关重要的。
算法分析的目标是通过定量分析算法的时间复杂度和空间复杂度,为选择最佳算法提供依据。
二、算法分析的方法1. 时间复杂度分析时间复杂度是衡量算法执行时间的一种指标。
通常使用大O表示法来表示时间复杂度。
通过计算算法执行所需的基本操作次数,可以得到算法的时间复杂度。
常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)和O(n^2)等。
时间复杂度越低,算法执行所需的时间越短。
2. 空间复杂度分析空间复杂度是衡量算法内存使用的一种指标。
通过计算算法执行所需的额外空间大小,可以得到算法的空间复杂度。
常见的空间复杂度有O(1)、O(n)和O(n^2)等。
空间复杂度越低,算法所需的内存空间越小。
三、算法分析的应用算法分析在计算机科学的各个领域都有广泛的应用。
以下是几个常见的应用示例:1. 排序算法排序算法是计算机科学中的经典问题之一。
通过对不同排序算法的时间复杂度进行分析,可以选择最适合特定需求的排序算法。
例如,快速排序算法的平均时间复杂度为O(n log n),在大规模数据排序中表现出色。
2. 图算法图算法是解决图结构相关问题的一种方法。
通过对图算法的时间复杂度和空间复杂度进行分析,可以选择最适合解决特定图问题的算法。
例如,广度优先搜索算法的时间复杂度为O(V+E),其中V和E分别表示图的顶点数和边数。
3. 动态规划算法动态规划算法是解决具有重叠子问题性质的问题的一种方法。
算法设计与分析的实验报告
实验一递归与分治策略一、实验目的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'; }}五.程序调试中的问题调试过程,页码出现报错。
《算法设计与分析》实验报告实验一...
《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期: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、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。
计算方法与计算 实验一误差分析
% 输出的量--每次迭代次数k和迭代值xk,
%
--每次迭代的绝对误差juecha和相对误差xiangcha,
误差分析
误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算 中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。 因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。同时, 由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法 的好坏会影响到数值结果的精度。 一、实验目的
因为运行后输出结果为: y 1.370 762 168 154 49, yˆ =1.370 744 664 189
38, R 1.750 396 510 491 47e-005, WU= 1.782 679 830 970 664e-005 104 . 所
以, yˆ 的绝对误差为 10 4 ,故 y
③ 运行后输出计算结果列入表 1–1 和表 1-2 中。
④ 将算法 2 的 MATLAB 调用函数程序的函数分别用 y1=15-2*x^2 和
y1=x-(2*x^2+x-15)/(4*x+1)代替,得到算法 1 和算法 3 的调用函数程序,将其保
存,运行后将三种算法的前 8 个迭代值 x1, x2 ,, x8 列在一起(见表 1-1),进行
的精确解 x* 2.5 比较,观察误差的传播.
算法 1 将已知方程化为同解方程 x 15 2x2 .取初值 x0 2 ,按迭代公式
xk1 15 2xk2
实验一 算法的时间复杂度分析
二:程序源代码
1:
(1)第一种方法:直接求和思想
#include <stdio.h>
main()
{
int i, n, sum=0;
printf("请从键盘输入数据\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+i;
printf("sum=%d\n",sum);
return 0;
}
(2)第二种方法:函数调用思想
# include<stdio.h>
int add(int m);
main(){
int n;
printf("请从键盘输入数据\n");
scanf("%d",&n);
printf("sum=%d\n",add(n));
return 0;
}
add(int m){
int i ,sum=0;
for(i=1;i<=m;i++)
sum=sum+i;
return sum;
}
2:(1)用数组实现方法:
#include"stdio.h"
#define MAX 10 //数组最大空间
#define N 7 //求7阶乘
main()
{
long a[MAX];
int i;
a[1]=1;
for(i=2;i<MAX;i++)
数值分析——实验1 秦九韶算法
实验1 秦九韶算法(贺俊杰 2020022060)一、实验目的人类的计算能力等于计算工具的效率与计算方法的效率的乘积,高效率计算方法大大减少了计算次数,从而也能较少舍入误差的传播和积累,构造高效率计算方法一直是科学计算的一个主要目的。
本次实验以完成秦九韶算法为契机,深入了解高效计算多项式结果的数值计算方法,同时加深对Matlab 环境的熟悉。
二、算法分析对于n 次多项式:1110()n n n n n P x a x a x a x a −−=+++ (1)可改写为嵌套形式:1210()((()))n n n n p x a x a x a x a x a −−=++++ (2)在(1)式中,n i n i a x −−需要计算n i −次乘法运算(其中0,1,1i n =−)和n 次加法运算,共需要进行(1)2n n+次乘法运算和n 次加法运算。
而在(2)式中,仅需要经过n 次乘法运算和n 次加法运算,能够极大地减少运算次数,提高运算效率。
根据程序设计地习惯,把公式(2)写成下来等价的地推形式:(1,2,)n n k y a y y x a k n −⇐⎧⎨⇐⋅+=⎩ (3)三、算法代码实现秦九韶算法Matlab 实现如下:Qinjiu.m 文件其中a 为多项式系数从高次向低次排列数组(缺项系数为0),n 为多项式多高次数,x 为变量。
四、实验结果1、 设543()851f x x x x =++−,计算()f x 在1,1.5,2.1,3x =上的值。
编写run_qinjiu.m 代码文件如下所示:run_qinjiu.m 文件取多项式系数a = [8, 5, 1, 0, 0, -1],运行结果如下图所示:图1 run_qinjiu.m 运行结果由图可知算法能正确运行。
2、 利用Matlab 库中的horner 命令,可直接把多项式变为如(2)式的嵌套形式。
编写run_horner.m 代码文件如下所示:程序运行结果如下图所示:从图中可看出,horner库函数可正确地将多项式转为嵌套形式。
算法分析实验一报告
《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.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项的值。
算法分析与设计实验报告1: 斐波那契数列(分治策略)
double b = 1;
double result = 0;
if (n <= 0)
{
return 0;
}
else if (n <= 2)
{
return 1;
}
else
{
for (i = 3; i <= n; i++)
{
result = a + b;
a = b;
b = result;
天津商业大学学生实验报告
开课实验室:开课时间2019年4月26日实验报告2019年4月26日
学院名称
信息工程学院
年级、专业、班
软件1803班
学号
20180822
姓名
丁智颖
同组姓名
无
课程名称
算法分析与设计
实验项目名称
实验一斐波那契数列(分治策略)指教师宋建材实验类型
验证□√综合□设计□创新□
成绩
教师评语:
}
return result;
}
}
///
//分治方法求解
///
double fib2(int n)
{
if (n <= 0)
{
return 0;
}
else if (n <= 2)
{
return 1; //递归终止条件
}
else
{
return fib2(n - 1) + fib2(n - 2); //递归
四、实验代码
#include <stdio.h>
double fib1(int n); //非递归生成下标为n的斐波那契数列元素
算法分析与设计实验报告
算法分析与设计实验报告实验一分治策略排序一、实验目的1)以排序问题为例,掌握分治法的基本设计策略;2)熟练掌握合并排序算法的实现;3)熟练掌握快速排序算法的实现;4) 理解常见的算法经验分析方法。
二、算法思路1. 合并排序算法思想:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作第三, 合并: 合并两个排好序的子序列,生成排序结果.最坏时间复杂度最好时间复杂度空间复杂度2.快速排序算法思想:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。
一躺快速排序的算法是:1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;5)、重复第3、4步,直到I=J;三、实验内容:1. 准备实验数据要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。
这些数作为本算法实验的输入数据。
2. 实现合并排序算法要求:实现mergesort算法。
输入:待排数据文件data.txt;输出:有序数据文件resultsMS.txt(注:建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeMS。
实验一斐波那契数列的实现算法及分析
实验一斐波那契数列的实现算法及分析斐波那契数列是一个经典的数学问题,定义如下:第0项为0,第1项为1,从第2项开始,每一项都是前两项的和。
即F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。
实现算法的一种简单方法是使用递归。
递归算法如下:```def fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```该算法的思想是将问题分解为更小的子问题,并将子问题的解合并以得到原问题的解。
在这个递归算法中,当n小于等于1时,直接返回n。
否则,递归调用fibonacci函数计算n-1和n-2的斐波那契数,并将结果相加。
然而,这种递归算法在计算较大的斐波那契数时会非常低效。
原因是它会重复计算许多相同的子问题。
例如,计算fibonacci(5)需要计算fibonacci(4)和fibonacci(3),而计算fibonacci(4)需要计算fibonacci(3)和fibonacci(2)。
递归算法会计算fibonacci(3)两次,浪费了计算资源。
为了解决这个问题,可以使用迭代算法来实现斐波那契数列。
迭代算法的思想是从前向后计算斐波那契数,而不是递归地计算。
可以使用一个循环来不断更新前两个斐波那契数,并计算下一个数。
```def fibonacci(n):if n <= 1:return nelse:a,b=0,1for i in range(2, n+1):a,b=b,a+breturn b```该算法的时间复杂度是O(n),空间复杂度是O(1)。
它避免了递归算法中重复计算的问题,因此在计算较大的斐波那契数时更高效。
综上所述,斐波那契数列可以使用递归或迭代算法来实现。
递归算法简单易懂,但在计算较大的斐波那契数时效率较低。
迭代算法通过避免重复计算提高了效率,并且具有较低的时间和空间复杂度。
算法设计与实验分析一:字符串匹配
算法设计与实验分析一:字符串匹配班级:网络1101 姓名:齐岳川学号:1111610210 日期:2013.3.19一:实验名称:字符串匹配二:实验内容:1、深刻理解并掌握蛮力算法的设计思想;2、提高应用蛮力算法设计算法的技能;3、理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能BF算法:基本思想:从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较两者的后续字符;若不相等,则从主串S的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,若T中的字符全部比较完毕,则说明本趟匹配成功;若最后一轮匹配的起始位置是n-m,则主串S中剩下的字符不足够匹配整个模式T,匹配失败。
这个算法称为朴素的模式匹配算法,简称BF算法。
三:程序清单:#include"stdio.h"#include"conio.h"#include<iostream>int BF(char s[],char t[]){int i;int a;int b;int m,n;m=strlen(s);n=strlen(t);printf("\nBF算法\n");for(i=0;i<m;i++){b=0;a=i;while(s[a]==t[b]&&b!=n){a++;b++;}if(b==n){printf("查找成功!!\n\n");return 0;}}printf("找不到%s\n\n",t);return 0;}void main(){char s[]={'\0'};int n=10;char t[]={'\0'};printf("\n实验一串匹配问题\n");printf("\n主串S\nS=");scanf("%s",&s);printf("\n子串T\nT=");scanf("%s",&t);printf("主串长%d,子串长为%d\n",strlen(s),strlen(t));BF(s,t);}运行结果:成功失败成功。
算法分析与设计实验报告 完整版
《算法分析与设计》课程实验实验报告专业:计算机科学与技术班级:姓名:学号:完成时间:2009年6月15日实验一算法实现一一、实验目的与要求熟悉C/C++语言的集成开发环境;通过本实验加深对分治法、贪心算法的理解。
二、实验内容:掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。
三、实验题1. 【伪造硬币问题】给你一个装有n个硬币的袋子。
n个硬币中有一个是伪造的。
你的任务是找出这个伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币找给小孩。
假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。
给出一种找零钱的贪心算法。
四、实验步骤理解算法思想和问题要求;编程实现题目要求;上机输入和调试自己所编的程序;验证分析实验结果;整理出实验报告。
五、实验程序1.伪造硬币问题源程序://c语言实现#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 100#define N1 12//只能判断是否相等的天平void solve(int coin[],int count,int first,int last) {if (count==2) {printf("无法判断\n");return;}if (first==last) {//只有一个硬币时候printf("假币的序号为%d, 假币的重量为%d\n", first, coin[first]);}else if(last-first==1){ //如果只剩下两个硬币(此时count不为)if (first > 0) { //不是最开始的硬币if (coin[first] == coin[0]) //如果第first和第个相等,说明first 位置不是伪币solve(coin,count,first+1,last);else//否则,说明first位置是伪币solve(coin,count,first,last-1);}else if(last<count-1){ //不是最后的硬币if (coin[first]==coin[count-1]) //如果第first和最后一个相等,说明last位置不是伪币solve(coin,count,first+1,last);else//否则,说明first位置是伪币solve(coin,count,first,last-1);}}else if (first<last){int temp=(last-first+1)/3; //将硬币分为三组int sum1=0, sum2=0;for(int i=0;i<temp;i++){sum1+=coin[first+i];sum2+=coin[last-i];}if (sum1==sum2){ //两边的总重相等,在中间,递归solve(coin,count,first+temp,last-temp);}else {//在两边,不在中间if (sum1==coin[first+temp]*temp){ //左边的和中间的相等,在右边,递归solve(coin,count,last-temp+1,last);}else {solve(coin,count,first,first+temp-1); //右边的和中间的相等,在左边,递归}}}}void main() {int i;int coin[N]; //定义数组coin用来存放硬币重量for(i=0;i<N;i++) //初始化数组coin[i]=0; //所用硬币初始值为coin[N1]=1; //第N1个设置为,即伪币int cnt = N;printf("硬币个数:%d\n",cnt);solve(coin,cnt,0,cnt-1);}2找零钱问题(1)零钱个数无限制的时候:源程序://c语言实现#include<stdio.h>main(){int T[]={25,10,5,1};int a[5];int money,i,j;printf("输入钱数:\n");scanf("%d",&money);for(i=0;i<4;i++){a[i]=money/T[i];money=money%T[i];}printf("找钱结果:\n硬币:\t");for(i=0;i<=3;i++){printf("%d\t|\t",T[i]);}printf("\n个数:\t");for(i=0;i<=3;i++){printf("%d\t|\t",a[i]);}printf("\n");return(0);}(2)当零钱个数有个数限制的时候:源程序://c语言实现#include<stdio.h>main(){int T[]={25,10,5,1}; //硬币的面值int a[5]; //用来记录找钱的个数int count[]={1,2,10,1000}; //各个面值硬币的个数int money,i;printf("输入钱数:\n");scanf("%d",&money);for(i=0;i<4;i++){if(money>T[i]*count[i]){ //当剩余钱数大于当前硬币总值a[i]=count[i]; //当前硬币个数取现有的最大值money=money-T[i]*count[i];}else{a[i]=money/T[i];money=money%T[i];}}printf("找钱结果:\n硬币:\t");for(i=0;i<=3;i++){printf("%d\t|\t",T[i]);}printf("\n\n个数:\t");for(i=0;i<=3;i++){printf("%d\t|\t",a[i]);}printf("\n");return(0);}六、实验结果1伪造硬币问题运行结果:硬币个数:100假币的序号为12, 假币的重量为1截图:2找零钱问题(1、硬币个数无限制)运行结果:输入钱数:67找钱结果:硬币: 25 | 10 | 5 | 1 |个数: 2 | 1 | 1 | 2 |截图:3找零钱问题(2、硬币个数有限制,其中硬币个数限制分别为1,2,10和1000。
算法实验1穷举【参考答案】【最新完全版】
算法分析与设计实验一——穷举算法(黑体,三号)1.穷举简介(小标题:黑体,小四;内容:宋体,五号)穷举法又称列举法,其基本思想是逐一列举问题所涉及的所有情况。
从中寻找满足条件的结果。
适用于数量较小的问题。
2.算法流程或设计思想穷举通常应用循环结构来实现。
在循环体中,应用选择结构实施判断筛选,求得所要求的解。
使用穷举法的关键是要确定正确的穷举的范围。
3.分析算法的时间复杂度4.程序设计中的问题及解决方案5.运行说明(包括实验数据和结果说明)6.主要程序代码(添加程序注释)7.对比解决该问题的其他算法(选作)题目:1.有一堆零件(1000-5000个之间),如果以4个零件为一组进行分组,则多2个零件;如果以7个零件为一组进行分组,则多3个零件;如果以9个零件为一组进行分组,则多5个零件。
编程求解这堆零件总数。
参考答案:#include<stdio.h>void main(){int n,count=0;for(n=1000;n<=5000;n++)if(n%4==2&&n%7==3&&n%9==5){printf("%d ",n);count=count+1;if(count%5==0)printf("\n");}printf("\ncount = %d\n",count);}2.穷举三位数的水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:13 + 53 + 33 = 153)参考答案:/*2. 穷举三位数的水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:13 + 53 + 33 = 153)*/#include <stdio.h>void main(){int a,b,c,d;for(a=100;a<=999;a++){b=a/100;c=a/10-b*10;d=a-b*100-c*10;if(b*b*b+c*c*c+d*d*d==a)printf("%d = %d^3 + %d^3 + %d^3\n",a,b,c,d);}}3.穷举真分数递增序列中的第k项的值。
实验报告
合肥师范学院实验报告册2016/ 2017 学年第 1 学期系别计算机学院实验课程算法设计与分析专业软件工程班级一班姓名杨文皇学号1310421071指导教师程敏实验一:分治算法一、实验目的1、理解分治策略的基本思想;2、掌握用分治法解决问题的一般技巧。
二、实验内容利用分治算法在含有n个不同元素的数组a[n]中同时找出它的最大的两个元素和最小的两个元素,编写出完整的算法,并分析算法的时间复杂度。
三、实验源程序。
1、算法设计思想利用分治法思想,n个不同元素的数组不断进行划分,化为若干个个子问题,其与原问题形式相;解决子问题规模较小而容易解决则直接解决:即当n的规模为只有一个或两个,三个或四个;否则再继续直至更小的子问题:即当n的规模大于四时。
将已求得的各个子问题的解,逐步合并原问题的解:即将左右两边求得的子问题进行比较,在四个数据中的得到两个最大(最小)值。
为了简化空间,采用了对每一个小规模问题的排序,以及合并原问题时,对四个数据进行排序,获得当前或合并的最大(最小)值2、算法实现#include<iostream>using namespace std;int a[10]={4,5,6,2,3,9,8,13,1};int b[4];int sort(int i,int j){int temp,k;for(;i<j;i++){for(k=i;k<j;k++)if(a[k]>a[k+1]){temp=a[k];a[k]=a[k+1];a[k+1]=temp;}}return 0;}int sort1(int lmin1,int lmin2,int rmin1,int rmin2){int i,j,temp;b[0]=lmin1;b[1]=lmin2;b[2]=rmin1;b[3]=rmin2;for(i=0;i<=1;i++)for(j=i;j<=3;j++){if(b[i]>b[j]){temp=b[i];b[i]=b[j];b[j]=temp;}}return 0;}int maxmin(int i,int j,int &fmin1,int &fmin2,int &fmax1,int &fmax2) {int mid;int lmin1,lmin2,lmax1,lmax2;int rmin1,rmin2,rmax1,rmax2;if(i==j || i==j-1){sort(i,j);fmin1=a[i];fmin2=a[i];fmax1=a[j];fmax2=a[j];}elseif(i==j-2 || i==j-3){sort(i,j);fmin1=a[i];fmin2=a[i+1];fmax1=a[j-1];fmax2=a[j];}else{mid=(i+j)/2;maxmin(i,mid,lmin1,lmin2,lmax1,lmax2);maxmin(mid+1,j,rmin1,rmin2,rmax1,rmax2);sort1(lmin1,lmin2,rmin1,rmin2);fmin1=b[0];fmin2=b[1];sort1(lmax1,lmax2,rmax1,rmax2);fmax1=b[2];fmax2=b[3];}return 0;}int main(){int fmin1,fmin2,fmax1,fmax2;int i;maxmin(0,8,fmin1,fmin2,fmax1,fmax2);cout<<endl;cout<<"该组数据为:";for(i=0;i<=8;i++)cout<<a[i]<<" ";cout<<endl<<endl<<"最小值是:"<<fmin1<<",第二小值是:"<<fmin2<<endl;cout<<endl<<"第二大值是:"<<fmax1<<",最大值是:"<<fmax2<<endl<<endl;return 0;}3、程序结果4、算法分析用T(n)元素表示数,则导出的递推关系式是:在理想的情况下,即每一小规模的子问题中的数据都是递增序列,则:当n<=4时,T(n)=1; 当n>4时,T(n)= T(n/2)+ T(n/2)(均向下取整);在非理想情况下,即每一小规模的子问题中的数据都是递减序列,则:当n=1时,T(n)=1;当n=2时,T(n)=2;当n=3时,T(n)=3;当n=4时,T(n)=6;当n>4时,T(n)= T(n/2)+ T(n/2)(均向下取整)+12。
《算法设计与分析》实验目的
《算法设计与分析》实验指导书曹严元计算机与信息科学学院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. 认真听讲,服从安排,独立思考并完成实验。
算法分析_实验报告
一、实验目的1. 理解算法分析的基本概念和方法。
2. 掌握时间复杂度和空间复杂度的计算方法。
3. 比较不同算法的效率,分析算法的适用场景。
4. 提高编程能力,培养算法思维。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本次实验主要分析了以下几种算法:1. 冒泡排序2. 选择排序3. 插入排序4. 快速排序5. 归并排序四、实验步骤1. 编写各种排序算法的Python实现代码。
2. 分别对长度为10、100、1000、10000的随机数组进行排序。
3. 记录每种排序算法的运行时间。
4. 分析算法的时间复杂度和空间复杂度。
5. 比较不同算法的效率。
五、实验结果与分析1. 冒泡排序```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]```时间复杂度:O(n^2)空间复杂度:O(1)冒泡排序是一种简单的排序算法,其时间复杂度较高,适用于小规模数据排序。
2. 选择排序```pythondef selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[min_idx] > arr[j]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]```时间复杂度:O(n^2)空间复杂度:O(1)选择排序也是一种简单的排序算法,其时间复杂度与冒泡排序相同,同样适用于小规模数据排序。
3. 插入排序```pythondef insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i-1while j >=0 and key < arr[j]:arr[j+1] = arr[j]j -= 1arr[j+1] = key```时间复杂度:O(n^2)空间复杂度:O(1)插入排序是一种稳定的排序算法,其时间复杂度与冒泡排序和选择排序相同,适用于小规模数据排序。
实验报告的算法分析
一、实验目的本次实验旨在通过对算法的运行时间、空间复杂度进行分析,评估算法的效率与适用性,为后续算法优化提供参考依据。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发环境:PyCharm三、实验内容本次实验选取了以下两个算法进行分析:1. 算法一:冒泡排序2. 算法二:快速排序1. 冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
(1)算法描述输入:一个无序的整数数组A[0...n-1]输出:一个有序的整数数组A[0...n-1]初始化:i=0,j=n-1while i < jfor k=i to j-1if A[k] > A[k+1]交换A[k]和A[k+1]end fori=i+1end while(2)时间复杂度分析- 最坏情况:O(n^2),当数组完全逆序时,需要比较n(n-1)/2次。
- 平均情况:O(n^2),平均情况下,比较次数约为n(n-1)/4。
- 最好情况:O(n),当数组已经有序时,只需比较n-1次。
(3)空间复杂度分析冒泡排序的空间复杂度为O(1),因为它是一个原地排序算法。
2. 快速排序快速排序是一种高效的排序算法,它采用分而治之的策略,将原数组分为两个子数组,一个子数组中的所有元素都比另一个子数组中的所有元素小,然后递归地对这两个子数组进行快速排序。
(1)算法描述输入:一个无序的整数数组A[0...n-1]输出:一个有序的整数数组A[0...n-1]选择一个基准值pivot,将数组分为两个子数组,一个包含小于等于pivot的元素,另一个包含大于pivot的元素。
递归地对这两个子数组进行快速排序。
(2)时间复杂度分析- 最坏情况:O(n^2),当基准值每次都是最小或最大值时,需要比较n(n-1)/2次。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析实验报告
实验一分治策略排序
实验目的
1)以排序问题为例,掌握分治法的基本设计策略;
2)熟练掌握合并排序算法的实现;
3)熟练掌握快速排序算法的实现;
4) 理解常见的算法经验分析方法。
实验环境
计算机、C语言程序设计环境、VC++6.0
实验步骤
算法的基本描述:
1、合并排序的基本思想描述:首先将序列分为两部分,分到每组只有两个元
素,然后对每一部分进行循环递归地合并排序,然后逐个将结果进行合并。
2、快速排序的基本思想描述:将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最后达到排序效果。
要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。
这些数作为本算法实验的输入数据。
程序流程图:
合并排序原理图
快速排序流程图1.生成2000个随机整数的程序:#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
FILE *fpt;
fpt = fopen("D://data.txt","w");
srand(time(0));
for(int i=0;i<2000;i++)
fprintf(fpt,"%3d\t",rand()%10000+1);
return 0;
fclose(fpt);
}
并生成data.txt文件。
2.读取data.txt文件,并排序。
实现合并排序算法输入:待排数据文件data.txt;
输出:有序数据文件resultsMS.txt
合并排序算法:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void mergesort(int a[],int n);
void merge(int a[],int b[],int i,int c[],int j);
{
int a[2000];
int i=0,j;
FILE *fpt;
fpt=fopen("D:\\data.txt","r");
if((fpt=fopen("D:\\data.txt","r"))==NULL) {
printf("\n error!");
exit(0);
}
while (fscanf(fpt,"%d",&a[i])!=EOF)
i++;
mergesort(a,2000);
fpt = fopen("D://resultMS.txt","w");
srand(time(0));
for(j=0;j<2000;j++)
{
printf("%d ",a[j]);
fprintf(fpt,"%3d\t",a[j]);
}
fclose(fpt);
return 0;
}
void mergesort(int a[],int n){
if(n<=1)
return;
int i,j;
int *b;
int *c;
b=(int *)malloc(sizeof(int)*(n/2));
c=(int *)malloc(sizeof(int)*(n-n/2));
for(i=0;i<n/2;i++){
b[i]=a[i];
}
for(j=0;j<n-n/2;j++){
c[j]=a[j+n/2];
}
mergesort(b,(n/2));
mergesort(c,(n-n/2));
merge(a,b,(n/2),c,(n-n/2));
}
void merge(int a[],int b[],int x,int c[],int y) {
int j=0;
int k=0;
while((i<x)&&(j<y)){
if(b[i]<=c[j]){
a[k]=b[i];
i++;
}
else{
a[k]=c[j];
j++;
}
k++;
}
int l;
if(i==x){
for(l=j;l<y;l++){
a[k]=c[l];
k++;
}
}
else{
for(l=i;l<x;l++){
a[k]=b[l];
k++;
}
}
}
运行结果为:
resultMS.txt内的数即为随机生成的数的排序。
3.实现QuickSort算法。
输入:待排数据文件data.txt;
输出:有序数据文件resultsQS.txt
程序:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int partions(int l[],int low,int high)
{
int prvotkey=l[low];
l[0]=l[low];
while (low<high){
while (low<high&&l[high]>=prvotkey)
--high;
l[low]=l[high];
while (low<high&&l[low]<=prvotkey)
++low;
l[high]=l[low];
}
l[low]=l[0];
return low;
}
void qsort(int l[],int low,int high){
int prvotloc;if(low<high){
prvotloc=partions(l,low,high); //第排序结作枢轴
qsort(l,low,prvotloc-1); //递归调用排序由low prvotloc-1
qsort(l,prvotloc+1,high); //递归调用排序由prvotloc+1 high }
}
void quicksort(int l[],int n){
qsort(l,1,n); //第作枢轴第排第n
}
void main(){
int a[2000];
int i=0;
FILE *fpt;
fpt=fopen("D:\\data.txt","r");
if((fpt=fopen("D:\\data.txt","r"))==NULL)
{
printf("\n error");
exit(0);
}
while (fscanf(fpt,"%d",&a[i])!=EOF)
i++;
quicksort(a,2000);
fpt=fopen("D:\\resultsQS.txt","w");
srand(time(0));
for(int j=1;j<2000;j++){
printf("%3d\t",a[j]);
fprintf(fpt,"%3d\t",a[j]);
}
fclose(fpt);
}
运行的结果:
生成resultsQS文件
程序运行的时间:
TimeMS的运行时间为0.0000ms
TimeQS的运行时间为:
产生的原因:
可能是计算机运行速度太快,两者运行时间没有太大的差距,所以程序运行的时间约为0.
实验分析:
从理论上看,快速排序最好情形的时间复杂度为O(NlogN),最坏的情形为O(N*N),平均时间复杂度O(NlogN)。
归并排序最好情形的时间复杂度为O(NlogN),最坏的情形为O(NlogN),平均时间复杂度O(NlogN)。
因此,可以看出,快速排序算法较之合并排序而言更有优势,尽管保持在相同的数量级下,但面对越大基数的无序数列时,快速排序的用时更短。
心得体会:
从本次的实验可以体会到完成一个完美的算法实验是不容易的,最重要的是要保持一颗积极向上的心,面对比较困难的问题要想办法去解决。
通过本次实验使得我的编程能力得到提升。
从会简单的小程序变为实现比较大的算法题。