实验一分治与递归算法报告

合集下载

算法实验报告

算法实验报告

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

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

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

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

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

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

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

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

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

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

分治法:当n很小时,比如说,n≤2,识别出最重和最轻的金块,一次比较就足够了。

当n 较大时(n>2),第一步,把这袋金块平分成两个小袋A和B。

第二步,分别找出在A和B中最重和最轻的金块。

设A中最重和最轻的金块分别为HA 与LA,以此类推,B中最重和最轻的金块分别为HB 和LB。

第三步,通过比较HA 和HB,可以找到所有金块中最重的;通过比较LA 和LB,可以找到所有金块中最轻的。

在第二步中,若n>2,则递归地应用分而治之方法程序设计据上述步骤,可以得出程序1 4 - 1的非递归代码。

该程序用于寻找到数组w [ 0 : n - 1 ]中的最小数和最大数,若n < 1,则程序返回f a l s e,否则返回t r u e。

当n≥1时,程序1 4 - 1给M i n和M a x置初值以使w [ M i n ]是最小的重量,w [ M a x ]为最大的重量。

首先处理n≤1的情况。

若n>1且为奇数,第一个重量w [ 0 ]将成为最小值和最大值的候选值,因此将有偶,数个重量值w [ 1 : n - 1 ]参与f o r循环。

当n 是偶数时,首先将两个重量值放在for 循环外进行比较,较小和较大的重量值分别置为Min和Max,因此也有偶数个重量值w[2:n-1]参与for循环。

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

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

实验一递归与分治策略一、实验目的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.提高学生综合应用所学知识解决实际问题的能力。

递归与分治实验报告

递归与分治实验报告

递归与分治实验报告班级:计科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)
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)); } } } }

算法设计与分析:递归与分治法-实验报告(总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);

实验一 分治与递归

实验一 分治与递归

