算法导论上机报告
计算方法上机实验报告

《计算方法》上机实验报告班级:XXXXXX小组成员:XXXXXXXXXXXXXXXXXXXXXXXXXXXX任课教师:XXX二〇一八年五月二十五日前言通过进行多次得上机实验,我们结合课本上得内容以及老师对我们得指导,能够较为熟练地掌握Newton迭代法、Jacobi迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法与Gauss 求积公式等六种算法得原理与使用方法,并参考课本例题进行了MATLAB程序得编写。
以下为本次上机实验报告,按照实验内容共分为六部分.实验一:一、实验名称及题目:Newton迭代法例2、7(P38):应用Newton迭代法求在附近得数值解,并使其满足、二、解题思路:设就是得根,选取作为初始近似值,过点做曲线得切线,得方程为,求出与轴交点得横坐标,称为得一次近似值,过点做曲线得切线,求该切线与轴得横坐标称为得二次近似值,重复以上过程,得得近似值序列,把称为得次近似值,这种求解方法就就是牛顿迭代法。
三、Matlab程序代码:function newton_iteration(x0,tol)syms z %定义自变量formatlong%定义精度f=z*z*z-z-1;f1=diff(f);%求导y=subs(f,z,x0);y1=subs(f1,z,x0);%向函数中代值x1=x0-y/y1; k=1;whileabs(x1—x0)〉=tolx0=x1;y=subs(f,z,x0);y1=subs(f1,z,x0);x1=x0-y/y1;k=k+1;endx=double(x1)K四、运行结果:实验二:一、实验名称及题目:Jacobi迭代法例3、7(P74):试利用Jacobi迭代公式求解方程组要求数值解为方程组得精确解、二、解题思路:首先将方程组中得系数矩阵分解成三部分,即:,为对角阵,为下三角矩阵,为上三角矩阵。
之后确定迭代格式,,(, 即迭代次数),称为迭代矩阵。
上机实验报告(精选11篇)

上机实验报告篇1用户名se××××学号姓名学院①实验名称:②实验目的:③算法描述(可用文字描述,也可用流程图):④源代码:(.c的文件)⑤用户屏幕(即程序运行时出现在机器上的画面):2.对c文件的要求:程序应具有以下特点:a可读性:有注释。
b交互性:有输入提示。
c结构化程序设计风格:分层缩进、隔行书写。
3.上交时间:12月26日下午1点-6点,工程设计中心三楼教学组。
请注意:过时不候哟!四、实验报告内容0.顺序表的插入。
1.顺序表的删除。
2.带头结点的单链表的\'插入。
3.带头结点的单链表的删除。
注意:1.每个人只需在实验报告中完成上述4个项目中的一个,具体安排为:将自己的序号对4求余,得到的数即为应完成的项目的序号。
例如:序号为85的同学,85%4=1,即在实验报告中应完成顺序表的删除。
2.实验报告中的源代码应是通过编译链接即可运行的。
3.提交到个人空间中的内容应是上机实验中的全部内容。
上机实验报告篇2一、《软件技术基础》上机实验内容1.顺序表的建立、插入、删除。
2.带头结点的单链表的建立(用尾插法)、插入、删除。
二、提交到个人10m硬盘空间的内容及截止时间1.分别建立二个文件夹,取名为顺序表和单链表。
2.在这二个文件夹中,分别存放上述二个实验的相关文件。
每个文件夹中应有三个文件(.c文件、.obj文件和.exe文件)。
3. 截止时间:12月28日(18周周日)晚上关机时为止,届时服务器将关闭。
三、实验报告要求及上交时间(用a4纸打印)1.格式:《计算机软件技术基础》上机实验报告用户名se××××学号姓名学院①实验名称:②实验目的:③算法描述(可用文字描述,也可用流程图):④源代码:(.c的文件)⑤用户屏幕(即程序运行时出现在机器上的画面):2.对c文件的要求:程序应具有以下特点:a 可读性:有注释。
b 交互性:有输入提示。
计算导论实验报告

