张明明 算法设计与分析期中实验报告

合集下载

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

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

实验一递归与分治策略一、实验目的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'; }}五.程序调试中的问题调试过程,页码出现报错。

算法设计与分析实验报告

算法设计与分析实验报告

实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。

三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。

如果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字符是否为“回文”的递归函数,并编写程序测试。

二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。

递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告算法分析与设计实验报告一、引言算法是计算机科学的核心,它们是解决问题的有效工具。

算法分析与设计是计算机科学中的重要课题,通过对算法的分析与设计,我们可以优化计算机程序的效率,提高计算机系统的性能。

本实验报告旨在介绍算法分析与设计的基本概念和方法,并通过实验验证这些方法的有效性。

二、算法分析算法分析是评估算法性能的过程。

在实际应用中,我们常常需要比较不同算法的效率和资源消耗,以选择最适合的算法。

常用的算法分析方法包括时间复杂度和空间复杂度。

1. 时间复杂度时间复杂度衡量了算法执行所需的时间。

通常用大O表示法表示时间复杂度,表示算法的最坏情况下的运行时间。

常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)和O(n^2)等。

其中,O(1)表示常数时间复杂度,O(log n)表示对数时间复杂度,O(n)表示线性时间复杂度,O(n log n)表示线性对数时间复杂度,O(n^2)表示平方时间复杂度。

2. 空间复杂度空间复杂度衡量了算法执行所需的存储空间。

通常用大O表示法表示空间复杂度,表示算法所需的额外存储空间。

常见的空间复杂度有O(1)、O(n)和O(n^2)等。

其中,O(1)表示常数空间复杂度,O(n)表示线性空间复杂度,O(n^2)表示平方空间复杂度。

三、算法设计算法设计是构思和实现算法的过程。

好的算法设计能够提高算法的效率和可靠性。

常用的算法设计方法包括贪心算法、动态规划、分治法和回溯法等。

1. 贪心算法贪心算法是一种简单而高效的算法设计方法。

它通过每一步选择局部最优解,最终得到全局最优解。

贪心算法的时间复杂度通常较低,但不能保证得到最优解。

2. 动态规划动态规划是一种将问题分解为子问题并以自底向上的方式求解的算法设计方法。

它通过保存子问题的解,避免重复计算,提高算法的效率。

动态规划适用于具有重叠子问题和最优子结构的问题。

3. 分治法分治法是一种将问题分解为更小规模的子问题并以递归的方式求解的算法设计方法。

算法与分析实验报告

算法与分析实验报告

算法与分析实验报告一、引言算法是现代计算机科学中的核心概念,通过合理设计的算法可以解决复杂的问题,并提高计算机程序的执行效率。

本次实验旨在通过实际操作和数据统计,对比分析不同算法的执行效率,探究不同算法对于解决特定问题的适用性和优劣之处。

二、实验内容本次实验涉及两个经典的算法问题:排序和搜索。

具体实验内容如下:1. 排序算法- 冒泡排序- 插入排序- 快速排序2. 搜索算法- 顺序搜索- 二分搜索为了对比不同算法的执行效率,我们需要设计合适的测试用例并记录程序执行时间进行比较。

实验中,我们将使用随机生成的整数数组作为排序和搜索的测试数据,并统计执行时间。

三、实验步骤1. 算法实现与优化- 实现冒泡排序、插入排序和快速排序算法,并对算法进行优化,提高执行效率。

- 实现顺序搜索和二分搜索算法。

2. 数据生成- 设计随机整数数组生成函数,生成不同大小的测试数据。

3. 实验设计- 设计实验方案,包括测试数据的规模、重复次数等。

4. 实验执行与数据收集- 使用不同算法对随机整数数组进行排序和搜索操作,记录执行时间。

- 多次重复同样的操作,取平均值以减小误差。

5. 数据分析与结果展示- 将实验收集到的数据进行分析,并展示在数据表格或图表中。

四、实验结果根据实验数据的收集与分析,我们得到以下结果:1. 排序算法的比较- 冒泡排序:平均执行时间较长,不适用于大规模数据排序。

- 插入排序:执行效率一般,在中等规模数据排序中表现良好。