牌不得重叠覆盖。 三、实验提示 void chessBoard(int tr, int tc, int dr, int dc, int size) { if (size == 1) return; int t = tile++, // L 型骨牌号 s = size/2; // 分割棋盘 // 覆盖左上角子棋盘 if (dr < tr + s && dc < tc + s) // 特殊方格在此棋盘中 chessBoard(tr, tc, dr, dc, s); else {// 此棋盘中无特殊方格 // 用 t 号 L 型骨牌覆盖右下角 board[tr + s - 1][tc + s - 1] = t; // 覆盖其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s);} // 覆盖右上角子棋盘 if (dr < tr + s && dc >= tc + s) // 特殊方格在此棋盘中 chessBoard(tr, tc+s, dr, dc, s); else {// 此棋盘中无特殊方格 // 用 t 号 L 型骨牌覆盖左下角 board[tr + s - 1][tc + s] = t; // 覆盖其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s);} // 覆盖左下角子棋盘 if (dr >= tr + s && dc < tc + s) // 特殊方格在此棋盘中 chessBoard(tr+s, tc, dr, dc, s); else {// 用 t 号 L 型骨牌覆盖右上角 board[tr + s][tc + s - 1] = t; // 覆盖其余方格 chessBoard(tr+s, tc, tr+s, tc+s-1, s);} // 覆盖右下角子棋盘 if (dr >= tr + s && dc >= tc + s) // 特殊方格在此棋盘中 chessBoard(tr+s, tc+s, dr, dc, s); else {// 用 t 号 L 型骨牌覆盖左上角 board[tr + s][tc + s] = t; // 覆盖其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s);} } 四、运行结果

实验一 递归与分治法

实验一  递归与分治法

实验一递归与分治法
一、实验目的:
利用递归与分治法解决简单问题,加深对分治算法的理解与掌握。

二、实验内容:
利用递归与分治法解决Strassen矩阵乘法问题。

三、实验原理与方法:
递归与分治法。

四、实验条件:
具有C语言编程平台、JAVA语言编程平台的计算机系统;Internet环境。

五、实验步骤:
1、设计解决“Strassen矩阵乘法”的分治算法;
2、编程实现“Strassen矩阵乘法”分治算法。

六、实验注意事项:
算法设计要求能解决一定规模的问题,Strassen矩阵乘法中矩阵阶N可达16;递归分治维数为2*2;算法实现要有一定的测试量和等价覆盖,有一定的健壮性。

七、实验报告要求:
1、实验报告格式应使用院系实验报告参考格式。

2、“一、实验预习部分”,主要填写实验目的、实验内容、实验原理、实验条件、算法设计等,其中算法设计是主要部分。

3、“二、实验过程记录”,主要记录实验的步骤与方法,主体部分是算法的实现,程序运行结果等,要有算法实现核心代码。

4、“三、实验结果与讨论”,主要总结做了什么,结果怎样,遇到哪些重要问题,如何解决的,有哪些技术提高,还有哪些问题有待进一步研究。

5、实验报告用语应尽量采用书面技术语言,以求简明准确。

6、实验报告应独立完成,在规定时间内提交。

1。

实验1 递归与分治算法

实验1  递归与分治算法

淮海工学院计算机工程学院实验报告书课程名:《算法分析与设计》题目:实验1 递归与分治算法班级:软件102班学号:111003215姓名:鹿迅实验1 递归与分治算法实验目的和要求(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。

(3)分别用蛮力法和分治法求解最近对问题;(4)分析算法的时间性能,设计实验程序验证分析结论。

实验内容设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。

实验环境Turbo C 或VC++实验学时2学时,必做实验数据结构与算法#include<iostream>#include<Cmath>#include<algorithm>#define N 100using namespace std;struct point{int x,y;};bool cmpx(point a,point b){return a.x<b.x;}bool cmpy(point a,point b){return a.y>b.y;}{int k;k=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);return k;}double min(double d1,double d2){if(d1<=d2)return d1;elsereturn d2;}bool different(point p[],int n,int start,int end){for(int i=start;i<end;i++){if(p[i].x==p[end].x&&p[i].y==p[end].y)return true;}return false;}int ClosestPoints1(point p[],int n,point & one,point & two)//求出两最近点的相关信息{int d=9999;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){int temp=Sqrt(p[i],p[j]);if(temp<d){one=p[i];two=p[j];d=temp;}return d;}int ClosestPoints2(point S[],int n){if(n<2) return 10000;if(n==2){int d=Sqrt(S[0],S[1]);return d;}sort(S,S+n,cmpx);//按照X大小排序int m=S[n/2].x;int t=n/2;int i=0;point S1[5000],S2[5000];for(i=0;i<t;i++){S1[i]=S[i];}for(i=t;i<n;i++){S2[i-t]=S[i];}int d1=ClosestPoints2(S1,t);int d2=ClosestPoints2(S2,n-t);int d=min(d1,d2);point p1[N],p2[N];int j=0;int p1l=0,p2l=0;//对x坐标差值在2d之间的点进行归类,找到这些点for(i=0;i<t;i++){if(abs(S1[i].x-m)<d){p1[p1l]=S1[i];p1l++;}for(i=0;i<n-t;i++){if(abs(S2[i].x-m)<d){p2[p2l]=S2[i];p2l++;}}//对两个区间内的点沿Y坐标轴进行排序sort(p1,p1+p1l,cmpy);sort(p2,p2+p2l,cmpy);int md=9999;for(i=0;i<p1l;i++){for(j=0;fabs(p2[j].y-p1[i].y)<d;j++){int pd=Sqrt(p1[i],p2[j]);md=min(pd,md);}}return min(d,md);}void main(){point p[N],a,b;int n=20;int d;cout<<"please input the number of the points:";cin>>n;cout<<"the points:"<<endl;for(int i=0;i<n;i++){p[i].x=rand()%131;p[i].y=rand()%131;while(different(p,n,0,i)){p[i].y=rand()%50;}cout<<" ("<<p[i].x<<","<<p[i].y<<") "<<" ";}d=ClosestPoints1(p,n,a,b);cout<<endl;cout<<"蛮力法求最近点对:"<<endl;cout<<"the distance of two points:"<<sqrt(d)<<endl;cout<<"the point ("<<a.x<<","<<a.y<<") the another point ("<<b.x<<","<<b.y<<")"<<endl;d=ClosestPoints2(p,n);cout<<"分治法求最近点对:"<<endl;cout<<"the distance of two points:"<<sqrt(d)<<endl;cout<<" the point ("<<a.x<<","<<a.y<<") the another point ("<<b.x<<","<<b.y<<")"<<endl;cout<<"实验测试点数为:"<<n<<endl;}核心源代码蛮力法核心源代码:int ClosestPoints1(point p[],int n,point & one,point & two)//蛮力法求出两最近点的相关信息{int d=9999;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){int temp=Sqrt(p[i],p[j]);if(temp<d){one=p[i];two=p[j];d=temp;}}return d;}int ClosestPoints2(point S[],int n){if(n<2) return 10000;if(n==2){int d=Sqrt(S[0],S[1]);return d;}sort(S,S+n,cmpx);//按照X大小排序int m=S[n/2].x;int t=n/2;int i=0;point S1[5000],S2[5000];for(i=0;i<t;i++){S1[i]=S[i];}for(i=t;i<n;i++){S2[i-t]=S[i];}int d1=ClosestPoints2(S1,t);int d2=ClosestPoints2(S2,n-t);int d=min(d1,d2);point p1[N],p2[N];int j=0;int p1l=0,p2l=0;//对x坐标差值在2d之间的点进行归类,找到这些点for(i=0;i<t;i++){if(abs(S1[i].x-m)<d){p1[p1l]=S1[i];p1l++;}}for(i=0;i<n-t;i++)if(abs(S2[i].x-m)<d){p2[p2l]=S2[i];p2l++;}}//对两个区间内的点沿Y坐标轴进行排序sort(p1,p1+p1l,cmpy);sort(p2,p2+p2l,cmpy);int md=9999;for(i=0;i<p1l;i++){for(j=0;fabs(p2[j].y-p1[i].y)<d;j++){int pd=Sqrt(p1[i],p2[j]);md=min(pd,md);}}return min(d,md);}实验结果实验体会通过这次实验,我深刻了解到分治法的实用性,有效性。

算法与设计实验报告

算法与设计实验报告

实验一分治与递归(4学时)一、实验目的与要求1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解二、实验内容掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。

三、实验题任意输入一个整数,输出结果能够用递归方法实现整数的划分。

四、程序代码五、实验结果首先按照提示输入数字:按回车键,得到此数划分的个数:此时您可以接着计算另一个数的划分个数:若要退出,请输入一个小于等于零的数:六、结果分析及程序功能经过和其它同学的实验数据对比,初步认定此程序基本正确,然而不足之处是只能得到划分的个数,而不能列出每个划分的详细情况。

一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法二、实验题盘覆盖问题:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

三、程序代码四、实验结果按照提示输入特殊方格的行号和列号(起始行列号为0):按回车键,得到一个矩阵,数字相同区域为一个L型骨牌覆盖:五、结果分析及程序功能得到的16*16棋盘覆盖结果正确,此程序的不足之处:只能设定特殊方格的行列号,而不能设定棋盘的大小。

实验二动态规划算法(4学时)一、实验目的与要求1、熟悉最长公共子序列问题的算法;2、初步掌握动态规划算法;二、实验题若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。

例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。

算法实验报告一 分治法实验

算法实验报告一   分治法实验

算法实验报告一分治法实验一、实验目的及要求利用分治方法设计大整数乘法的递归算法,掌握分治法的基本思想和算法设计的基本步骤。

要求:设计十进制的大整数乘法,必须利用分治的思想编写算法,利用c语言(或者c++语言)实现算法,给出程序的正确运行结果。

(必须完成)设计二进制的大整数乘法,要求利用分治的思想编写递归算法,并可以实现多位数的乘法(利用数组实现),给出程序的正确运行结果。

(任选)二、算法描述1、输入两个相同位数的大整数u,v输出uv的值判断大整数的位数i;w=u/10^(i/2);y=v/10^(i/2);x=u-w*10^(i/2);z= v-y*10^(i/2);然后将w,x,y,z代入公式求得最后结果uv=wy10^i+((w+x)(y+z)-wy-xz)10^(i/2)+xz三、调试过程及运行结果在实验中我遇到的问题:原来以为这两个大整数的位数不同,结果题目要求是相同位数的大整数在写10的多少次方时,写的是10^(i/2),10^(i),结果不对,我就将它改成了for循环语句四、实验总结在本次实验中,我知道了分治算法,以及分治算法的基本思想。

我还掌握了编写大整数乘法的算法与步骤,以及如何修改在编写程序时遇到的问题。

五、附录(源程序代码清单)1、#include<iostream.h>int weishu(int x){int i;while(x!=0){x=x/10;i++;}return i;}void main(){int u,v;cout<<"输入两个位数相同的大整数:"<<endl;cin>>u;cin>>v;int i,j,m,n;int p,x,y,z,w;int a=1;int b=1;i=weishu(u);for(int k=1;k<=i;k++){a=a*10;}for(int q=1;q<=i/2;q++){b=b*10;}w=u/b;y=v/b;x=u-w*b;z=v-y*b;p=w*y*a+((w+x)*(y+z)-w*y-x*z)*b+x*z;cout<<u<<"*"<<v<<"="<<p;}教师评语:成绩:√优良中及格不及格算法实验报告二动态规划法实验一、实验目的及要求利用动态规划方法设计背包问题算法,掌握动态规划法的基本思想和算法设计的基本步骤。

算法实验报告

算法实验报告

编写程序,实现线性时间内选择 n 个元素的中位数的算法。

并对于不同的 n,测试平均时间效率。

本问题属于线性选择问题的一个特例,可以使用分治法进行求解。

其基本思想是摹仿快速排序方法,对输入的数组进行划分,求出中位数所在的子数组,然后用递归的方法进行求解,最终可以求得问题的解。

将n 个输入元素根据随机选择的基准划分成2 个子数组,a[p:r]被划分成a[p:i]和a[i+1:r]两组,使得a[p:i]中每一个元素都不大于a[i+1:r] 中元素。

接着算法计算子数组a[p:i]中元素个数j,如果k<=j,则a[p:r] 中第k 个小元素落在子数组a[p:i]中元素均小于要找的第k小元素,因此要找的a[p:r]中第k 小元素是a[i+1:r]中的第k-j 小元素。

按照上述的方法递归的执行,直到当前数组中只剩下一个元素,就可以得到问题的解。

#include "iostream.h"#include "stdlib.h"#include "time.h"#include <sys/types.h>#include <sys/timeb.h>#include "windows.h"#include<stdio.h>int randomizedSel(int *,int ,int ,int );void main(){srand((unsigned int)time(NULL));_timeb time0,time1;int n;cout << "请输入数组的长度: ";cin >> n;cout << "请输入数组的每一个数: " << endl;int *a=new int[n];for(int i=0;i<n;i++)cin >> a[i];DWORD stime=GetTickCount();_ftime(&time0);int result=randomizedSel(a,0,n-1,(n+1)/2);DWORD Etime=GetTickCount();_ftime(&time1);cout << "结果为: " << result << endl;cout << litm*litm*1000<<endl;cout<<Etime-stime<<endl;}void swap(int *a,int i,int j){int temp=a[i];a[i]=a[j];a[j]=temp;}int partition(int *a,int p,int r){int i=p,j=r+1;int x=a[p];while(1){while(a[++i]<x && i<r);while(a[--j]>x);if(i>=j) break;swap(a,i,j);}a[p]=a[j];a[j]=x;return j;}int randomizedpar(int *a,int p,int r){int i=rand()%(r-p+1)+p;swap(a,i,p);return partition(a,p,r);}int randomizedSel(int *a,int p,int r,int k){if(p == r)return a[p];int i=randomizedpar(a,p,r);int j=i-p+1;if(k<=j) return randomizedSel(a,p,i,k);else return randomizedSel(a,i+1,r,k-j);}运行结果如下图所示:经过测试,当输入的数组长度不大时,执行时间几乎为零,当输入数组很大时,执行时间随之增大,与数组长度成正相关。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告目录实验一:递归与分治 (1)二分查找归并排序快速排序实验二:回溯算法 (8)0—1背包实验三:动态规划 (12)矩阵连乘最少乘法数实验一:递归与分治一、实验目的理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。

掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。

二、实验内容1.二分查找在对线性表的操作中,经常需要查找某一个元素在线性表中的位置。

此问题的输入是待查元素x和线性表L,输出为x在L中的位置或者x不在L中的信息。

2.合并排序3.快速排序对本实验中的问题,设计出算法并编程实现。

实验总结及思考三、实验过程1.二分查找算法:BinSearch(aArray[0,1……n-1],key)low<---0;right<---n-1;while low<=right dom<---(low+(right-low))/2;if key>aArray[mid]l<---mid+1;if key<aArray[mid]r<---mid-1;if key=aArray[mid]return mid;代码:#include <iostream>using namespace std;void Binary(int aArray[],int key,int length) //二分查找{int mid,low,high;mid=low=0;high=length-1;while(low<=high){mid = low + ((high - low)/2); //使用(low + high) / 2 会有整数溢出的问题if(low<0||high>=length||high - low==0){cout<<"元素不存在,查找失败"<<endl;}if(key>aArray[mid]) //key在右边{low=mid+1;}else if(key<aArray[mid]) //key在左边{high=mid-1;}else{cout<<"查找成功,元素的位置是:"<<mid<<endl;break;}}}int main(){int length = 0;int key = 0;cout<<"请输入数组的长度:"<<endl;cin >> length;int* aArray = new int[length];cout<<"请输入数组:"<<endl;for (int i = 0; i < length; i++){cin >> aArray[i];}cout<<"请输入待查找的数字:"<<endl;cin >> key;Binary(aArray,key,length);delete aArray; //释放空间return 0;}二分查找的平均时间复杂度为O(logn)最坏情况下的时间复杂度O(n)运行截图:2.合并排序基本操作如下:(1)分解:将n 个元素分成各含n/2 个元素的子序列(2)解决:用合并排序法对两个子序列递归地排序(3)合并:合并两个已排好序的子序列得到排序结果在对子序列排序时,其长度为1 时递归结束。

算法设计与分析实验报告

算法设计与分析实验报告

本科实验报告课程名称:算法设计与分析实验项目:递归与分治算法实验地点:计算机系实验楼110专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真指导教师:郝晓丽2018年05月04 日实验一递归与分治算法1.1 实验目的与要求1.进一步熟悉C/C++语言的集成开发环境;2.通过本实验加深对递归与分治策略的理解和运用。

1.2 实验课时2学时1.3 实验原理分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。

需要注意的是,分治法使用递归的思想。

划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。

最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。

1.4 实验题目1.上机题目:格雷码构造问题Gray码是一个长度为2n的序列。

序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。

试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。

对于给定的正整数n,格雷码为满足如下条件的一个编码序列。

(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。

(2)序列中无相同的编码。

(3)序列中位置相邻的两个编码恰有一位不同。

2.设计思想:根据格雷码的性质,找到他的规律,可发现,1位是0 1。

两位是00 01 11 10。

三位是000 001 011010 110 111 101 100。

n位是前n-1位的2倍个。

N-1个位前面加0,N-2为倒转再前面再加1。

3.代码设计:}}}int main(){int n;while(cin>>n){get_grad(n);for(int i=0;i<My_grad.size();i++)cout<<My_grad[i]<<endl;My_grad.clear();}return 0;}运行结果:1.5 思考题(1)递归的关键问题在哪里?答:1.递归式,就是如何将原问题划分成子问题。