一、实验目的1. 理解计算机科学的基本概念,掌握计算的基本原理。
2. 掌握算法设计的基本方法,提高算法分析能力。
3. 熟悉计算机编程语言,能够编写简单的计算程序。
二、实验内容1. 计算导论基础知识2. 算法设计与分析3. 计算机编程实现三、实验步骤1. 计算导论基础知识(1)学习计算机科学的基本概念,如计算机系统组成、信息处理过程、数据结构等。
(2)掌握计算机编程语言的基本语法和常用数据类型。
2. 算法设计与分析(1)学习算法设计的基本方法,如分治法、贪心法、动态规划等。
(2)掌握算法的时间复杂度和空间复杂度的分析方法。
(3)针对实际问题,设计合适的算法,并进行优化。
3. 计算机编程实现(1)选择一种编程语言(如Python、Java、C++等)进行编程。
(2)根据实验要求,编写计算程序,实现算法。
(3)调试程序,确保程序正确运行。
四、实验结果与分析1. 计算导论基础知识(1)掌握了计算机科学的基本概念,如计算机系统组成、信息处理过程、数据结构等。
(2)了解了计算机编程语言的基本语法和常用数据类型。
2. 算法设计与分析(1)学会了分治法、贪心法、动态规划等算法设计方法。
(2)能够分析算法的时间复杂度和空间复杂度。
(3)针对实际问题,设计并实现了高效的算法。
3. 计算机编程实现(1)掌握了编程语言的基本语法和常用数据类型。
(2)能够编写简单的计算程序,实现算法。
(3)通过调试程序,确保程序正确运行。
五、实验心得1. 通过本次实验,我对计算机科学的基本概念有了更深入的了解,认识到计算机科学在现代社会的重要性。
2. 在算法设计与分析方面,我学会了如何根据实际问题设计合适的算法,并分析算法的效率。
3. 在编程实现方面,我提高了自己的编程能力,学会了如何将算法转化为程序,并通过调试程序解决实际问题。
4. 本次实验让我体会到理论与实践相结合的重要性,只有将所学知识应用于实际,才能真正掌握。
六、实验建议1. 在实验过程中,应注重基础知识的学习,为后续实验打下坚实基础。
算法上机实验报告

实验名称:排序算法性能比较实验目的:1. 理解常见的排序算法及其原理。
2. 分析不同排序算法的时间复杂度和空间复杂度。
3. 通过实际编程实现排序算法,并进行性能比较。
实验环境:1. 操作系统:Windows 102. 编程语言:Python3.83. 开发环境:PyCharm实验内容:1. 实现冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序算法。
2. 对随机生成的数据集进行排序,比较不同算法的执行时间和稳定性。
3. 分析不同排序算法在不同数据规模下的性能差异。
实验步骤:1. 实现冒泡排序算法。
2. 实现选择排序算法。
3. 实现插入排序算法。
4. 实现快速排序算法。
5. 实现归并排序算法。
6. 实现堆排序算法。
7. 生成不同规模的数据集,对每个数据集使用上述算法进行排序。
8. 记录每个算法的执行时间,并进行比较。
9. 分析不同排序算法在不同数据规模下的性能差异。
实验结果与分析:一、冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
遍历数列的工作是重复地进行,直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
在数据规模较小的情况下,冒泡排序的性能较好。
二、选择排序选择排序是一种简单直观的排序算法。
它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。
在选择排序中,元素的移动次数较少,因此在某些情况下,选择排序的性能可能优于冒泡排序。
三、插入排序插入排序是一种简单直观的排序算法。
它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。
算法设计与分析上机实习报告

算法设计与分析上机实习报告姓名:学号:指导老师:1.分治法求解棋盘覆盖问题●问题描述:在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
●算法思想:将棋盘分割为4个2k-1×2k-1的子棋盘。
对无特殊方格的3个子棋盘,在靠近中心的位置上各添一个特殊方格,转化为特殊棋盘。
对四个已成特殊子棋盘的棋盘进行同样处理●算法:#include<iostream>#define max 1000using namespace std;int Board[max][max];//最大数组int tile=1;//骨牌号码void ChessBoard(int tr,int tc,int dr,int dc,int size)//tr长,tc宽, dr,dc特殊方格位置,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//方格不在棋盘中{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//方格不在棋盘中{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//方格不在棋盘中{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//方格不在棋盘中{Board[tr+s][tc+s]=t;ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}}int main(){for(int i=0;i<max;i++){for(int j=0;j<max;j++){Board[i][j]=0;}}int n,a,b;cin>>n;cin>>a>>b;a--;b--;//Board[0][0]=0;tile=1;//设置数目为1/*for(int i=0;i<n;i++){for(int j=0;j<n;j++){printf("%3d",Board[i][j]);}cout<<endl;}cout<<endl;*/ChessBoard(0,0,a,b,n);//初始骨牌在左上角,//tr长,tc宽, dr,dc特殊方格位置,size大小for(int i=0;i<n;i++){for(int j=0;j<n;j++){printf("%3d",Board[i][j]);}cout<<endl;}cout<<endl;return 0;}测试数据8*8的棋盘,特殊棋子在(2,2)上,结果为:2. 修改3.1节的算法,找出计算n 个矩阵之积的最少乘法数,并完成添括号过程。
西安电子科技大学算法上机报告