- 快速排序:执行效率最高,适用于大规模数据排序。

2. 搜索算法的比较- 顺序搜索:执行时间与数据规模成线性关系,适用于小规模数据搜索。

- 二分搜索:执行时间与数据规模呈对数关系,适用于大规模有序数据搜索。

实验结果表明,不同算法适用于不同规模和类型的问题。

正确选择和使用算法可以显著提高程序的执行效率和性能。

五、实验总结通过本次实验,我们深入了解了不同算法的原理和特点,并通过实际操作和数据分析对算法进行了比较和评估。

算法设计与分析实验报告一

算法设计与分析实验报告一

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:122208206101姓名:蔡猛班级:网络工程日期:2013-2014学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。

(30分)算法分析:用递归的方法,先将n个数分成两个部分,然后将两个部分交换位子,然后再将这两个部分继续再分成四个部分,然后再将每个部分进行交换,然后就重复刚才的过程,直到不能再分为止,在这个过程中所产生的所有结果就是我们要求的全排列。

代码实现:#include <stdio.h>int n = 0;void swap(int *a, int *b){int m;m = *a;*a = *b;*b = m;}void perm(int list[], int k, int m){int i;if(k > 2){for(i = 0; i <= 2; i++)printf("%d ", list[i]);printf("\n");n++;}else{for(i = k; i <= 2; i++){swap(&list[k], &list[i]);perm(list, k + 1, 4);swap(&list[k], &list[i]);}}}int main(){int list[] = {1, 2, 3,4};perm(list, 0, 2);printf("total:%d\n", n);return 0;}2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。

本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。

一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。

在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。

通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。

二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。

在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。

我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。

三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。

在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。

我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。

四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。

在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。

我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。

五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。

在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。

在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。

在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。

算法分析与设计》实验指导与报告书

算法分析与设计》实验指导与报告书

《算法分析与设计》实验指导与报告书实验目录实验1 求最大公约数 (1)实验2 斐波那契数列 (3)实验3 最近对问题 (6)实验4 堆排序 (7)实验5 霍纳法则和二进制幂 (8)实验6 字符串匹配问题 (9)实验7 Warshall算法和Floyd算法 (10)实验8 最优二叉查找树 (11)实验9 Huffman编码* (12)实验10 求解非线性方程* (13)实验11 投资问题* (14)注:(1)实验4和实验5为变治法应用,二选一;(2)实验7和实验8为动态规划法应用,二选一;(3)带*号的实验为选做实验,根据课时及学生实验完成情况机动安排。

实验1 求最大公约数{c = a;a = b;b = c;}while(a % b != 0){c = a % b;a = b;b = c;}printf("%d", b);return 0;}连续整数检测算法最大公约数算法:#include <stdio.h>int main(){int a,b,t;printf("Please input two integers: ");scanf("%d %d",&a,&b);if(a<b)t=a;elset=b;while(t>=1){if((a%t==0)&&(b%t==0))break;t--;}printf("%d",t);return 0;}相减循环:#include<stdio.h>int main(){int m,n;printf("Please input two integers: ");scanf("%d%d",&m,&n);while(m!=n)if(m>n) m=m-n;else n=n-m;printf("%d",m);return 0;}教师评分实验2 斐波那契数列实验目的(1)求斐波那契数列;(2)区分递归和递推思想。

《算法设计与分析》上机实验报告(2)

《算法设计与分析》上机实验报告(2)

福州大学数学与计算机科学学院《计算机算法设计与分析》上机实验报告(2)4.根据计算最优值时得到的信息,构造最优解3.算法正确性证明对于矩阵连乘积的最优计算次序问题,设计算A[ i : j ],1<=i<=j<=n,所需的最少数乘次数为m[ i ][ j ],则原问题的最优值为m[ 1 ][ n]。

当i=j时,A[ i ; j ]=Ai,为单一矩阵,无需计算,因此m[ i ][ i ]=0。

当i < j时,可以利用最优子结构的性质来计算m[ i ][ j ]。