最近对问题递归与分治算法

最近对问题递归与分治算法

实验1 递归与分治算法一,实验目的和要求(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。

(3)分别用蛮力法和分治法求解最近对问题;(4)分析算法的时间性能,设计实验程序验证分析结论。

二,实验内容设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。

三,实验环境Turbo C 或VC++四,实验学时2学时,必做实验五,数据结构与算法#include<>#include<cmath>#define TRUE 1#define FALSE 0typedef struct Node{double x;double y;}Node; >>[i].y;}>r[j+1].x){b=r[j].x;c=r[j].y;r[j].x=r[j+1].x;r[j].y=r[j+1].y;r[j+1].x=b;r[j+1].y=c;change=TRUE;}}}}>=(midX-d)) <=(midX+d)&&j<= <[i].y-d)||[j].y>[i].y+d)) ;DivideConquer(L,closenode,begin,mid); <<" Y="<<[i].y<<"\n";BruteForce(list,closenode,0,;cout<<"用蛮力法求最近对:"<<endl;cout<<"最近对为点 ("<<","<<")和点("<<","<<")\n"<<"最近距离为: "<<sqrt<<endl; cout<<endl<<endl;cout<<"用分治法求最近对:"<<endl;paixu(list);cout<<"经过排序后的各点:"<<endl;for(int j=0;j<;++j)cout<<"X="<<[j].x<<" Y="<<[j].y<<"\n";DivideConquer(list,closenode,0,;cout<<"最近对为点 ("<<","<<")和点("<<","<<")\n"<<"最近距离为: "<<sqrt<<endl; }六,核心源代码>=(midX-d)) <=(midX+d)&&j<= <[i].y-d)||[j].y>[i].y+d)) ;DivideConquer(L,closenode,begin,mid); //继续在左半边用分治法求最近对DivideConquer(L,closenode,mid+1,end); //继续在右半边用分治法求最近对middle(L,closenode,mid,midX); //判断左右各距中线d的区域,是否有最近对}}七,实验结果八,实验体会通过这次实验,我深刻了解到分治法的实用性,有效性。

分治与递归算法实验

分治与递归算法实验

分治与递归算法实验实验⼆分治与递归算法的应⽤⼀、实验⽬的1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析⽅法。

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

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

⼆、实验内容1.问题描述:题⽬⼀:线性时间选择给定n个元素和⼀个整数k,要求⽤O(n)时间找出这n个元素中第k⼩元素。

题⽬⼆:⾦块问题⽼板有⼀袋⾦块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的⼀块,最差的雇员得到其中最轻的⼀块。

假设有⼀台⽐较重量的仪器,希望⽤最少的⽐较次数找出最重和最轻的⾦块。

并对⾃⼰的程序进⾏复杂性分析。

【输⼊输出样例】题⽬三:求最⼤两个数和最⼩两个数利⽤分治法求⼀组数据中最⼤的两个数和最⼩的两个数。

2.数据输⼊:个⼈设定,由键盘输⼊。

3.要求:1)上述题⽬任选其⼆。