西安电子科技大学(2018年度)算法分析实验报告实验名称:渗透实验班级:1603012*名:**学号:***********实验一:渗透问题(Percolation)一、实验题目使用合并-查找(union-find)数据结构,编写程序通过蒙特卡罗模拟(Monte Carlo simulation)来估计渗透阈值的值。
给定由随机分布的绝缘材料和金属材料构成的组合系统:金属材料占多大比例才能使组合系统成为电导体?给定一个表面有水的多孔渗水地形(或下面有油),水将在什么条件下能够通过底部排出(或油渗透到表面)?科学家们已经定义了一个称为渗透(percolation)的抽象过程来模拟这种情况。
模型:我们使用N×N网格点来模型一个渗透系统。
每个格点或是open格点或是blocked格点。
一个full site是一个open格点,它可以通过一连串的邻近(左,右,上,下)open格点连通到顶行的一个open格点。
如果在底行中有一个full site格点,则称系统是渗透的。
(对于绝缘/金属材料的例子,open格点对应于金属材料,渗透系统有一条从顶行到底行的金属路径,且full sites格点导电。
对于多孔物质示例,open格点对应于空格,水可能流过,从而渗透系统使水充满open格点,自顶向下流动。
)问题:在一个著名的科学问题中,研究人员对以下问题感兴趣:如果将格点以空置概率p 独立地设置为open格点(因此以概率1-p被设置为blocked格点),系统渗透的概率是多少?当p = 0时,系统不会渗出; 当p=1时,系统渗透。
下图显示了20×20随机网格和100×100随机网格的格点空置概率p与渗滤概率。
当N足够大时,存在阈值p*,使得当p <p*,随机N⨯N网格几乎不会渗透,并且当p> p*时,随机N⨯N网格几乎总是渗透。
尚未得出用于确定渗滤阈值p*的数学解。
你的任务是编写一个计算机程序来估计p*。
中国科技大学算法导论_第一次实验报告

快速排序实验报告SA14225010一、题目当输入数据已经“几乎”有序时,插入排序速度很快。
在实际应用中,我们可以利用这一特点来提高快速排序的速度。
当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。
当上层的快速排序调用返回后,对整个数组运行插入排序来完成排序过程。
试证明:这一排序算法的期望时间复杂度为O (nk+nlg(n/k))。
分别从理论和实践的角度说明我们应该如何选择k?二、算法思想当输入数据已经“几乎”有序时,插入排序速度很快。
当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。
当上层的快速排序调用返回后,对整个数组运行插入排序来完成排序过程。
累加k的值,计算出当k为不同值时算法运行的时间,来算出当k大约为什么值时运行的时间最短,并与传统的快速排序算法的运行时间进行比较。
三、实验结果输入100个不同的整数值,选取不同的k的值,观察所用时间四、实验分析理论上看,k的值选取为20到25较好;但是,从实际上来看,当k为50左右时间为39毫秒,最少,但不同的时刻运行后的时间都不相同,而且不同的输入时刻的运行时间也不相同,当数据较大时候,对k 的值的选取有会有所不同,同时不同性能的机器对测试结果也不同,所以对于k值的选取没有固定的数值。
#include<iostream>#include<sys/timeb.h>using namespace std;#define M 40void swap(int * a,int * b){int tem;tem=*a;*a=*b;*b=tem;}int partition(int v[],const int low,const int high){int i,pivotpos,pivot;pivotpos=low;pivot=v[low];for(i=low+1;i<=high;++i){if(v[i]<pivot){pivotpos++;if(pivotpos!=i)swap(v[i],v[pivotpos]);}}v[low]=v[pivotpos];v[pivotpos]=pivot;//cout<<"the partition function is called\n";return pivotpos;}/*void QuickSort(int a[], const int low,const int high) {int item;if(low<high){item=partition(a,low,high);QuickSort(a,low,item-1);QuickSort(a,item+1,high);}}*/void QuickSort(int a[], const int low,const int high) {int item;if(high-low<=M)return;if(low<high){item=partition(a,low,high);QuickSort(a,low,item-1);QuickSort(a,item+1,high);}// cout<<"the QuickSort is called"<<endl;}void InsertSort(int a[],const int low,const int high){int i,j;int tem;for(i=1;i<high+1;++i){tem=a[i];j=i-1;while(j>=0&&tem<a[j]){a[j+1]=a[j];j--;}a[j+1]=tem;}//cout<<"the InsertSort is called"<<endl;}void HybridSort(int a[],const int low,const int high){QuickSort(a,low,high);InsertSort(a,low,high);cout<<"the HybidSort is called"<<endl;}int main(){int i,a[100];//int *a=NULL;long int t;struct timeb t1,t2;/*cout<<"please input the number of the element:"<<endl;cin>>n;a = (int*)malloc(n*sizeof(int));cout<<"please input every element:"<<endl;*/for( i=0; i<100; i++){a[i]=i+10;}//QuickSort(a,0,n-1);ftime(&t1);HybridSort(a,0,99);cout<<" after sorted quickly,the result is"<<endl;for(i=0; i<100; i++){cout<<a[i]<<" ";if(i%10==0)cout<<endl;}cout<<endl;ftime(&t2);t=(t2.time-t1.time)*1000+(litm); /* 计算时间差 */ printf("k=%d 用时%ld毫秒\n",M,t);//cout<<"the memory of array a is free"<<endl;//free(a);cout<<"\n"<<endl;return 0;}。
西安交通大学算法上机实验报告