事实上,若计算A[ i : j ]的最优次序在Ak和Ak+1之间断开,i<=k<j,则m[ i ][ j ]=m[ i ][ k ]+m[k+1][ j ]+Pi-1*Pk*Pj。

其中Pi表示第i个矩阵的列数,也是第i-1个矩阵的行数,P0表示第一个矩阵的行数。

由于在计算时并不知道断开点k的位置,所以k还未定。

不过k的位置只有j-i个可能。

从而m[ i ][ j ]可以递归地定义为当i=j m[ i ][ j ] = 0当i<j m[ i ][ j ] = min{ m[ i ][ k ]+m[ k+1 ][ j ]+Pi-1*Pk*Pj }m[ i ][ j ]给出了最优值,即计算A[ i : j ]所需的最少数乘次数。

同时还确定了计算A[ i : j ]的最优次序中的断开位置k,也就是说,对于这个k有m[ i ][ j ]=m[ i [ k ]+m[ k+1 ][ j] + Pi-1*Pk*Pj若将对应于m[ i ][ j ]的断开位置k记为s[ i ][ j ],在计算最优值m[ i ][ j ]后,可以递归地有s[ i ][ j ]构造出相应的最优解。

根据计算m[ i ][ j ]的递归式,容易写一个递归算法计算m[ 1 ][ n ]。

但是简单地递归将好费指数计算时间。

在递归计算时,许多子问题被重复计算多次。

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

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

《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目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)

