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

合集下载

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

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

实验一递归与分治策略一、实验目的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-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.1.理解递归算法的思想,并学会应用递归思想解决问题。

1.2.掌握分治法的基本思想,并学会应用分治思想解决问题。

2. 实验环境
2.1 Eclipse
2.2 Window XP
3. 实验内容
3.1 二分搜索问题:利用递归法解决二分搜索问题。

3.2 全排列问题:给定n个字符,要求生成这n个字符的全排序。

4. 教师批改意见
成绩
签字:
日期:
实验报告细表
1实验题目(比如:众数问题)
1.1 算法设计思想
可文字描述,适当添加一些伪代码,或者流程图来进行补充说明
1.2 程序源码
1.3 实验结论(结果验证)
要有截图,验证最后结果(图片分布要合理)。

截图要格式参考如下:
输入跟input.txt中一致,按output.txt规格输出。

一般以ns 为单位。

当数字太大时,比如:
可切换成ms为单位。

1.4 心得体会
2实验题目(比如:xx问题)
2.1 算法设计思想
2.2 程序源码
2.3 实验结论(结果验证)
2.4 心得体会。

算法设计与分析实验指导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.了解并掌握递归的概念,递归算法的基本思想;2.掌握分治法的基本思想方法;3.了解适用于用分治法求解的问题类型,并能用递归或非递归的方式设计相应的分治法算法;4.掌握分治法复杂性分析方法,比较同一个问题的递归算法与循环迭代算法的效率。

预习与实验要求1.预习实验指导书及教材的有关内容,掌握分治法的基本思想;2.严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;3.认真听讲,服从安排,独立思考并完成实验。

实验原理简单说来,当一个函数用它自己来定义时就称为递归。

一般来说,递归需要有边界条件、递归前进段和递归返回段。

当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

因此,在考虑使用递归算法编写程序时,应满足两点:1)该问题能够被递归形式描述;2)存在递归结束的边界条件。

递归的能力在于用有限的语句来定义对象的无限集合。

用递归思想写出的程序往往十分简洁易懂。

一般说来,一个递归算法可以转换称为一个与之等效的非递归算法,但转换后的非递归算法代码将成倍地增加。

分治是一种被广泛应用的有效方法,它的基本思想是把最初的问题分解成若干子问题,然后在逐个解决各个子问题的基础上得到原始问题的解。

所谓分治就是“分而治之”的意思。

由于分解出的每个子问题总是要比最初的问题容易些,因而分治策略往往能够降低原始问题的难度,或者提高解决原始问题的效率。

根据如何由分解出的子问题求出原始问题的解,分治策略又可分为两种情形:第一,原始问题的解只存在于分解出的某一个子问题中,则只需要在原始问题的一个划分中求解即可;第二,原始问题的解需要由各个子问题的解再经过综合处理得到。

无论是哪一种情况,分治策略可以较快地缩小问题的求解范围,从而加快问题求解的速度。

分治策略运用于计算机算法是,往往会出现分解出来的子问题与原始问题类型相同的现象,而与原问题相比,各个子问题的规模变小了,这刚好符合递归的特征。

因此分治策略往往是和递归联系在一起的。

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)实验目的:掌握递归与分治法的基本思想和应用,学会设计和实现递归算法和分治算法,能够分析和评价算法的时间复杂度和空间复杂度。

实验内容:1.递归算法的设计与实现3.算法的时间复杂度和空间复杂度分析实验步骤:1)递归定义:一个函数或过程,在其定义或实现中,直接或间接地调用自身的方法,被成为递归。

递归算法是一种控制结构,它包含了解决问题的基础情境,也包含了递归处理的情境。

2)递归特点:递归算法具有以下特点:①依赖于递归问题的部分解被划分为若干较小的部分。

②问题的规模可以通过递推式递减,最终递归终止。

③当问题的规模足够小时,可以直接求解。

3)递归实现步骤:①确定函数的定义②确定递归终止条件③确定递归调用的过程4)经典实例:斐波那契数列递推式:f(n) = f(n-1) + f(n-2)int fib(int n) {if (n <= 0)return 0;else}5)优化递归算法:避免重复计算例如,上述斐波那契数列的递归算法会重复计算一些中间结果,影响效率。

可以使用动态规划技术,将算法改为非递归形式。