《计算机算法设计与分析》上机实验报告姓名:班级:学号:日期:2016年12月23日算法实现题3-14 最少费用购物问题★问题描述:商店中每种商品都有标价。
例如,一朵花的价格是2元,一个花瓶的价格是5元。
为了吸引顾客,商店提供了一组优惠商品价。
优惠商品是把一种或多种商品分成一组,并降价销售。
例如,3朵花的价格不是6元而是5元。
2个花瓶加1朵花的优惠价格是10元。
试设计一个算法,计算出某一顾客所购商品应付的最少费用。
★算法设计:对于给定欲购商品的价格和数量,以及优惠价格,计算所购商品应付的最少费用。
★数据输入:由文件input.txt提供欲购商品数据。
文件的第1行中有1个整数B(0≤B≤5),表示所购商品种类数。
在接下来的B行中,每行有3个数C,K和P。
C表示商品的编码(每种商品有唯一编码),1≤C≤999;K表示购买该种商品总数,1≤K≤5;P是该种商品的正常单价(每件商品的价格),1≤P≤999。
请注意,一次最多可购买5*5=25件商品。
由文件offer.txt提供优惠商品价数据。
文件的第1行中有1个整数S(0≤S≤99),表示共有S种优惠商品组合。
接下来的S行,每行的第1个数描述优惠商品组合中商品的种类数j。
接着是j个数字对(C,K),其中C是商品编码,1≤C≤999;K表示该种商品在此组合中的数量,1≤K≤5。
每行最后一个数字P (1≤P≤9999)表示此商品组合的优惠价。
★结果输出:将计算出的所购商品应付的最少费用输出到文件output.txt。
输入文件示例输出文件示例Input.txt offer.txt output.txt2 2 147 3 2 1 7 3 58 2 5 2 7 1 8 2 10解:设cost(a,b,c,d,e)表示购买商品组合(a,b,c,d,e)需要的最少费用。
A[k],B[k],C[k],D[k],E[k]表示第k种优惠方案的商品组合。
offer (m)是第m种优惠方案的价格。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法导论上机报告班级: 1313012学号:姓名: 黄帮振描述一个运行时间为θ(nlgn)的算法给定n个整数的集合S与另一个整数x该算法能确定S中就是否存在两个其与刚好为x的元素。
一、算法分析1、运用归并排序算法归并排序运用的就是分治思想,时间复杂度为θ(nlgn)能够满足题目要求的运行时间。
归并排序的分解部分就是每次将数组划分两个部分,时间复杂度为θ(1)再对已经分解的两个部分再进行分解直到将数组分解成单个元素为止。
解决部分就是递归求解排序子序列,合并部分就是将已经排序的子序列进行合并得到所要的答案,时间复杂度为θ(lgn)。
2、在已经排好序的基础上,对其运用二分查找二分查找算法的时间复杂度为θ(lgn)在题目要求的范围内,二分查找的条件为待查的数组为有序序列。
算法的主要思想为设定两个数low指向最低元素high指向最高元素,然后比较数组中间的元素与待查元素进行比较。
如果待查元素小于中间元素,那么表明查找元素在数组的前半段,反之,如果待查元素大于中间元素,那么表明查找元素在实现优先队列排序算法,需要支持以下操作:INSERT(S,x):把元素x插入到集合S中MAXMUM(S):返回S中具有最大key的元素EXTRACT-MAX(S):去掉并返回S中的具有最大key的元素INCREASE-KEY(S,x,k):将元素x的关键字值增到k。
一、算法原理快速排序采用分治策略,时间复杂度为θ(nlgn),但就是最坏情况下为θ(n2),并且快速排序算法属于原地排序,并不需要开辟空间。
快速排序复杂的步骤为其分解的步骤分解的过程数组A[p、、r]被划分为两个子数组A[p、、q-1]与A[q+1、、r],使得A[p、、q-1]中的每个元素都小于A[q],而A[q]也小于等于A[q+1、、r]中的每个元素。
而在实现的过程总就是选择将A[r]作为基准点进行划分A[p、、r]数组。
二、伪代码QUICKSORT(A,p,r)1 if p < r2 q = PARTITION(A,p,q)3 QUICKSORT(A,p,q-1)4 QUICKSORT(A,q+1,r)PARTITION(A,p,r)1 x = A[r]2 i = p-13 for j = p to r-14 if A[j] x5 i = i+16 exchange A[i] with A[j]7 exchange A[i+1] with A[r]8 return i + 1三、实验总结问题答案:当选取第一个或者最后一个为基准点时,当n个元素相同的时候为最坏情况比较次数为n*(n-1)/2;快速排序比较次数最少为θ(nlgn),,最大的比较次数为θ(n2)。
运用分治的策略将两个已经排好序的序列中,找出第k大的元素且要求时间复杂度为θ(lgm+lgn),其中m与n分别为两个序列的长度。
一、算法原理1最优子结构为:如果最优的加括号的方式将其分解为Ai、、k与Ak+1、、j的乘积则分别对Ai、、k与Ak+1、、j加括号的方式也一定就是最优的。
2定义m[i,j]为计算矩阵Ai、、j所需标量乘法次数的最小值,对于i=j时,矩阵链乘只包含唯一的矩阵Ai,因此不需要做任何标量乘法运算,所以m[i,i]=0;当i<j时利用最优子结构来计算m[i,j]。
3矩阵链乘的递归式4在算法设计的时候需要m数组记录Ai、、j最小相乘次数,s数组记录构造最优解所需要的信息,其记录的k值指出了AiAi+1Aj的最优括号化方案的分割点应在AkAk+1之间。
5 矩阵链乘的时间复杂度为θ(n3)二、伪代码MATRIX-CHAIN-ORDER(p)1、n=p、length-12、Let m[1、、n,1、、n] and s[1、、n-1,2、、n] be new tables3、For i=1 to n4、 M[i,i]=05、for l=2 to n6、 For i=1 to n-l+17、 J=i+l-18、 M[i,j]=无穷9、 For k=i to j-110、 Q=m[i,k]+m[k+1,j]+p(i-1)*p(k)*p(j)11、 If q<m[i,j]12、 M[i,j]=q13、 S[i,j]=k一、算法原理1最优子结构:令X=<x1,x2,、、xm>与Y=<y1,y2,、、、,yn>为两个序列Z=<z1,z2,、、、,zk>为X与Y的任意LCS。
如果xm=yn,则zk=xm=yn且Zk-1就是Xm-1与Yn-1的一个LCS;如果xm≠yn,则zk≠xm意味着Z就是Xm-1与Y的一个LCS;如果xm ≠yn,则zk≠yn意味着Z就是X与Yn-1的一个LCS。
2定义一个b[i,j]指向表项对应计算c[i,j]时所选择的子问题最优解,过程返回表b与表c,c[m,n]保持X与Y的LCS长度。
3LCS的递归式为4LCS的时间复杂度为θ(m+n),b表的空间复杂度为θ(mn)。
二、伪代码LCS-LENGTH(X,Y)1.m=X、length2.n=Y、length3.Let b[1、、m,1、、n] and c[0、、m,0、、n] be new tables4.For i=1 to m5. c[i,0]=06.For j=0 to n7. c[0,j]=08.For i=1 to m9. For j=1 to n一、算法原理1最优子结构令X=<x1,x2,、、xm>与Y=<y1,y2,、、、,yn>为两个序列Z=<z1,z2,、、、,zk>为X与Y的任意最长公共子串。
如果xm=yn,则zk=xm=yn且Zk-1就是Xm-1与Yn-1的一个最长公共子串; 如果xm≠yn,则zk≠xm意味着Z就是Xm-1与Y的一个最长公共子串;如果xm≠yn,则zk≠yn意味着Z就是X与Yn-1的一个最长公共子串。
2定义L[i,j]为以x[i]与y[j]为结尾的相同子串的最大长度,记录着X与Y的最长公共子串的最大长度。
3最长公共子串的递归式4最长公共子串的时间复杂度为θ(mn),空间复杂度为θ(mn)。
二、伪代码getLCString(str1,tr2)len1 = str1、length;len2 = str2、length;maxLen = len1 > len2 ? len1 : len2;for j to maxLenif max[j] > 0Print j + 1for i = maxIndex[j] - max[j] + 1 to maxIndex[j]Print str1[i]三、实验总结要同上述的最长公共子序列进行对比区分她们的不同之处。
也要理解用动态规划求解时的相同之处与不同之处。
一、算法原理1 最优子结构:定义当所给整数全为负数的时候,最大子段与为0,则最大子段与为max{0,a[i]+a[i+1]、、、+a[j]},1≤i≤j≤n2 引入一个辅助数组b,动态规划的分解分为两步:(1)计算辅助数组的值;(2)计算辅助数组的最大值。
辅助数组b[j]用来记录以j为尾的子段以及集合中的最大子段与。
3 最大子段与的递归式一、算法原理1可以由图可知,图中的顶点讲图划分7个阶段,分别了解每个阶段可以有几种可供选择的点,引入f[k]表示状态k到终点状态的最短距离。
最优子结构为当前状态的f[k]由上个状态的f[k-1]与状态k-1到状态k的距离决定决策:当前状态应在前一个状态的基础上获得。
决策需要满足规划方程,规划方程f(k)表示状态k到终点状态的最短距离。
2多段图最短路径的递归式二、伪代码Shortestpathlet indexs [0、、W1[0]、length],isLabel [0、、W1[0]、length] be a new table i_count = -1distance = W1[start]index = startpresentShortest = 0indexs[++i_count] = index;isLabel[index] = true;while i_count<W1[0]、lengthmin = Integer、MAX_VALUE;for i = 0 to distance、lengthif !isLabel[i] and distance[i] != -1 and i != indexif distance[i] < minmin = distance[i]index = iif index == end一、算法原理10-1背包问题:选择n个元素中的若干个来形成最优解,假定为k个。
对于这k个元素a1, a2, 、、、ak来说,它们组成的物品组合必然满足总重量<=背包重量限制,而且它们的价值必然就是最大的。
假定ak就是我们按照前面顺序放入的最后一个物品,它的重量为wk,它的价值为vk。
前面k个元素构成了最优选择,把ak物品拿走,对应于k-1个物品来说,它们所涵盖的重量范围为0-(W-wk)。
假定W为背包允许承重的量,最终的价值就是V,剩下的物品所构成的价值为V-vk。
这剩下的k-1个元素构成了W-wk的最优解。
2分数背包问题:所选择的的贪心策略为按照选择单位重量价值最大的物品顺序进行挑选。
算法的步骤:设背包容量为C共有n个物品物品重量存放在数组W[n]中价值存放在数组V[n]中问题的解存放在数组X[n]中。
第一步,改变数组W与V的排列顺序使其按单位重量价值V[i]/W[i]降序排列,并将数组X[n]初始化为0;第二步初始化i=0,设计一个循环,循环终止条件为W[i]>C,循环体为将第i个物品放入背包,X[i]=1;C=C-W[i];i++最后一步将结果存入到X数组中X[i]=C/W[i]。
3 分数背包问题采用选择单位重量价值最大的物品顺序进行挑选,其算法的时间复杂度为θ(nlgn)。
4 背包问题的递归式:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}二、伪代码Knapsack01(v,w,weight)1.n=w、length2.let c[0、、n,0、、weight] be a new table3.For i=0 to n4. c[i,0]=05.For j=1 to weight6. c[0,j]=0Bellman-Ford算法通过对边进行松弛操作来渐近地降低从源点A到每个结点的最短路径的估计值,直到该估计值与实际的最短路径权重相同为止。
该算法返回TRUE值当且仅当输入图中不包含可以从源结点到达的权重为负值的环路。
Bellman-Ford算法的执行步骤:1、初始化:将除源点外的所有顶点的最短距离估计值d[v]←+∞, d[s]←0;2、迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离,运行|v|-1次;3、检验负权回路,判断边集E中的每一条边的两个端点就是否收敛。