实验一 递归与分治策略算法设计与实现实验报告

合集下载

算法设计与分析实验报告

算法设计与分析实验报告

实验报告题目实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

二、实验内容设计一个递归和分治算法,找出数组的最大元素,找出x在数组A中出现的次数。

三、实验要求(1)用分治法求解…问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1.设计一个递归算法,找出数组的最大元素。

2.设计一个分治算法,找出x在数组A中出现的次数。

3.写一个主函数,调用上述算法。

五、实验结果分析(分析时空复杂性,设计测试用例及测试结果)时间复杂性:最好情况下,O(n)最坏情况下:O(nlog(n)空间复杂性分析:O(n)六、实验体会通过写递归与分治策略实验,更加清楚的知道它的运行机理,分治法解题的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

做实验重在动手动脑,还是要多写写实验,才是硬道理。

七、附录:(源代码)#include"stdio.h"#define ElemType intint count(ElemType a[],int i,int j,ElemType x){int k=0,mid; //k用来计数,记录数组中x出现的次数if(i==j){if(a[i]==x) k++;return k;}else{mid=(i+j)/2;k+=count(a,i,mid,x);k+=count(a,mid+1,j,x);}return k;}ElemType Maxitem(ElemType a[],int n){ElemType max=a[n-1],j;if(n==1){max=a[n-1];return max;}else{j=Maxitem(a,n-1);if(j>max) max=j;return max;}}void main(void){ElemType a[]={1,5,2,7,3,7,4,8,9,5,4,544,2,4,123};ElemType b;ElemType x;int n;b=Maxitem(a,15);printf("数组的最大元素为%d\n",b);printf("输入想要计数的数组元素:\n");scanf("%d",&x);n=count(a,0,14,x);printf("%d在数组中出现的次数为%d次\n",x,n);}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

算法设计与分析:递归与分治法-实验报告

算法设计与分析:递归与分治法-实验报告

应用数学学院信息安全专业班学号姓名实验题目递归与分治法综合实验评分表实验报告一、实验目的与要求1.掌握递归算法的设计思想2.掌握分治法设计算法的一般过程3.理解并掌握算法渐近时间复杂度的分析方法二、实验内容1、折半查找的递归算法(1)源程序代码#include <StdAfx.h>#include <iostream>using namespace std;int bin_search(int key[],int low, int high,int k){int mid;if(low>high)return -1;else{mid = (low+high) / 2;if(key[mid]==k)return mid;if(k>key[mid])return bin_search(key,mid+1,high,k);elsereturn bin_search(key,low,mid-1,k);}}int main(){int n , i , addr;int A[10] = {2,3,5,7,8,10,12,15,19,21};cout << "在下面的10个整数中进行查找" << endl;for(i=0;i<10;i++){cout << A[i] << " " ;}cout << endl << endl << "请输入一个要查找的整数" << endl;cin >> n;addr = bin_search(A,0,9,n);if(-1 != addr)cout << endl << n << "是上述整数中的第" << addr << "个数" << endl;elsecout << endl << n << "不在上述的整数中" << endl << endl;getchar();return 0;}(2)运行界面①查找成功②查找失败2、用分治法求x的n次方,要求时间复杂度为O(lgn)(1)源程序代码#include <StdAfx.h>#include <iostream>using namespace std;int Pow(int x, int n){if (n == 1)return x;else if (n > 1){int s;int m = n / 2;s = Pow (x, m);if (n % 2 == 0)return (s * s);elsereturn (s * s * x);}}int main(){int x, n;cout << "你将进行x的n次方计算" << endl << endl;cout << "请输入x:" << endl;cin >> x;cout << "请输入n:" << endl;cin >> n;cout << endl << "计算结果:" << Pow(x, n) << endl << endl;return 0;}(2)运行界面3、自然合并排序算法(1)源程序代码#include "StdAfx.h"#include <iostream>using namespace std;const int SIZE = 100;int arr[SIZE];int rec[SIZE];void merge(int fir,int end,int mid);int pass(int n);void mergeSort(int n);void mergeSort(int n){int num=pass(n);while(num!=2){for(int i=0;i<num;i+=2)merge(rec[i],rec[i+2]-1,rec[i+1]-1);num=pass(n);}}void merge(int fir,int end,int mid){int tempArr[SIZE];int fir1=fir,fir2=mid+1;for(int i=fir;i<=end;i++){if(fir1>mid)tempArr[i]=arr[fir2++];else if(fir2>end)tempArr[i]=arr[fir1++];else if(arr[fir1]>arr[fir2])tempArr[i]=arr[fir2++];elsetempArr[i]=arr[fir1++];}for(int i=fir;i<=end;i++)arr[i]=tempArr[i];}int pass(int n){int num=0;int biger=arr[0];rec[num++]=0;for(int i=1;i<n;i++){if(arr[i]>=biger)biger=arr[i];else {rec[num++]=i;biger=arr[i];}}rec[num++]=n;return num;}int main(){int n;cout<<"请输入需要排序的整数个数:"<<endl;while(cin>>n){for(int i=0;i<n;i++){cout<<"请输入整数:"<<endl;cin>>arr[i];}mergeSort(n);cout<<"排序结果为:"<<endl;for(int i=0;i<n;i++){cout<<arr[i]<<" ";}cout<<endl<<endl;cout<<"请输入需要排序的整数个数:"<<endl;}return 0;}(2)运行界面三、问题与讨论问题:分治法能解决的问题一般具有什么特征?解答:任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。

递归与分治实验报告

递归与分治实验报告

递归与分治实验报告班级:计科1102 姓名:赵春晓学号:2011310200631实验目的:进一步掌握递归与分治算法的设计思想,通过实际问题来应用递归与分治设计算法。

实际问题:1集合划分问题,2输油管道问题,3邮局选址问题,4整数因子分解问题,5众数问题。

问题1:集合划分算法思想:对于n个元素的集合,可以划分为由m个子集构成的集合,例如{{1,2}{3,4}}就是由2个子集构成的非空子集。

假设f(n,m)表示将n个元素划分成由m个子集构成的集合的个数。

那么1)若m == 1 ,则f(n,m)= 1 ;2)若n == m ,则f(n,m)= 1 ;3)若不是上面两种情况则有下面两种情况构成:3.1)向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;3.2)向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。