上机前,完成程序代码的编写2)独⽴完成实验及实验报告三、实验步骤1.理解算法思想和问题要求;2.编程实现题⽬要求;3.上机输⼊和调试⾃⼰所编的程序;4.验证分析实验结果;5.整理出实验报告。

⼀.实验⽬的⼆.问题描述三.算法设计包含:数据结构与核⼼算法的设计描述、函数调⽤及主函数设计、主要算法流程图等1.⾦块问题:考虑到可能输⼊数据有⼀个或者两个这种情况,所以解决问题时分三种情况考虑,然后通过函数调⽤来实现寻找最⼤最⼩的数值。

复杂性分析:当n是2的幂时,即对于某个正整数k,n等于2的k次⽅,可以证明,任何以元素⽐较为基础的找最⼤和最⼩元素的算法,其元素⽐较下界均为[3n/2]-2次。

因此,过程maxmin在这种意义上是最优的。

T(n)=2T(n/2)+22.最⼤最⼩两个数:与⾦块问题类似,这是寻找最⼤最⼩的两个数。

利⽤循环嵌套条件语句进⾏判断,选择出最⼤最⼩的两个数。

四.程序调试及运⾏结果分析1)有五个⾦块,其重量分别为2.3,1.3 ,6.9, 2, 1成功运⾏程序后输出最重和最轻的⾦块的重量。

