实验实验报告算法思想.docx

上传人:b****1 文档编号:2730078 上传时间:2023-05-04 格式:DOCX 页数:16 大小:22.35KB
下载 相关 举报
实验实验报告算法思想.docx_第1页
第1页 / 共16页
实验实验报告算法思想.docx_第2页
第2页 / 共16页
实验实验报告算法思想.docx_第3页
第3页 / 共16页
实验实验报告算法思想.docx_第4页
第4页 / 共16页
实验实验报告算法思想.docx_第5页
第5页 / 共16页
实验实验报告算法思想.docx_第6页
第6页 / 共16页
实验实验报告算法思想.docx_第7页
第7页 / 共16页
实验实验报告算法思想.docx_第8页
第8页 / 共16页
实验实验报告算法思想.docx_第9页
第9页 / 共16页
实验实验报告算法思想.docx_第10页
第10页 / 共16页
实验实验报告算法思想.docx_第11页
第11页 / 共16页
实验实验报告算法思想.docx_第12页
第12页 / 共16页
实验实验报告算法思想.docx_第13页
第13页 / 共16页
实验实验报告算法思想.docx_第14页
第14页 / 共16页
实验实验报告算法思想.docx_第15页
第15页 / 共16页
实验实验报告算法思想.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验实验报告算法思想.docx

《实验实验报告算法思想.docx》由会员分享,可在线阅读,更多相关《实验实验报告算法思想.docx(16页珍藏版)》请在冰点文库上搜索。

实验实验报告算法思想.docx

实验实验报告算法思想

【关键字】实验

实验报告算法思想

篇一:

实验报告算法思想

  《算法设计与分析》

  实验报告班级姓名学号年月日目录

  实验一二分查找程序实现…………………………………………………………………03

  页

  实验二棋盘覆盖问题(分治法).…………………………………………………………08

  页

  实验三0-1背包问题的动态规划算法设

  计……………………………………………….11页实验四背包问题的贪心算法………………………………………………………………14

  页

  实验五最小重量机器设计问题(回溯法)………………………………………………17

  页

  实验六最小重量机器设计问题(分支限界法)…………………………………………20

  页指导教师对实验报告的评语成绩:

指导教师签字:

  年月日实验一:

二分查找程序实现

  一、实验时间:

XX年10月8日,星期二,第一、二节地点:

j13#328

  2、实验目的及要求目的:

建立算法复杂度的理论分析与实验分析的联系,深刻体会算法复杂度作为算法的好坏评

  价指标的本质含义。

要求:

  1、用c/c++语言实现二分搜索算法。

  2、通过随机产生有序表的方法,测出在平均意义下算法比较次数随问题规模的变化曲线,

  并作图。

  三、实验环境

  平台:

win732位操作系统开发工具:

codeblocks10.05

  四、实验内容

  对已经排好序的n个元素a[0:

n-1],现在要在这n个元素中找出一特定元素x。

  五、算法描述及实验步骤算法描述:

  折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在

  最坏的情况下用o(logn)完成搜索任务。

它的基本思想是,将n个元素分成个数大致相同的

  两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。

如果x  则我们只要在数组a的左半部继续搜索(x这里假设数组元素呈升序排列)。

如果x>a[n/2],

  则我们只要在数组a的右半部继续搜索x。

二分搜索法的应用极其广泛,而且它的思想易于

  理解。

确定算法复杂度基本步骤:

1、首先设定问题规模n;2、随即产生递增数列;

  3、在n个有序数中随机取一个作为待查找量,搜索之;

  4、记录查找过程中的比较次数,再次生成新的有序表并查找,记录查找次数,每个数组

  重复10次;

  5、改变问题规模n重复上述步骤2~4,n取100、200……1000;6、依实验数据作图,

  并与理论图作比较;7、二分搜索算法平均查找次数:

问题规模为n时,平均查找次数为:

  a(n)=int(logn)+1/2//int()函数为向下取整即二分搜索算法对于含有n个数据的有序表l平均作了约int(logn)+1/2次的查找操作。

实验步骤:

  1.初始化生成递增随机数列:

for(intj=100;j  {array[0]=10+rand()%15;for(inti=1;i  2.定义二分查找算法:

  intbinarysearch(constintb[],intsearchkey,intlow,inthigh);其中,返回值为int类型,数组b[]为待查递增序列,searchkey为所查数据,low为数

  组b[]左下标,hight为数组b[]右下标。

该算法实现过程为:

将数组b[]的n个元素分成个数大致相同的两半,取b[n/2]与searchkey作比较。

如果

  searchkey=b[n/2],则找到searchkey,算法终止;如果searchkey  组b的左半部继续搜索searchkey;如果searchkey>b[n/2],则只要在数组b的右半部继

  续搜索searchkey。

  3.实现主函数并完成所有代码。

4.算法复杂性分析:

容易看出,没执行一次算法的while循环,待搜索数组的大小减少一半。

因此,在最坏

  情况下,while循环被执行了o(logn)次。

循环体内运算需要o

(1)时间,因此整个算法

  在最坏情况下的计算时间复杂性为o(logn)。

  六、调试过程及实验结果输出结果为:

篇二:

算法实验报告实

  验

  报

  告课程:

计算机算法分析与设计系科:

计算机科学与技术班

  级:

姓名:

xxxxx学号:

xxxxxxxxxxxxxx年

  度:

XX-XX学期:

上计算机与信息科学学院

  计算机科学实验教学中心篇三:

算法实验报告重庆交通大学学生实验报告实验课程名称算法设计与分析开课实验室数学实验室

  学院数学与统计学院年级13专业班信息与计算科学2学生姓名

  辜朕圆学号0223开课时间XX至XX学年第

  1学期XX-XX学年第一学期实验报告题目实验一递归与分治策略开课实验室:

数学实验室指导老师:

韩逢庆时间:

XX.9学院:

  理学院专业:

信息与计算科学班级:

XX级2班姓名:

辜朕圆学号:

0223

  一、实验目的

  1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;

  2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识

  解决实际问题的能力。

2、实验内容题目①设a[0:

n-1]是已排好序的数组。

请写二分搜索算法,使得当搜索元素x不在数

  组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。

当搜索元素在数组中时,

  i和j相同,均为x在数组中的位置。

②写出三分搜索法的程序。

三、实验要求

  

(1)用分治法求解…问题;

(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;

  四、实验过程设计(算法设计过程)

  1、已知a[0:

n-1]是一个已排好序的数组,可以采用折半查找(二分查找)算法。

如果

  搜索元素在数组中,则直接返回下表即可;否则比较XX-XX学年第一学期搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的

  最大元素的位置i和大于x的最小元素位置j。

2、先判定输入的数x是否在数组的范围内,

  再将n个元素分成大致相同的三部分,取在数组a的左三分之一部分中继续搜索x。

如果

  x>a[san2],则只需在数组a的右三分之一部分中继续搜索x。

上述两种情况不成立时,

  则在数组中间的三分之一部分中继续搜索x。

五、实验结果分析

  

(1)例子为数组a[1,2,3,4,5,6,7,8,9],n=9,x=9。

实验结果为

  

(2)例子为数组a[1,2,3,4,5],x=3,n=5。

实验结果为

  时间复杂性:

最好情况下,最坏情况下二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为o(logn)。

(n代表集合中元素

  的个数)三分搜索法:

o(3log3n)空间复杂性分析:

o

(1)。

  六、实验体会

  本次试验解决了二分查找和三分查找的问题,加深了对分治法的XX-XX学年第一学期理解,收获很大,同时我也理解到学习算法是一个渐进的过程,算法可能一开始不是很

  好理解,但是只要多看几遍,再实践操作,毕竟实践是检验真理的唯一标准,只要动手就能

  感受自己写出算法的喜悦,从而良性循环越学越好。

七、附录:

(源代码)

  

(1)publicstaticintbinarysearch(inta[],intx,intn){

  intleft=0;intright=n-1;inti,j;while(left  if(x>a[middle])left=middle+1;elseright=middle-1;}i=right;j=left;return0;}1;}

  

(2)

  publicclasssanfen{

  publicstaticintsansearch(int[]a,intx,intn){intleft=0;intright=n-1;while(right>left){if(xa[right]){;break;}

  intsan1=(left+right)/3;intsan2=2*(left+right)/3;if(x==a[san1]){

  ;returnsan1;}elseif(xa[san2])left=san1+1;XX-XX学年第一学期else{left=san1;right=fan2;}}}}

  publicstaticvoidmain(string[]args){}sanfens=newsanfen();int[]b={1,2,3,4,5};s.sansearch(b,3,5);return-1;实验二动态规划

  一、实验目的

  1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;

  2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解

  决实际问题的能力。

2、实验内容

  

(1)设计一个o(n)时间的算法,找出由n个数组成的序列的最长单调递增子序列

  

(2)考虑下面的整数线性规划问题:

maxi?

12

  ?

cj

  n

  ii

  ,i?

1

  ?

ax

  n

  ii

  ?

bxi为非负整数,1  

(1)用动态规划思想求解最优问题;

  

(2)再选择自己熟悉的程序设计语言实现所有算法;(3)分析所设计的算法的时间/

  空间复杂性。

  XX-XX学年第一学期篇四:

算法实验报告《算法分析与设计》上机实验报告姓名:

郑翔

  学号:

  班级:

软件三班1XX5031108

  一、上机实验题目

  上机实验一递归算法的设计与实现

  1.计算整数的非负整数次幂

  2.基于递归算法的插入排序上机实验二递归算法的实现

  1.自然归并算法的设计与实现

  2.快速排序算法的设计与实现上机实验三贪心算法的实现

  1.背包问题的设计与实现

  2.单源点最短路径问题的设计与实现

  2、算法设计思路

  上机实验一递归算法的设计与实现

  1.计算整数的非负整数次幂

  2.基于递归算法的插入排序

  三、源程序代码

  上机实验一递归算法的设计与实现

  1.计算整数的非负整数次幂#includeusingnamespacestd;intpower(intx,intn){

  inty;if(n==0)

  y=1;

  else{

  y=power(x,n/2);

  y=y*y;

  if(n%2==1)

  y=y*x;

  }

  returny;

  }

  intmain()

  {

  intx,n;intsum=0;

  cout>x>>n;sum=power(x,n);

  cout  2.基于递归算法的插入排序#include#include#includeusingnamespacestd;

  voidinsertionsort(int*a,intitem,intsize){if(size==0)

  a[0]=item;

  else

  {

  for(inti=size-1;i>=0;i--){if(item  a[i+1]=a[i];

  else

篇二:

算法实验报告

  重庆交通大学学生实验报告

  实验课程名称算法设计与分析开课实验室数学实验室

  学院数学与统计学院年级13专业班信息与计算科学2学生姓名辜朕圆学号0223开课时间XX至XX学年第1学期

  XX-XX学年第一学期

  实验报告题目实验一递归与分治策略

  开课实验室:

数学实验室指导老师:

韩逢庆时间:

XX.9学院:

理学院专业:

信息与计算科学班级:

XX级2班

  姓名:

辜朕圆学号:

0223

  一、实验目的

  1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;

  2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

2、实验内容

  题目①设a[0:

n-1]是已排好序的数组。

请写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。

当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

  ②写出三分搜索法的程序。

三、实验要求

  

(1)用分治法求解…问题;

  

(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)

  1、已知a[0:

n-1]是一个已排好序的数组,可以采用折半查找(二分查找)算法。

如果搜索元素在数组中,则直接返回下表即可;否则比较

  XX-XX学年第一学期

  搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的最大元素的位置i和大于x的最小元素位置j。

2、先判定输入的数x是否在数组的范围内,再将n个元素分成大致相同的三部分,取在数组a的左三分之一部分中继续搜索x。

如果x>a[san2],则只需在数组a的右三分之一部分中继续搜索x。

上述两种情况不成立时,则在数组中间的三分之一部分中继续搜索x。

五、实验结果分析

  

(1)例子为数组a[1,2,3,4,5,6,7,8,9],n=9,x=9。

  实验结果为

  

(2)例子为数组a[1,2,3,4,5],x=3,n=5。

  实验结果为

  时间复杂性:

最好情况下,最坏情况下

  二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为O(logn)。

(n代表集合中元素的个数)三分搜索法:

O(3log3n)空间复杂性分析:

O

(1)。

  六、实验体会

  本次试验解决了二分查找和三分查找的问题,加深了对分治法的

  XX-XX学年第一学期

  理解,收获很大,同时我也理解到学习算法是一个渐进的过程,算法可能一开始不是很好理解,但是只要多看几遍,再实践操作,毕竟实践是检验真理的唯一标准,只要动手就能感受自己写出算法的喜悦,从而良性循环越学越好。

七、附录:

(源代码)

  

(1)publicstaticintbinarySearch(inta[],intx,intn)

  {

  intleft=0;intright=n-1;inti,j;while(left  intmiddle=(left+right)/2;

  if(x==a[middle]){i=j=middle;"getit");returnif(x>a[middle])left=middle+1;elseright=middle-1;}

  i=right;j=left;return0;}

  1;}

  

(2)

  publicclasssanfen{

  publicstaticintsanSearch(int[]a,intx,intn){

  intleft=0;intright=n-1;while(right>left){

  if(xa[right])

  {"根本不在数组里");break;}

  intsan1=(left+right)/3;intsan2=2*(left+right)/3;if(x==a[san1])

  {

  "找到了");returnsan1;}

  elseif(xa[san2])left=san1+1;

  XX-XX学年第一学期

  else{left=san1;right=fan2;}}}

  }

  publicstaticvoidmain(String[]args){}

  sanfens=newsanfen();int[]b={1,2,3,4,5};s.sanSearch(b,3,5);return-1;

  实验二动态规划

  一、实验目的

  1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;

  2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

2、实验内容

  

(1)设计一个O(n)时间的算法,找出由n个数组成的序列的最长单调递增子序列

  

(2)考虑下面的整数线性规划问题:

maxi?

1

  2

  ?

cj

  n

  ii

  ,i?

1

  ?

ax

  n

  ii

  ?

b

  xi为非负整数,1  析算法的计算复杂性。

三、实验要求

  

(1)用动态规划思想求解最优问题;

  

(2)再选择自己熟悉的程序设计语言实现所有算法;(3)分析所设计的算法的时间/空间复杂性。

  XX-XX学年第一学期

篇三:

算法实验报告

  华北电力大学

  |

  |

  |

  |

  实验报告实验名称课程名称

  实验一矩阵连乘11

  一、实验目的

  熟悉动态规划算法设计思想和设计步骤,掌握基本的程序设计方法,培养学生用计算机解决实际问题的能力。

  2、实验要求:

  1、用动态规划算法解矩阵连乘问题

  

(1)问题的描述

  给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…,n-1。

要算出这n个矩阵的连乘积A1A2…An。

由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。

这种计算次序可以用加括号的方式来确定。

若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。

完全加括号的矩阵连乘积可递归地定义为:

(1)单个矩阵是完全加括号的;

(2)矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。

例如,矩阵连乘积A1A2A3A4有5种不同的完全加括号的方式:

(A1(A2(A3A4))),(A1((A2A3)A4)),((A1A2)(A3A4)),((A1(A2A3))A4),(((A1A2)A3)A4)。

每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。

若A是一个p×q矩阵,B是一个q×r矩阵,则计算其乘积C=AB的标准算法中,需要进行pqr次数乘。

为了说明在计算矩阵连乘积时,加括号方式对整个计算量的影响,先考察3个矩阵{A1,A2,A3}连乘的情况。

设这三个矩阵的维数分别为10×100,100×5,5×50。

加括号的方式只有两种:

((A1A2)A3),(A1(A2A3)),第一种方式需要的数乘次数为10×100×5+10×5×50=7500,第二种方式需要的数乘次数为100×5×50+10×100×50=75000。

第二种加括号方式的计算量时第一种方式计算量的10倍。

由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大的影响。

于是,自然提出矩阵连乘积的最优计算次序问题,即对于给定的相继n个矩阵{A1,A2,…,An}(其中矩阵Ai的维数为pi-1×pi,i=1,2,…,n),如何确定计算矩阵连乘积A1A2…An的计算次序(完全加括号方式),使得依此次序计算矩阵连乘积需要的数乘次数最少。

穷举搜索法的计算量太大,它不是一个有效的算法,本实验采用动态规划算法解矩阵连乘积的最优计算次序问题。

  

(2)算法设计思想

  动态规划算法的基本思想是将待求解问题分成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,动态规划法经分解得到的

子问题往往不是相互独立的,前一子问题的解为后一子问题的解提供有用的信息,可以用一个表来记录所有已解决的子问题的答案,不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。

本实验的算法思路是:

1、计算最优值算法MatrixChain():

建立两张表(即程序中的**m和**s,利用二维指针存放),一张

  表存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵、3个矩阵…、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为n个矩阵相乘的最小运算量;另

  一张表存储最优断开位置。

2、输出矩阵结合方式算法Traceback():

矩阵结合即是给矩阵加括号,打印出矩阵结合方式,由递归过程Traceback()完成。

分三种情况:

(1)只有一个矩阵,则只需打印出A1;

(2)有两个矩阵,则需打印出(A1A2);(3)对于矩阵数目大于2,则应该调用递归过程Traceback()两次,构造出最优加括号方式。

  三、实验仪器及设备

  visualstudioXX。

  四、程序设计

  #include"stdafx.h"

  #include

  usingnamespacestd;

  constintMAX=100;

  //p用来记录矩阵的行列,main函数中有说明

  //m[i][j]用来记录第i个矩阵至第j个矩阵的最优解

  //s[][]用来记录从哪里断开的才可得到该最优解

  intp[MAX+1],m[MAX][MAX],s[MAX][MAX];

  intn;//矩阵个数

  intmatrixChain()

  {

  for(inti=0;i  m[i][i]=0;

  for(intr=2;r  for(inti=0;i  {

  intj=r+i-1;//列的控制

  //找m[i][j]的最小值,先初始化一下,令k=i

  m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j+1];

  s[i][j]=i;

  //k从i+1到j-1循环找m[i][j]的最小值

  for(intk=i+1;k  {

  inttemp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];

  if(temp  {

  m[i][j]=temp;

  //s[][]用来记录在子序列i-j段中,在k位置处

  //断开能得到最优解

  s[i][j]=k;

  }

  }

  }

  returnm[0][n-1];

  }

  //根据s[][]记录的各个子段的最优解,将其输出

  voidtraceback(inti,intj)

  {

  if(i==j)

  {

  cout  return;

  }

  if(i  cout  traceback(i,s[i][j]);

  if(i  cout  if(s[i][j]+1  cout  traceback(s[i][j]+1,j);

  if(s[i][j]+1  cout  }

  voidtraceback(){

  cout  traceback(0,n-1);

  cout  cou

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2