《算法设计与分析》课程实验报告 (算法问题求解基础1)
s1[i] = s1[i-1] * 10 + pow(10,i-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。

算法设计与分析实验报告_2

算法设计与分析实验报告_2

课程设计报告题目:计算机算法基础实验报告课程名称:专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录一、实验目的 (3)二、实验题目 (3)三、设计分析 (3)1.生成最短路径问题设计分析 (3)2.最优二分检索树问题设计分析 (4)四、算法描述 (5)1.生成最短路径问题算法描述(用流程图表示) (5)2.最优二分检索树问题算法描述(用流程图表示) (6)五、程序 (7)1. 生成最短路径问题算法代码 (7)2.最优二叉检索树源代码 (10)六、测试与分析 (13)1.生成最短路径问题算法 (13)2.最优二叉检索树源测试及分析 (15)七、实验总结及体会 (16)八、参考书目 (17)一、实验目的1.掌握贪心方法、动态规划的基本思想2.了解适用贪心方法、动态规划的问题类型,并能设计相应的贪心法算法3.掌握贪心算法、动态规划算法时间空间复杂度分析,以及问题复杂性分析方法二、实验题目1.实现单源点生成最短路径的贪心方法,完善算法,求出长度,并推导路径上的结点序列2.实现最优二分检索树算法,计算各C(i,j)、R(i,j)、W(i,j)的值,并推导树的形态三、设计分析1.生成最短路径问题设计分析为了制定产生最短路径贪心算法,对于这个问题需要想出一个多级解决方案和最优的量度标准。

方法之一是逐条构造这些最短路径,可以用迄今已经生成的所有路径长度之和作为一种量度,为了使这一量度达到最小,其单独的每一个路径都必须具有最小长度。

使用这一个量度标准时,假定已经构造了i条最短路径,则下面要构造的路径应该是下一个最小的长度路径。

生成从源点v0到所有其他结点的最短路径的贪心方法就是按照路径长度的非降次序生成这些路径。

首先,生成一条到最短结点的最短路径,然后生成一条到第二近结点的最短路径,依次往下进行…。

为了按照这样的路径生成这些最短路径,需要确定与其生成最短路径的下一个结点,以及到这一结点的最短路径。

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

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

福建师范大学协和学院本科实验报告课程名称:《算法设计与分析》学院(系):专业:班级:学号:学生姓名:学号:学生姓名:学号:学生姓名:实验项目标题前加*号的实验题目为设计实验《算法设计与分析》实验报告填写要求一、本课程共需完成七次实验,由十五个实验项目组成。

每一次实验需在备选项目中选择一个项目完成并提交一份实验报告,批改后下发的实验报告请保存起来,期末上交。

二、实验报告书写要求:1.实验目的和要求:明确实验的内容和具体任务;2.列出源程序,备注说明程序的基本结构,包括程序中各部分的功能。

3.说明程序中各部分所用的算法或原理,计算出算法时间和空间复杂性,并给出计算过程。

4.实验结果与分析:给出不少于3组数据测试算法,并将每组测试数据的运行结果列出,并对调试源程序的结果进行分析,杜绝只罗列不分析;5.讨论、建议、质疑:针对实验中碰到的问题进行组内以及组外讨论,遇到不能解决的问题时向指导老师请教,并将问题的提出以及解决的过程写入实验报告,以作为以后学习的参考。

问题要具体描述,避免抽象地罗列、笼统地讨论;6.全部文字叙述内容要求简明扼要,思路清楚;7.实验日期、同组员姓名写清楚。

三、要求实验报告字迹工整、文字简练、数据齐全、计算正确,分析充分、具体、定量。

对于抄袭实验报告和编篡原始数据的行为,一经发现,以零分处理,并根据相关条例给予处分。

福建师范大学协和学院实验报告实验日期:年月日星期组员姓名:成绩:实验一递归与分治算法实验(一)项目一快速排序(验证实验)一、重要的程序说明(说明程序的基本结构以及程序中各部分的功能,以伪代码和图的形式说明)二、算法复杂性分析与计算(说明程序中各部分所用的算法或原理,计算出算法时间和空间复杂性,并写出计算过程)三、程序运行测试结果分析:四、程序调试过程中遇到的错误,如何讨论、有何建议与质疑五、思考题试想想,这样的排序算法有什么优势?能对所有的数据测试用例都使用这种算法吗?福建师范大学协和学院实验报告实验日期:年月日星期组员姓名:成绩:实验一递归与分治算法实验(一)项目二合并排序(验证实验)一、重要的程序说明(说明程序的基本结构以及部分的功能,以伪代码和图的形式说明)二、算法复杂性分析与计算(说明程序中各部分所用的算法或原理,计算出算法时间和空间复杂性,并写出计算过程)三、程序运行测试结果分析:四、程序调试过程中遇到的错误,如何讨论、有何建议与质疑五、思考题为什么合并排序是思想是基于比较类排序里面最快的,它成功的地方在哪儿?福建师范大学协和学院实验报告实验日期:年月日星期组员姓名:成绩:实验一递归与分治算法实验(一)项目三寻找主元素(设计实验)一、重要的程序说明(说明程序的基本结构以及各部分的功能,以伪代码和图的形式说明)二、算法复杂性分析与计算(说明程序中各部分所用的算法或原理,计算出算法时间和空间复杂性,并写出计算过程)三、程序运行测试结果分析:四、程序调试过程中遇到的错误,如何讨论、有何建议与质疑福建师范大学协和学院实验报告实验日期:年月日星期组员姓名:成绩:实验二递归与分治算法实验(二)项目四递归求排列(验证实验)一、重要的程序说明(说明程序的基本结构以及程序中各部分的功能,以伪代码和图的形式说明)二、算法复杂性分析与计算(说明程序中各部分所用的算法或原理,计算出算法时间和空间复杂性,并写出计算过程)四、程序调试过程中遇到的错误,如何讨论、有何建议与质疑五、思考题试想想,递归思想有什么样的优缺点,在调试过程中,随着数据量的增大,调试过程与结果有没有变化?为什么?实验日期:年月日星期组员姓名:成绩:实验二递归与分治算法实验(二)项目五分治求K大元素(设计实验)一、重要的程序说明(说明程序的基本结构以及部分的功能,以伪代码和图的形式说明)二、算法复杂性分析与计算(说明程序中各部分所用的算法或原理,计算出算法时间和空间复杂性,并写出计算过程)四、程序调试过程中遇到的错误,如何讨论、有何建议与质疑五、思考题这种求K大元素与前面学过的合并排序有无关联?仔细想一想他们的本质。

算法设计与分析实验报告

算法设计与分析实验报告

实验课程名称:算法设计与分析这里的数据包括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)。

算法分析与设计-第2章实验

