算法分析——实验一

合集下载

实验报告算法分析

实验报告算法分析

实验报告算法分析实验报告:算法分析引言在计算机科学领域中,算法是解决问题的一种方法或步骤的描述。

通过对算法的分析,我们可以评估其效率和性能,从而选择最优的算法来解决特定的问题。

本实验报告旨在介绍算法分析的基本概念和方法,并通过实例来说明其应用。

一、算法分析的背景算法分析是计算机科学中的重要研究领域,它关注如何评估算法的效率和性能。

在实际应用中,我们经常面临着需要在有限的时间内解决大规模问题的挑战。

因此,选择一个高效的算法是至关重要的。

算法分析的目标是通过定量分析算法的时间复杂度和空间复杂度,为选择最佳算法提供依据。

二、算法分析的方法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、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

计算方法与计算 实验一误差分析

计算方法与计算 实验一误差分析
(1)MATLAB 主程序 function [k,juecha,xiangcha,xk]= liti112(x0,x1,limax) % 输入的量--x0是初值, limax是迭代次数和精确值x;
% 输出的量--每次迭代次数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

实验一 算法的时间复杂度分析

实验一 算法的时间复杂度分析
2.设计程序,求n的阶乘,至少用两种不同的算法实现。
二:程序源代码
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 秦九韶算法

实验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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)。

因此,可以看出,快速排序算法较之合并排序而言更有优势,尽管保持在相同的数量级下,但面对越大基数的无序数列时,快速排序的用时更短。

心得体会:
从本次的实验可以体会到完成一个完美的算法实验是不容易的,最重要的是要保持一颗积极向上的心,面对比较困难的问题要想办法去解决。

通过本次实验使得我的编程能力得到提升。

从会简单的小程序变为实现比较大的算法题。

相关文档
最新文档