算法设计实验报告

算法设计实验报告

实验报告院部:计算机信息与科学专业班级:计科1703学号:学生姓名:学期: 2019-2020-2}printf("\n\n");bubble(a, n);printf("冒泡递增排列为:\n");for (i = 0; i < n; i++) {printf("%d ", a[i]);}printf("\n");printf("\n");printf("99乘法表如下:\n");chengfa(1, 1);system("pause");return 0;}图1-1 运行结果printf("您输入的字符串超过最大长度,请重新输入!");scanf("%s", X);}printf("请输入字符串Y:");scanf("%s", Y);while (strlen(Y) > 200){printf("您输入的字符串超过最大长度,请重新输入!");scanf("%s", Y);}s = LCS(X, Y);printf("X和Y的LCS数: %d \n", s);printf("----------------分割线----------------\n"); printf("投资最大利润问题:\n");profit();}图2-1 运行结果图3-1 运行结果五实验小节通过本次实验,充分理解了动态规划的基本思想和程序的执行过程,并且能熟练编写相应的程序;同时,在编程的过程中,进一步加深理解动态规划算法的两个基本要素最优子结构性质和子问题的重叠性质,对上一次实验所学到的知识进行了进一步的巩固加强,学会了规避一些逻辑上的错误;熟练地掌握了典型的动态规划问题,能够运用动态规划思想分析问题的一般方法,对较简单的问题能够正确分析,设计出动态规划算法,并且能快速编程实现。

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

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

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

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

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

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

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