算法分析与设计-第2章实验
3.掌握二分搜索技术的算法原理,能利用二分搜索技术解决简单实际问题;
二、实验内容、过程和结果(实验主要内容的介绍、主要的操作步骤、程序代码和测试数据及实验结果)
1.问题描述:
给定已经排好序的N个元素a[0]、a[1]……a[n],现在通过二分搜索技术实现在这n个元素中找出一个特定的元素X;
2.实验原理:
二、实验总结与收获
本次通过程序应用二分搜索技术实现了在字符串里查找特定字符的功能,从实践的过程中加深了对分治策略原理的理解和分治策略设计的相关技巧,二分搜索技术能有效的提高我们算法的效率,它对于解决我们现实生活中的相关问题也有很大的帮助,同时二分搜索技术只是分治策略思想中的一个典型算法,在今后的学习中,我们还需要不断的深入对分治策略算法思想的学习,巩固今天的实验成果,改进算法以达到更高的效率。
{int left=0,right=n-1,mid;
if(n>0&&x>=a[0])
{
while(left<rigght+1)/2;
if(x<a[mid])
right=mid-1;
else
left=mid;
}
if(x==a[left])
return left;
}
return -1;
西南大学
实验报告
《算法设计与分析》课程
2014-2015学年度第1学期
专业年级
姓名
学号
任课教师
实验教师
上机地点
《算法设计与分析》课程实验报告(一)
实验题目
递归与分治策略─——二分搜索技术
实验时间
第四周
一、实验目的及要求
1.通过算法的程序实现,掌握设计有效算法的分治策略;

算法设计与分析第二版实践报告总结

算法设计与分析第二版实践报告总结

算法设计与分析第二版实践报告总结下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!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!算法设计与分析第二版实践报告总结引言在计算机科学领域,算法设计与分析是一项至关重要的工作。

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告实验序号: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)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。

毕业设计说明书(张明明改后)

毕业设计说明书(张明明改后)

学号05820309毕业设计说明书多功能助听器设计学生姓名张明专业名称工业设计指导教师张开艺术系2009年6月10日多功能助听器设计Design of Multi-functional Hearing Aid摘要市场上助听器功能目前还有很大发展空间,助听器设计中功能性和舒适性的权衡永远都是那么两难。

为了更好平衡。

我把助听器一分为二,将操控系统和听力系统分开。

这样就获得了额外的有用功能,如电话、录音、复读、方向导航和紧急呼叫等。

这个设计力图用最简单的结构达到最大的性能。

强大而全面的功能使它不再局限于助听器,而成为了一个强大的听力系统。

多功能助听器与遥控器简单的结构包含了、电话、MP3、USB、调制程序、蓝牙、录音等功能、使其性能最大化。

功能涵盖各个领域。

关键词:多功能;助听器;舒适;市场;空间;目录一、选题背景 (1)二、调研分析 (1)三、设计定位 (2)四、设计思路 (2)五、设计风格 (3)致谢 (4)参考资料与设计规范 (5)毕业设计任务书及进度表一.选题背景助听器是一种帮助听力障碍者提高听力的仪器,但其对听力障碍者在工作、学习、生活及语言智力等方面的重要性远未被人们所认识。

我国有程度不同的听力障碍者约6千万人,其中重度耳聋者约1700万人, 而助听器年产量仅10多万台,仅有0.3%的听力障碍者配戴助听器。

多数耳聋患者及聋儿家长不惜重金四处求医,却忽视了配戴助昕器,给语言功能的发育和保持造成了不可挽回的损失!通过助听器尽早利用残余听力,在目前是唯一防止或减少聋儿语言发育障碍的有效途径由于我国人口基数大,听障患者人数高达6千万以上,市场规模十分可观。

听力障碍给生活,学习,工作带来不便。

多数耳聋患者四处求医,忽视了配戴助昕器,给语言功能的发育和保持造成不良影响。

尽早佩戴助听器目前是唯一防止或减少聋儿语言发育障碍的有效途径。

目前我国形成江苏和在厦门两在助听器生基地,全球排名靠前的6家助听器生产企业都已进入中国市场,这些企业包括德国西门子、瑞士峰力、丹麦瑞声达、丹麦奥迪康、丹麦唯听、美国斯达克。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析期中实验报告学号:12012002367 姓名:张明明一、问题套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币。