实验代码:#include<iostream>#include<fstream>using namespace std ;int jihehuafen( int n , int m ){if( m == 1 || n == m )return 1 ;elsereturn jihehuafen( n - 1 , m - 1 ) + m*jihehuafen( n - 1 , m ) ;}int main(){ifstream fin("C:/input.txt") ;ofstream fout("C:/output.txt") ;int N , M , num ;fin >> N >> M ;num = jihehuafen( N , M) ;fout << num << endl ;return 0 ;}问题2:输油管道算法思想:由于主管道由东向西铺设。

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

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

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期: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.实验目的:1)掌握递归与分治策略的基本思想2)掌握递归算法在阶乘函数、Ackerman函数、整数划分等问题上的应用3)掌握二分查找、合并排序、快速排序等问题的分治算法实现4)熟悉myeclipse或eclipse等Java开发工具的使用。

2.实验内容:1)采用myeclipse或eclipse编程实现基于分治策略的二分查找算法。

2)采用myeclipse或eclipse编程实现基于分治策略的合并排序算法。

3)采用myeclipse或eclipse编程实现基于分治策略的合并排序算法。

3.实验步骤二分查找publicclasssorting{publicstaticintbinarysearch(int[]a,intx,intn){intle ft=0;intright=n-1;while(left intmiddle=(left+right)/2;if(x==a[middle])returnmiddle;if(x>a[middle])left=middle+1;elseright=middle-1;}return-1;}publicstaticvoidmain(stringargs[]){intx,n;inta[]={1,3,4,5,6,13,25};x=6;n=7;ints;s=binarysearch(a,x,n);system.out.println(s);合并排序publicclassmergesort{publicstaticvoidmergesort(int[]a){}publicstaticvoid mergepass(int[]x,int[]y,ints){}publicstaticvoidmerg e(int[]c,int[]d,intl,intm,intr){inti=1,j=m+1,k=1;in ti=0;while(i }}if(c[i]-(c[j])m)for(intq=j;q快速排序publicclassQsort{privatestaticvoidqsort(inta[],intp,intr){}privatest aticintpartition(inta[],intp,intr){inti=p;intj=r+1; intx=a[p];inttemp;while(true){while((a[++i]-x)0);if (i>=j)break;temp=a[i];if(p }}}a[j]=temp;mymath.s wap(a,i,j);//a[p]=a[j];a[j]=x;returnj;publicstaticv oidmain(string[]args){}inta[]={4,2,7,9,1};qsort(a,0,4);for(inti=0;;i++){}s ystem.out.println(a[i]);4.实验分析和总结掌握了递归与分治策略的基本思想掌握了递归算法在阶乘函数、Ackerman函数、整数划分等问题上的应用掌握了二分查找、合并排序、快速排序等问题的分治算法实现熟悉了myeclipse或eclipse等Java开发工具的使用。

算法设计与分析实验指导1_分治与递归

算法设计与分析实验指导1_分治与递归

《算法设计与分析》实验指导实验一分治与递归一、实验目的:1. 理解递归的概念。

2. 掌握设计有效算法的分治策略。

3. 掌握C++面向对象编程方法。

二、实验指导1. 分治法的总体思想求解一个复杂问题可以将其分解成若干个子问题,子问题还可以进一步分解成更小的问题,直到分解所得的小问题是一些基本问题,并且其求解方法是已知的,可以直接求解为止。

分治法作为一种算法设计策略,要求分解所得的子问题是同类问题,并要求原问题的解可以通过组合子问题的解来获取。

分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效的算法。

2. 分治法的基本步骤divide-and-conquer(P){if ( | P | <= n0) adhoc(P); //解决小规模的问题divide P into smaller subinstances P1,P2,...,Pk;//分解问题for (i=1,i<=k,i++)yi=divide-and-conquer(Pi); //递归的解各子问题return merge(y1,...,yk); //将各子问题的解合并为原问题的解}3. C++类定义例class Complex{public:Complex( ):real(0),imag(0) {} //构造函数Complex(double r,double i):real(r),imag(i) {} //构造函数Complex operator + (Complex c2); //重载“+”运算符operator double( ) //重载类型转换运算符{return real;}friend ostream& operator << (ostream&,Complex&); //重载流插入运算符“<<”private:double real;double imag;};三、实验内容及要求:在程序中创建一个学生对象数组并初始化数据,完成如下编程任务。

《算法设计与分析》实验报告:实验一(分治策略)

《算法设计与分析》实验报告:实验一(分治策略)

实验一我保证没有抄袭别人作业!1.实验题目必做:n 用分治思想设计实现二分搜索、合并排序,并且用不同数据量进行实验对比分析。

选做:阶乘(递归与分治)。

2.实验目的掌握设计算法的分治策略,通过实验学习分治策略设计技巧, 理解递归的概念验证二分搜索的时间复杂度。

掌握算法效率的分析和实验验证方法。

3.算法设计3.1 分治法基本思想将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。

然后递归的解这些子问题,然后将这些子问题的解合并得到原问题的解。

3.2二分搜索技术分解(devide):将n个元素分成个数大致相同的两半。

此时,原问题a[n]->子问题a[1,n/2]与a[2/n,n] 解决(conquer):取a[n/2]与欲查找的x作比较。

如果x=a[n/2],则找到x,算法终止。

如果x<a[n/2],则我们只要在数组a的左半部继续搜索x。

如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。

合并(combine):此结果无需合并。

3.3合并排序分解(devide):将n个元素分成个数大致相同的两半。

此时,原问题a[n]->子问题a[1,n/2]与a[2/n,n] 解决(conquer):递归解n/2规模的子问题合并(combine):合并已排好序的两部分进行合并。

3.4快速排序分解(devide):找到基准元素,将数组分为三部分,两段。

此时,原问题a[p,r]->子问题a[p,q-1]、a[q]、a[q+1,r]。

解决(conquer):通过递归调用快速排序,对数组a[p,q-1]与a[q+1,r]进行排序。

合并(combine):此结果无需合并,因为子数组都是原址排序得,所以不需要合并操作。

3.5阶乘分解(devide):将n!分成n*(n-1)!,每次使其规模减少一。

解决(conquer):如果n=0,则输出结果1。

如果n=1,则输出结果1。

递归与分治算法设计

递归与分治算法设计

实例:
1)
2)
总结
实验心得体会: 通过该试验,我掌握递归与分治策略 的基本思想,并通过设计求解给定问题的 递归算法和分治算法,学会使用递归和分 治法解决问题的一般技巧。 改进意见: 应学会熟练使用递归和分治法解决该 问题,认真学习递归分治策略的思想,还 有就是多练习用分治来解决一些实际问题 对于更好地掌握分治是有很大帮助的。要 掌握它,我还要多练习写这方面的程序。 指导教师:
ห้องสมุดไป่ตู้
} public static void main(String[] args) { int []a = new int[]{2,3,4,5,6,8,9}; //0 1 2 3 4 5 6 Scanner scn = new Scanner(System.in); int x = scn.nextInt(); int m = new Digui().binarySearch(a, x,0,a.length-1); if(a[m]==x){ System.out.println("与x相等的数据元素的下 标是"+ m); }else{ System.out.println("不存在" + x); if(a[m]>x){ System.out.println("比x大的最小数组元素 的下标是" + m); if((m-1)<0){ System.out.println("不存在比x小的数组 元素"); } }else{ System.out.println("比x小的最大数组元素 的下标是" + m); if(m >= a.length-1){ System.out.println("不存在比x大的数组 元素"); }else{ System.out.println("比x大的最小数组元 素的下标是" + (m +1)); } } } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华北水利水电学院算法分析与设计实验报告
20010~2011学年第二学期2008级计算机科学与技术专业
班级:2008109 学号:200810906 姓名:刘景超
实验一递归与分治算法的设计与实现
一、实验目的:
1、了解递归、分治算法的设计思路与设计技巧,理解递归的概念,掌握设计有效算法的
分治策略。

2、通过实际案例,领会算法的执行效率
二、试验内容:
棋盘覆盖、最接近点对、排序算法、矩阵乘法等,(也可选作其它问题);
三、核心程序源代码:
#include <stdio.h>
#include <iostream.h>
void main()
{
void hanoi(int n,char one,char two,char three);
int m;
cout<<"请输入要移动的盘子的数目:"<<endl;
cin>>m;
cout<<"盘子的数目为:"<<m<<endl;
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y)
{
cout<<x<<"-->"<<y<<endl;
}
四、试验结果:
五、小结
本想用MFC采用图形的方式展示移动的过程,可惜水平有限,实在是写不出来,只好采用控制台程序了。

采用控制台程序表述还是很简单的,算法也不复杂。

这次实验让我认识到我在MFC方面基础还很薄弱,还需要多多练习,慢慢提升自己。

相关文档
最新文档