三、算法设计
在n个元素的集合中寻找最大和最小值元素。

(1)将集合一分为二,变为两个集合,目的是在较小的两个集合中分别找最大、最小元素。

(2)递归分解较小集合,直到每个集合中的元素个数≤2,然后找出小集合的最大、最小元素。

(3)合并(回溯):自低向上把子问题的解合并,大元素中取最大者,小元素中取最小者,最后得到元问题的解。

四、验证分析实验结果
图1.1 运行界面
图1.2 运行结果五、程序
#include <stdio.h>
int a[100];
maxmin(int i,int j,int &fmax,int &fmin){
int mid ;
int lmin,lmax,rmin,rmax;
if (i==j){
fmax=a[i];
fmin=a[i];
}
else if (i==(j-1)){
if (a[i]<a[j])
{
fmax=a[j];
fmin=a[i];
}
else{
fmax=a[i];
fmin=a[j];
}
}
else {
mid=(i+j)/2;
maxmin(i,mid,lmax,lmin);
maxmin(mid+1,j,rmax,rmin);
if ( lmax>rmax) fmax=lmax;
else fmax=rmax;
if ( lmin<rmin) fmin=lmin;
else fmin=rmin;
}
}
int main (){
int n,i,j,max,min;
printf ("输入金块总数:");
scanf("%d",&n);
printf ("输入一组金块质量");
for (i=1;i<=n;i++){
scanf("%d",&a[i]);
}
i=1;
maxmin(i,n,max,min);
printf("%d\n %d\n",max,min);
return 0;
}
六、实验总结
二分法通过分析时间复杂度和占用空间。

而二分法的思想是通过把大问题逐
步分解为小问题,直到可解的小问题,最后把小问题的分解部分合并,最终得到大问题的解。

但是二分法的内存消耗大。

相关文档
最新文档