例如,假定1美元可以买0.7英镑,1英镑可以买9.5法郎,且1法郎可以买到0.16美元。

通过货币兑换,一个商人可以从1美元开始买入,得到0.7×9.5×0.16=1.064美元,从而获得6.4%的利润。

假设已知n种货币c1,c2,…,c n和有关兑换率的n×n表R。

其中,R[i,j]是一个单位货币c i可以买到货币c j的单位数。

(1)试设计一个有效算法,用以确定是否存在一货币序列c1,c2,…,c n使得R[i1,i2]R[i2,i3]…R[ik,i1]>1并分析算法的计算时间。

(2)试设计一个算法打印出满足本题(1)中条件的所有序列,并分析算法的计算时间。

二、算法描述(1)因为对于任意R[i,j]=max{R[i,j],R[i][k]×R[k][j]},而k∈[0,n],所以我们只需要对每一个k∈[0,n]都更新表R就能够获得一次处理后的新表R,如果存在R[i][i]>1,则存在套汇;否则不存在套汇。

事实上,再一次对每一个k∈[0,n]虽然可能会改变表R,但是不会改变R[i][i]与1的关系。

(2)对于算法1中已经对R进行了处理,获得了新的表r并且可以根据r[i][i]>1判断是否存在套汇我们只需要从算法1获取出现套汇货币序号i即可。

考虑R[i1,i2]R[i2,i3]…R[ik,i1],我们知道这是一个单环序列(序列中间不存在环,即不存在R[ik1][ik2] R[ik2][ik3]…R[ik n][ik1]且k1!=1)我们从i1列开始,利用贪心策略求得R每一列的最大值(并且不能是已经遍历过的列而且也不能是对角线),直到最大值元素所在行为i1即可。

同时将这些最大值进行累乘得到product,遍历完R的列后再判断r[i][i]是否为product的整数倍,如果是则找到了这样一个序列;否则没有找到(因为存在嵌套环序列)。