int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {f1 = f2;使用循环避免递归,重复计算可以大大减少,提高效率。

1)分治算法的定义:将原问题分解成若干个规模较小且类似的子问题,递归求解子问题,然后合并各子问题得到原问题的解。

2)分治算法流程:②将问题分解成若干个规模较小的子问题。

③递归地解决各子问题。

④将各子问题的解合并成原问题的解。

3)分治算法实例:归并排序归并排序是一种基于分治思想的经典排序算法。

排序流程:②分别对各子数组递归进行归并排序。

③将已经排序好的各子数组合并成最终的排序结果。

实现源代码:void mergeSort(int* arr, int left, int right) {if (left >= right)while (i <= mid && j <= right)temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];temp[k++] = arr[i++];1) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。

递归和分治策略

递归和分治策略
二、实验内容、过程和结果(实验主要内容的介绍、主要的操作步骤、程序代码和测试数据及实验结果)
1.内容介绍:
分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。下面将用分治思想设计出求一组数据中的最大值与最小值方案
2.程序代码:
#include<iostream>
成绩
评阅老师
using namespace std;
int max(int a,int b);
int min(int a,int b);
void max_min(int *num,int l,int r,int &maxnum,int &minnum)
{
if(l==r) //数组只有一个元素
{
maxnum=num[l];
实验报告
《算法设计与分析》课程
《算法设计与分析》课程实验报告(一)
实验题目
用递归和分治策略求解数组中最大值与最小值
实验时间
一、实验目的及要求
1.理解递归的概念
2.掌握设计有效算法的分治策略
3.通过二分搜索技术,大整数乘法,Strassen矩阵乘法,棋盘覆盖,合并排序和快速排序,线性时间选择,
最接近点对问题,循环赛日程表学习分治策略设计技巧
}
int m =(l+r)/2;
int lmax,lmin;
max_min(num,l,m,lmax,lmin); //递归求左半部分最大最小值
int rmax,rmin;
max_min(num,m,r,rmax,rmin); //递归求右半部分最大最小值
maxnum = max(lmax,rmax);

实验一--分治与递归算法的应用

实验一--分治与递归算法的应用

实验一分治与递归算法的应用一、实验目的1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法。

2.熟练掌握用递归设计分治算法的基本步骤(基准与递归方程)。

3.学会利用分治算法解决实际问题。

二、问题描述金块问题老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。

假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。

并对自己的程序进行复杂性分析。

3、问题分析一般思路:假设袋中有n 个金块。

可以用函数M a x,通过n-1次比较找到最重的金块。

找到最重的金块后,可以从余下的n-1个金块中用类似法通过n-2次比较找出最轻的金块。

这样,比较的总次数为2n-3。

分治法:如果集合中只有1个元素,则它既是最大值也是最小值;如果有2个元素,则一次maxnum(i,j) 一次minnum(i,j)就可以得到最大值和最小值;如果把集合分成两个子集合,递归的应用这个算法分别求出两个子集合的最大值和最小值,最后让子集合1的最大值跟子集合2的最大值比较得到整个集合的最大值;让子集合1的最小值跟子集合2的最小值比较得到整个集合的最小值。

四、程序设计对金块问题的程序设计如下:(1)核心算法分析double Search_Max(double g[],int left,int right)与double Search_Min(double g[],int left,int right)函数分别是求最大重量与最小重量金块的被调用函数,函数体中当left==right时,只有一个重量,最小和最大重量相等,分别直接返回返回g[left],g[right]。

当right-left==1时,有两个重量,分别调用一次min(g1,g2)和max (g1,g2)函数就可得出最小与最大重量,分别返回。

当right-left>1时,mid=(left+right)/2取中点,将数据群分为两半,分别递归调用,最后将得到的两个数据群的最值运用min()或max()函数得到最小最大重量。

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

一、实验目的:
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); //将各子问题的解合并为原问题的解
}
三、实验内容及要求:
在程序中创建一个学生对象数组并初始化数据,完成如下编程任务。

⑴找出成绩排名第4的学生,输出其姓名。

要求:
①编写功能较为完善的学生类,重载必要的运算符;
②使用快速排序的方法。

⑵使用分治法找出成绩最高和成绩最低的学生,输出他们的姓名。

四、实验报告要求
①实验报告只写实验⑵。

②写出算法思想、主要程序代码、算法复杂性分析。

1。

相关文档
最新文档