实验报告实验一一、实验名称:分治和动态规划算法实现二、实验学时:4三、实验内容和目的:希望通过本次试验,加深对分治算法原理及实现过程的理解(1) 二分法求方程近似解:求方程f(x) = x^3 + x^2 - 1 = 0在[0,1]上的近似解,精确度为0.01。
(2) 给定一个顺序表,编写一个求出其最大值和最小值的分治算法。
分析:由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。
我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是我们找到求解该问题的子问题即: 数组大小 <= 2。
到此我们就可以进行分治运算了,只要求解的问题数组长度比 2 大就继续分治,否则求解子问题的解并更新全局解以下是代码。
四、实验原理:分治算法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。
递归的解这些子问题,然后将各子问题的解合并到原问题的解。
在递归算法中,原问题和子问题的区别关键在于尺寸的不同,实际上解决的是同样的问题,对于分解了的子问题分别求解,也可以在此分割,如此递归下去。
最后,自底向上逐步求出原问题的解。
五、实验器材(设备、元器件)电子科技大学计算机学院实验中心硬件环境:i5-2450M双核处理器,2.5GHz,NVIDIA GT630M独立显卡芯片,1GB独立显存,2GB DDR3内存,500GB硬盘空间软件环境:Windows 7操作系统及以上,Microsoft Visual Studio 2010六、实验步骤:(一)给定一个顺序表,编写一个求出其最大值和最小值的分治算法。
编写实验源代码如下:/*给定一个顺序表编写一个求出其最大值和最小值的分治算法*/#include"stdafx.h"#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define Len 1000000#define MIN(a,b)((a)>(b)?(b):(a))#define MAX(a,b)((a)>(b)?(a):(b))int a[Len] , n ;int GetMin(int l,int r){if (l==r) return a[l] ;int mid = (l+r)>>1 ;return MIN(GetMin(l,mid) , GetMin(mid+1,r)) ;}int GetMax(int l,int r){if (l==r) return a[l] ;int mid = (l+r)>>1 ;return MAX(GetMax(l,mid) , GetMax(mid+1,r)) ;}int main(){int i ;printf("请输入您顺序表中元素的个数:");scanf("%d",&n);printf("请依次输入您顺序表中的元素:");for (i = 0 ; i < n ; i++)scanf("%d",&a[i]);printf("MinValue = %d\n",GetMin(0,n-1)) ;printf("MaxValue = %d\n",GetMax(0,n-1)) ;system("pause");}运行结果如下:我们可以多次运行程序,更改我们的输入,来检查程序的正确性。
(二)二分法求方程近似解:求方程f(x) = x^3 + x^2 - 1 = 0在[0,1]上的近似解,精确度为0.01。
实验源程序如下:/*二分法求方程近¨似解求方程f(x) = x^3 + x^2 - 1 = 0在[0,1]上的近似解精确度为0.01。
*/#include "stdafx.h"#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>double function(double x){return x*x*x + x*x - 1 ;}int main(){double l = 0 , r = 1.0 , mid ;while (r-l>0.01){mid = (r+l)/2 ;if (function(mid)>=0)r = mid ;电子科技大学计算机学院实验中心elsel = mid ;}double ans = r ;printf("%.2f\n",ans);system("pause");}运行结果如下:七、实验数据及结果分析:程序的代码、数据、截图都放在实验步骤中具体体现,我们不妨来验证一下方程的解是否正确,将0.76带入函数中计算x^3+x^2-1中,得到结果为0.016576,这个结果在精度范围要求内是可以接受的,所以,我们可以说买这个程序得到的结果是可以接受的。
八、实验结论、心得体会和改进建议:在本实验中,利用递归算法,很好地解决了求解序列表中最大、最小值以及求解方程的解的功能,当然递归算法虽然实现起来较为简单,但是效率上可能会造成一些资源的浪费,可能选用其他更高效的算法来解决这些问题。
实验报告实验二一、实验名称:动态规划算法实现二、实验学时:4三、实验内容和目的:加深对动态规划算法原理及实现过程的理解理解动态规划算法的原理,用动态规划算法实现最长公共子序列问题。
四、实验原理:在动态规划算法中,对分治算法的效率进行了改善,同时能够解决更多种类的问题,一般适用于解最优化的问题。
动态规划算法一般分为四个步骤:找出最优解的性质,并刻画其结构特征;递归的定义最优值;以自底向上的方式计算出最优值;根据计算最优值时所得到的信息,构造最优解。
在这些步骤中,递归的定义最优值是动态规划算法的核心。
至于动态规划算法与分治算法的区别,动态规划算法一般解决分解出来的子问题数目太多,并且经分解的子问题往往不是相互独立的。
最长公共子序列问题描述:若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。
设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则:(1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。
(2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。
(3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。
最优值的计算:由于在所考虑的子问题空间中,总共有θ(mn)个不同的子问题,因此,用动态规划算法电子科技大学计算机学院实验中心自底向上地计算最优值能提高算法的效率算法描述:Algorithm lcsLength(x,y,b)m←x.length-1;n←y.length-1;c[i][0]=0; c[0][i]=0;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (x[i]==y[j])c[i][j]=c[i-1][j-1]+1;b[i][j]=1;else if (c[i-1][j]>=c[i][j-1])c[i][j]=c[i-1][j];b[i][j]=2;elsec[i][j]=c[i][j-1];b[i][j]=3;五、实验器材(设备、元器件)硬件环境:i5-2450M双核处理器,2.5GHz,NVIDIA GT630M独立显卡芯片,1GB独立显存,2GB DDR3内存,500GB硬盘空间软件环境:Windows 7操作系统及以上,Microsoft Visual Studio 2010六、实验步骤:源代码如下:/*编程实现最长公共子序列。
*/#include "stdafx.h"#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define Len 1000#define MIN(a,b)((a)>(b)?(b):(a))#define MAX(a,b)((a)>(b)?(a):(b))int dp[Len][Len] ;int n , m ;char a[Len] , b[Len] ;void main(){int i , j ;scanf("%s",a);scanf("%s",b);n = strlen(a) , m = strlen(b) ;memset(dp,0,sizeof(0));for (i = 1 ; i <= n ; i++)for (j = 1 ; j <= m ; j++){dp[i][j] = MAX(dp[i][j-1] , dp[i-1][j]) ;if (a[i-1] == b[j-1])dp[i][j] = MAX(dp[i-1][j-1] + 1 , dp[i][j]) ;}printf("Longest Common Subsequence = %d\n",dp[n][m]);system("pause");}程序运行结果:程序结果显示了两次输入的序列中最大的公共子序列长度。
电子科技大学计算机学院实验中心七、实验数据及结果分析:例如,序列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 的公共子序列。
例如:X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A} {B,C,A} {B,C,B,A}由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。
用c[i][j]记录序列X 和Y 的最长公共子序列的长度。