三、详细设计图3.1 算法1的流程图图3.2 算法2的流程图图3.3函数col_max(int j)流程图四、程序代码public class Arbitrage {private Element element; //记录单列最大值、行列序号ArrayList<Element> elmList=new ArrayList<Element>(); //记录所有列最大值、行列序号信息private int n; //n种货币private String[] name; //货币名称private double[][] r; //用于写操作兑换率表rprivate double[][] R; //用于存储输入的原始兑换率表Rprivate int kNum; //已知兑换率数private boolean isExistArbitrage; //标识是否存在套汇private final double EPS=1e+0; //汇率误差精度private boolean[] foot; //记录遍历的列/*** 初始化foot数组*/public void intialFoot() {if(foot==null)foot=new boolean[n];for(int i=0;i<n;i++){foot[i]=false;}}/*** 根据输入数据初始化货币总数、名称、已知货币汇率数、已知货币汇率*/public void input(){File iFile = null;FileInputStream fin = null;Scanner in = null;try{/*初始化输入流文件*/iFile= new File("D:\\input1.txt");fin = new FileInputStream(iFile);in = new Scanner(fin);int i,j,k;n=in.nextInt();if(n <= 0) return;/*根据输入货币数n值初始化名称列表、原始兑换率表R、操作兑换率表r*/name=new String[n];R=new double[n][n];r=new double[n][n];/*输入货币名称列表、原始兑换率表R*/for (i = 0; i < n; i++)name[i]=in.next();for (i = 0; i < n; i++)for (j = 0; j < n; j++)R[i][j]=0.0;kNum=in.nextInt();for (i = 0; i < kNum; i++) {String a=in.next();double x=in.nextDouble();String b=in.next();for (j = 0; pareTo(name[j])!=0; j++);for (k = 0; pareTo(name[k])!=0;k++);R[j][k]=x;}/*设置同种货币兑换汇率*/for (i = 0; i < n; i++)R[i][i]=Math.max(1.0,r[i][i]);/*复制原始兑换率表R到操作兑换率表r*/for(i=0;i<n;i++)for(j=0;j<n;j++)r[i][j]=R[i][j];}catch (Exception e) {e.printStackTrace();}finally{if(in!=null)in.close();if(fin!=null){try {fin.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 验证输入是否合法* @return true: 合法,有效输入; false: 不合法,即无效输入*/public boolean inputIsValid(){for(int i=0;i<R.length;i++){for(int j=0;j<i;j++){if(R[i][j]>0.0&&R[j][i]>0.0){if(Math.abs(R[i][j]*R[j][i] - 1) >EPS){//顺换、逆换汇率乘积不等于1且与1的误差大于规定误差System.out.println("错误:两种不同货币直接互换汇率乘积不等于1!");return false;}}else if(R[i][j]<0||R[j][i]<0.0){System.out.println("错误:存在小于0汇率!");return false;}}}return true;}/**算法1核心代码* 求存在套汇的货币*/public void arbitrageCase(){int i,j,k;/*对操作兑换汇率表r进行处理,求每种货币对所有货币的汇率的最大值*/for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)r[i][j]=Math.max(r[i][j], r[i][k]*r[k][j]);/*打印操作兑换汇率表*//*System.out.println("进行初步处理后的兑换后汇率表:");for(i=0;i<n;i++){for(j=0;j<n;j++){System.out.print(r[i][j]+" ");}System.out.println();}*/isExistArbitrage=false;/*求套汇币种*/for(i=0;i<n;i++){if (r[i][i]>1.0) {System.out.println("货币"+name[i]+"出现套汇");arbitrageSequence(i); //算法2用到,求出现套汇情形(序列);否则屏蔽之isExistArbitrage=true;}}if(!isExistArbitrage){System.out.println("没有套汇存在");}}/**算法2核心代码* 求出现套汇序列* 输入条件i==j* @param i:汇率表R(二维表)行序号*/public void arbitrageSequence(final int i) {/*清除缓存数据*/elmList.clear();intialFoot();int j=i;double product=1.0; //记录每列最大值乘积int count=n; //遍历汇率表R列计数器/*初始化foot数组*/foot=new boolean[n];for(int k=0;k<n;k++){foot[k]=false;}do{element=col_max(i,j); //求第j列非对角线最大值footPrint(j); //标记第j列elmList.add(0, element);product *= element.value;j=element.x;count--;}while(element.x!=i && count>0);if (isMultiple(product,r[i][i])) { //成倍数关系System.out.print("序列 "+i+": ");for(int k=0;k<elmList.size();k++){System.out.print("c["+elmList.get(k).x+"]["+elmList.get(k).y+"]") ;}System.out.println();}else {System.out.println("不能求得货币"+name[i]+"的套汇序列!该货币套汇序列存在嵌套环!");}}/*** 求没有遍历的第j列元素过非对角线最大值以及所在行* 静态内嵌类Element用于记录二维数组R第j列元素最大值以及所在行列* @param i0 : 初始行序号* @param j : 列序号*/public Element col_max(final int i0,final int j){double max=0.0;Element e=new Element();for(int i=0;i<n;i++){if(i==j){continue;}if (!foot[i]){if (R[i][j]>max) {max=R[i][j];e.x=i;e.y=j;e.value=max;}}else if (i==i0) {if (R[i][j]>max) {max=R[i][j];e.x=i;e.y=j;e.value=max;}}}return e;}/*** 标记已经遍历过的列序号为true* @param i:数组foot的索引号*/public void footPrint(int i){foot[i]=true;}/*** 判断num2是否为num1的整数倍* @param num1* @param num2* @return*/public boolean isMultiple(final double num1,final double num2) { double s=num1;/*if(num1<=0||num2<=0)return false;*/if(num1==1){if(num2==num1)return true;else {return false;}}while(num2>s){s*=num1;}if(num2==s){return true;}else {return false;}}// class Arbitragepublic class Element {public int x;public int y;public double value;}// class Elementpublic static void main(String[] args) {Arbitrage arbitrage = new Arbitrage();arbitrage.input();if(arbitrage.inputIsValid()){arbitrage.arbitrageCase();}}五、测试和结果算法2输出结果。

相关文档
最新文档